【问题标题】:Place sql method in seperate class and return multiple stringsPl sql方法在单独的类中并返回多个字符串
【发布时间】:2013-06-24 23:03:49
【问题描述】:

我有在单击按钮时执行的代码。 它连接到一个 sql 数据库并读取两个值。 我想要实现的只是将此代码放在一个名为“DataManager”的单独类中,然后从我的按钮单击调用该类中的一个方法并将两个字符串放入我的文本框中。

string sReference = txtReference.Text;

SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ToString());
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_SELECT_CONSHEAD_BY_ENQUIRY_NUMBER";
cmd.Parameters.AddWithValue("@EnquiryNumber", sReference);                        
cmd.Connection = con;
con.Open();
SqlDataReader sdr = cmd.ExecuteReader();

while (sdr.Read())
{
    txtAccount.Text = sdr["Consignee"].ToString();
    txtAccount_Printed.Text = sdr["Consignee_Printed"].ToString();
}

con.Close();
con.Dispose();

我在想我的方法应该是这样的

// Select from ConsHead by Reference Number
    public string SelectConsHead(string sReference, out string sAccount, out string sAccount_Printed)
    {
        sAccount_Printed = "";
        sAccount = "";
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ToString());
        SqlCommand cmd = new SqlCommand();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "sp_SELECT_CONSHEAD_BY_ENQUIRY_NUMBER";
        cmd.Parameters.AddWithValue("@EnquiryNumber", sReference);
        // Attach connection to command
        cmd.Connection = con;
        con.Open();
        SqlDataReader sdr = cmd.ExecuteReader();

        while (sdr.Read())
        {
            sAccount = sdr["Consignee"].ToString();
            sAccount_Printed = sdr["Consignee_Printed"].ToString();
        }
        con.Close();
        con.Dispose();


        return sAccount + sAccount_Printed;

    }

但我不确定如何调用该方法并将相应的值检索到文本框中。

【问题讨论】:

    标签: c# string class methods


    【解决方案1】:

    答案会因您使用的是 ASP.NET Web 应用程序还是 Windows 窗体应用程序而异。

    我可以基于 ASP.NET 来回答。

    首先,您的 DataManager 类中的 SelectConsHead 方法需要是静态的,或者您需要使用按钮和文本框在页面的代码隐藏中创建 DataManager 类的新实例。如果你走静态路线,你的方法标题将如下所示:

    public static string SelectConsHead
    

    然后在带有按钮和文本框的页面的代码隐藏中,您将在按钮的单击事件处理程序中调用 SelectConsHead 方法。

    如果您采用非静态路线,以下是您将如何实例化您的类并在代码隐藏中调用其方法:

    DataManager dm = new DataManager();
    dm.SelectConsHead(your parameters here);
    

    另外,你应该听取 Ronnie 的建议来修改你的方法。

    【讨论】:

      【解决方案2】:

      您应该避免在方法定义中使用 out 参数。它们没有被使用,因为您无论如何都返回了 account 和 account_printed 字符串的串联,因此您的方法签名应该如下所示:

       public string SelectConsHead(string sReference)
      

      ...因此您需要声明本地字符串变量,例如:

      var sAccount_Printed = "";
      var sAccount = "";
      

      您还应该考虑为什么要在字符串变量名称前加上“s”前缀,因为许多人认为这是不好的做法。有关 Microsoft 的编码指南,请参阅此链接:

      http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx

      如果您的类称为 DataManager,则需要实例化该类才能调用您的方法(因为它不是静态的)。例如:

      var sReference = // some code here to get sReference.
      var dm = new DataManager();
      var consHead = dm.SelectConsHead(sReference);
      

      另一个好的做法是倾向于使用“使用”语句而不是手动打开和关闭 SqlConnection。见这里:

      The C# using statement, SQL, and SqlConnection

      为了在文本框中打印结果,假设你正在构建一个 windows 窗体应用程序,你需要知道文本框的 id,然后你可以像这样填充它(这里文本框的 id 是'myTextBox '):

      myTextBox.Text = consHead;
      

      【讨论】:

      • 不错的答案。我唯一建议的是使用 DTO 作为返回值来满足同时返回多个值的需求。
      • 关于将结果打印到文本框的最后一点,只有一个问题。我在 consHead 中得到两个值,你说我应该像“myTextBox.Text = consHead;”一样填充文本框,但这并不能告诉文本框应该填充两个值中的哪一个。
      • 你的行“return sAccount + sAccount_Printed;”将返回一个值(两个字符串的连接)。如果您需要分别返回两个值,请按照 Terence 的建议创建另一个类。这个类可能被称为“AccountDto”或类似的东西,并且应该包含两个属性,一个用于每个值。然后,您需要在 SelectConsHead 方法中创建此 Dto 的实例,设置其属性,然后返回它而不是返回字符串,而不是返回字符串(请注意,这将需要您更新方法定义)。然后通过 dto 的属性访问这些值。
      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 2023-03-03
      • 2017-08-20
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2018-09-15
      • 2012-07-04
      相关资源
      最近更新 更多