2013-07-14 89 views
1

我有以下方法和存儲過程。從SQL Server存儲過程返回字符串值

我的問題是如何從存儲過程返回字符串值以使用addStaffName方法?

public string addStaffName() 
{ 
     string staffName = string.Empty; 
     string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString(); 
     SqlConnection SqlCOn = new SqlConnection(sConnectionString); 
     SqlCommand SqlCmd = new SqlCommand(); 

     SqlCOn.Open(); 
     SqlCmd.Connection = SqlCOn; 
     SqlCmd.CommandType = CommandType.StoredProcedure; 
     SqlCmd.CommandText = "FetchStaffName"; 
     SqlCmd.Parameters.AddWithValue("email", email); 
     //??? 
     return staffName; 
    } 

create procedure fetchStaffName 
    @email varchar(100) 
AS 
begin 
    select (employeeName) 
    from employee 
    where email = @email 
end 

回答

2

如果你可以肯定的是you'llonly曾經得到一行,一列作爲結果集 - 那麼你可以在你的SqlCommand使用.ExecuteScalar()這樣的:

string staffName = string.Empty; 

string sConnectionString = ConfigurationManager.ConnectionStrings["LGDB"].ToString(); 

using (SqlConnection sqlCon = new SqlConnection(sConnectionString)) 
using (SqlCommand sqlCmd = new SqlCommand("FetchStaffName", sqlCon) 
{ 
    sqlCmd.CommandType = CommandType.StoredProcedure; 
    sqlCmd.Parameters.AddWithValue("@email", email); 

    sqlCon.Open(); 

    staffName = sqlCmd.ExecuteScalar().ToString(); 

    sqlCon.Close(); 

    return staffName; 
} 

我也將SqlConnectionSqlCommand的用法應用到using() { ... }區塊中,這是IDisposable派生的任何物品的推薦最佳實踐,以確保物品在使用後妥善處置

+0

非常感謝你,很好的建議,我不能投票給你,因爲我在這裏新! – Iatrochemist

+0

但如果我想從存儲過程得到兩列,會怎樣? – Iatrochemist

+0

@AlirezaX:那麼你需要使用'.ExecuteReader()'並且你得到一個'SqlDataReader'。因此,您可以閱讀任意數量的列和任意數量的行,並將結果粘貼到您選擇的對象中 –

1

考慮使fetchStaffName成爲標量函數而不是存儲過程。根據定義,存儲過程需要用數據執行一組操作。標量函數保證輸入值集合只有一個輸出值。

CREATE FUNCTION fetchStaffName (
@email VARCHAR(100) 
) 
RETURNS VARCHAR(?) --Place the length of employeeName field instead of ? symbol. 
BEGIN 
    RETURN (SELECT employeeName FROM employee WHERE email = @email) 
END 

然後你的.NET代碼轉換爲以下幾點:

using (SqlConnection SqlCOn = new SqlConnection(sConnectionString)) 
{ 
    SqlCommand SqlCmd = new SqlCommand("SELECT fetchStaffName(@email)", SqlCOn); 
    SqlCmd.CommandType = CommandType.Text; 
    SqlCmd.Parameters.AddWithValue("@email", email); 

    SqlCOn.Open(); 
    staffName = (string)SqlCmd.ExecuteScalar(); 
} 

正如你可以看到從CommandType改變StoredProcedureText。我還將SqlConnection對象的工作封裝到using構造中來處理其資源並自動關閉。

+0

感謝Ivan,如果我想要返回多個結果,該怎麼辦? – Iatrochemist

+0

有幾種方法可以這樣做。您可以使用具有多個輸出參數的存儲過程(稍微不同的.NET和T-SQL語法)。你也可以在存儲過程中選擇一個包含多列的行,然後使用SqlCommand的ExecuteReader()方法。有關詳情,請創建一個新問題。 – Ivan

+0

感謝您的回答 – Iatrochemist

相關問題