1

我有以下方法和存储过程。

我的问题是如何从存储过程返回一个字符串值以在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
4

2 回答 2

2

如果您可以确定您只会得到一行、一列作为结果集 - 那么您可以.ExecuteScalar()SqlCommand这样使用:

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;
}

我还将使用SqlConnectionandSqlCommand放入using() { ... }块中,这是推荐的最佳实践,IDisposable以确保在使用后正确处理对象

于 2013-07-14T15:56:50.613 回答
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构造中,以释放其资源并自动关闭。

于 2013-07-14T16:25:31.017 回答