2013-06-27 14 views
0

我有一個按鈕單擊執行的代碼。 它連接到一個sql數據庫並讀取兩個值。 我想要實現的是將這些代碼放在一個名爲'DataManager'的單獨的類中,然後從我的按鈕中單擊調用此類中的方法,並將兩個字符串放入我的文本框中。在獨立類中放置sql方法並返回多個字符串

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; 

    } 

,但我不知道如何調用該方法,並獲取相應的值到文本框。

回答

3

您應該避免在方法定義中使用out參數。他們因爲要退回賬戶的串聯不被使用和account_printed字符串無論如何,所以你的方法簽名應該是這樣的:

public string SelectConsHead(string sReference) 

...,因此,你需要聲明本地字符串變量,如:

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

你也應該考慮你爲什麼用「s」的前綴字符串變量的名字,因爲這是由許多人認爲是不好的做法。對於微軟的編碼規則,請參見以下鏈接:

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時使用'using'語句。在這裏看到:

The C# using statement, SQL, and SqlConnection

爲了打印出結果在一個文本框,假設你正在構建一個Windows窗體應用程序,你需要知道的文本框的ID,然後你就可以填充它像這樣(這裏的文本框的ID爲「myTextBox」):

myTextBox.Text = consHead; 
+0

不錯的答案。我只會建議使用DTO作爲返回值來迎合同時返回多個值。 – Terence

+0

關於將結果打印到文本框的最後一點,只是一個問題。我在consHead中獲得了兩個值,並且你說我應該填充TextBox,如'myTextBox.Text = consHead;',但是這個dos不會告訴文本框應該填充兩個值中的哪一個。 –

+0

您的線路「return sAccount + sAccount_Printed;」將返回一個值(兩個字符串的連接)。如果您需要分別返回兩個值,請按照Terence的建議創建另一個班級。這個類可能被稱爲'AccountDto'或類似的東西,並且應該包含兩個屬性,每個屬性一個。然後,而不是返回一個字符串,你需要在SelectConsHead方法內部創建一個Dto的實例,設置它的屬性,並返回它而不是一個字符串(注意這需要你更新你的方法定義)。然後通過dto的屬性訪問這些值。 – Ronnie

1

答案會根據是否你與ASP.NET Web應用程序的工作或Windows窗體應用程序。

我可以基於ASP.NET進行回答。

首先,您的DataManager類中的SelectConsHead方法需要是靜態的,或者需要使用按鈕和文本框在頁面的代碼後面創建DataManager類的新實例。如果你去的靜態路由,你的方法標題看起來就像這樣:

public static string SelectConsHead 

然後與你的按鈕和文本框的頁面的代碼隱藏,你會調用SelectConsHead方法的單擊事件處理程序的按鈕。

如果你非靜態路由,這裏是你將如何instatiate你的類並調用它的方法在隱藏代碼:

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

此外,你應該採取羅尼的建議在修改你的方法。