【问题标题】:Return a string Value from SQL Server stored procedure从 SQL Server 存储过程返回字符串值
【发布时间】:2013-07-14 15:44:19
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net sql-server stored-procedures webforms


    【解决方案1】:

    如果您可以确定您只会得到一行,一列作为结果集 - 那么您可以在您的 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 派生的任何东西的推荐最佳做法,以确保在使用后正确处理对象

    【讨论】:

    • 非常感谢你,好建议,我不能投票给你,因为我是新来的!
    • 但是如果我想从存储过程中获取两列结果呢?
    • @AlirezaX:那么你需要使用.ExecuteReader(),你会得到一个SqlDataReader。有了它,您可以读取任意数量的列和任意数量的行,并将结果粘贴到您选择的对象中
    【解决方案2】:

    考虑将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();
    }
    

    如您所见,CommandTypeStoredProcedure 更改为 Text。我还将使用 SqlConnection 对象的工作包装到 using 构造中,以释放其资源并自动关闭。

    【讨论】:

    • 有几种方法可以做到这一点。您可以使用具有多个输出参数的存储过程(.NET 和 T-SQL 语法略有不同)。您还可以在存储过程中选择包含多列的行,然后使用 SqlCommand 的 ExecuteReader() 方法。有关详细信息,请创建一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2020-10-10
    • 1970-01-01
    相关资源
    最近更新 更多