gpt4 book ai didi

sql-server - 尝试从存储过程加载第二个结果集

转载 作者:行者123 更新时间:2023-12-02 22:52:33 26 4
gpt4 key购买 nike

我有一个客户设置,它使用存储过程从其 SQL Server 数据库返回数据。

这些存储过程都是以相同的方式构建的 - 它们接受一堆输入参数,然后返回:

  • 第一个只是单行单列,带有结果代码(类型 INT) - 0 表示成功,否则为其他一些值;如果值为 0,则有第二个结果集包含实际数据

  • 第二个结果集可以是任何内容 - 任意数量的列和行

我正在尝试创建一种与该系统交互的“通用”方式,我的尝试是:

  • 创建一个采用存储过程名称和输入参数的类
  • 包含 ErrorCode INT 属性和 DataTable results 属性的返回类型

但是,我无法使其与 ADO.NET 和 SQL Server 2008 R2 一起使用。

我的代码归结为:

public MyResultType CallService(string procedureName, MyParameters parameters)
{
MyResultType result = new MyResultType { ErrorCode = 0 };

using (SqlConnection conn = new SqlConnection(_connectionString))
using (SqlCommand cmd = new SqlCommand(procedureName, conn))
{
cmd.CommandType = CommandType.StoredProcedure;
SetupParameters(cmd, parameters);

// open connection, execute the stored procedure
conn.Open();

using (SqlDataReader rdr = cmd.ExecuteReader())
{
// get the first result set - the status code, one row, one column of type INT
while (rdr.Read())
{
result.ErrorCode = rdr.GetInt32(0);
}

// if we got a "0" (success) -> go to the next result set and load it into the table
if(result.ErrorCode == 0 && rdr.NextResult())
{
result.ResultTable = new DataTable();
result.ResultTable.Load(rdr);

int colCount = result.ResultTable.Columns.Count;
int rowCount = result.ResultTable.Rows.Count;
}

rdr.Close();
}

conn.Close();
}

return result;
}

我的问题是:对存储过程的调用工作得很好,错误代码 = 0 被很好地拾取,数据表已创建并且列数是预期值 - 但有 NO行已加载...

我一直在尝试一切我能想到的方法将这些行放入数据表中 - 没有运气。当然,如果我在 SQL Server Management Studio 中执行这个完全相同的存储过程,一切都会正常,我得到 ErrorCode=0 和 18 列 5 行的结果集 - 没问题......

我错过了什么?谁能发现我的代码中的问题吗?为什么没有加载第二个结果集的行(但似乎正在检测列)?

最佳答案

发布的代码运行良好 - 我从 C# 调用它的方式与在 SQL Server Management Studio 中调用它的方式存在差异:NULL 处理。

我将一些输入参数设置为 int,从而为存储过程提供了 0 值,而它实际上期望获得 NULL > 如果未定义该值......

愚蠢的菜鸟错误......对不起大家!感谢您的投入!

关于sql-server - 尝试从存储过程加载第二个结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com