如何从存储过程中获取 SQL 字符串结果并将其保存在 C# Windows 应用程序字符串变量中

Posted

技术标签:

【中文标题】如何从存储过程中获取 SQL 字符串结果并将其保存在 C# Windows 应用程序字符串变量中【英文标题】:How to get SQL String Result from Stored Procedure and save it in C# Windows Application string variable 【发布时间】:2013-05-09 17:53:09 【问题描述】:

我有以下存储过程:

ALTER PROCEDURE [dbo].[ProcedureName] 

    @date NVARCHAR(50)

AS

BEGIN

    SET NOCOUNT ON;

    DECLARE @result nvarchar(500) -- this one should return string.

    DECLARE @variable1 NVARCHAR(50)
    set @variable1 = (SELECT COUNT(*) FROM dbo.Table1 WHERE column1 not in (select column1 from dbo.Table2))

    DECLARE @variable2 NVARCHAR(50)
    update dbo.Table1 set columnX = 1 where column1 not in (select column1 from  dbo.Table2)

    set @variable2 = @@ROWCOUNT

等等......它继续像 200 行脚本一样,至少有 10-12 个变量

之后我想得到这样的结果

'Hello,' + 

'Some Text here' + 

@date +': ' + 

'Explaining text for variable1- ' + @variable1 + 

'Updated rows from variable2 - ' + @variable2 + 

'some other select count - ' + @variable3 +

'some other update rowcount - '+ @variable4

......

到现在为止,我可以使用 PRINT 语句得到这个,但不能把它带到我的 C# 代码中的变量,如下所示:

public void Execute_Click(object sender, EventArgs e)

    if (MessageBox.Show("Are you sure you want to execute the program?", "Confirm Start", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.No)
    
        string connectionString = GetConnectionString(usernamePicker.Text, passwordPicker.Text);
        using (SqlConnection connection = new SqlConnection(connectionString))
        
            using (SqlCommand cmd = new SqlCommand("dbo.ProcedureName", connection))
            
                connection.Open();
                cmd.CommandText = "dbo.ProcedureName";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@date", SqlDbType.VarChar).Value = dateTimePicker1.Text;

                SqlParameter result = cmd.Parameters.Add("@result", SqlDbType.VarChar);
                result.Direction = ParameterDirection.ReturnValue;

                cmd.ExecuteScalar();
                var resultout = (string)cmd.Parameters["@result"].Value;
                connection.Close();
                TextMessage.Text = dateTimePicker1.Text;
            
        
    

我得到的结果是 0 或 NULL 等。 我尝试使用 PRINT、RETURN、SET、OUTPUT 从 SQL 返回值......但似乎没有任何效果。然而,从 C# 到 SQL 获取变量似乎是孩子的工作。有什么想法吗?

【问题讨论】:

您是否在过程结束时运行选择以返回值? 您可以使用输出变量来分配多个变量的值 看看Input/Output parameters and Return Value有没有返回一些要放在@result参数中的东西? 我正在将最终字符串 'Hello' + ....... 分配给结果变量,但我不知道如何像程序中的某种消息一样输出它 【参考方案1】:

如果你想将连接字符串作为输出返回,那么在过程的最后只写select @result。确保在此语句之前已将其连接起来。

这将返回您可以在 C# 代码中作为字符串使用的字符串。

【讨论】:

我确实在过程结束时选择了@result,但是当我运行 C# 时,我得到这个:无法将类型为“System.Int32”的对象转换为类型“System.String”。我试图用: var resultout = (string)cmd.Parameters["@result"].Value;在 cmd.ExecuteScalar() 之后;但是 cmd.Parameters["@result"].Value 又是 0 尝试字符串 str=cmd.ExecuteScalar();您不需要访问输出参数。 您可以从您的 SP 中删除这些输出参数。该存储过程将直接返回字符串。 string str = (string)cmd.ExecuteScalar();那完成了工作,非常感谢。我在这一点上被困了两天......【参考方案2】:

好吧,假设我做了这个程序

ALTER PROCEDURE [dbo].[ProcedureName] 

    @date NVARCHAR(50),
    @result nvarchar(500) output
AS

BEGIN

    SET NOCOUNT ON;


    DECLARE @variable1 NVARCHAR(50)
    set @variable1 = (SELECT COUNT(*) FROM dbo.Table1 WHERE column1 not in (select column1 from Table2))
    set @result = @variable1 + ' some text '

我希望“@result”从过程中输出文本并使用 C# 获取它

【讨论】:

【参考方案3】:

将您的存储过程更改为:

ALTER PROCEDURE [dbo].[ProcedureName] 

    @date NVARCHAR(50),
    @variable1 NVARCHAR(50) output,
    @variable2 NVARCHAR(50) output

AS

BEGIN

    SET NOCOUNT ON;

    DECLARE @result nvarchar(500) -- this one should return string.

    set @variable1 = (SELECT COUNT(*) FROM dbo.Table1 WHERE column1 not in (select column1 from dbo.Table2))

    update dbo.Table1 set columnX = 1 where column1 not in (select column1 from  dbo.Table2)

    set @variable2 = @@ROWCOUNT

并像这样修改您的代码:

SqlParameter result1 = cmd.Parameters.Add("@variable1", SqlDbType.VarChar);
result1.Direction = ParameterDirection.ReturnValue;

SqlParameter result2 = cmd.Parameters.Add("@variable2", SqlDbType.VarChar);
result2.Direction = ParameterDirection.ReturnValue;

【讨论】:

我已经这样做了,但是当我执行过程时出现异常,例如:过程或函数“ProcedureName”需要参数“@result”,但未提供。 当程序需要@result 作为参数时会发生这种情况,但在您的查询和我的查询中都没有,所以它当然不应该发生!检查您的查询并删除@result,如果不需要,或者使用实际的实时查询编辑您的帖子,请:)

以上是关于如何从存储过程中获取 SQL 字符串结果并将其保存在 C# Windows 应用程序字符串变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 表中读取图像数据(存储 word 文档)并将其保存到本地文件夹

如何拆分/解析 JSON 数据并将其保存到 SQL 服务器中?

如何分离从表行中获取的值并将其存储在雪花中的数组中

如何从 Javascript 提示框中获取值并将其传递给 PHP 变量以便能够保存在 SQL 中?

如何获取网页内容并将其保存到字符串变量中

如何从 JTextField 获取字符串并将其保存在变量中的更新?