如何从存储过程中获取 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 服务器中?