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

Sql server 尝试从存储过程加载第二个结果集,sql-server,stored-procedures,ado.net,sql-server-2008-r2,multiple-resultsets,Sql Server,Stored Procedures,Ado.net,Sql Server 2008 R2,Multiple Resultsets,我有一个客户设置,它使用存储过程从其SQL Server数据库返回数据 这些存储过程都是以相同的方式构建的-它们接受一组输入参数,并返回: 第一个只是一行、一列,结果代码(typeINT)为-0表示成功,其他值为-0;如果值为0,则第二个结果集包含实际数据 第二个结果集可以是任意数量的列和行 我正在尝试创建一种“通用”方式来与该系统交互,我的尝试是: 创建一个接受存储过程名称和输入参数的类 一种返回类型,它既包含ErrorCode INT属性,也包含DataTable results属性

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

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

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

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

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

  • 创建一个接受存储过程名称和输入参数的类
  • 一种返回类型,它既包含
    ErrorCode INT
    属性,也包含
    DataTable results
    属性
但是,我在使用ADO.NET和SQL Server 2008 R2时遇到了问题

我的代码可以归结为:

publicMyResultType调用服务(字符串过程重命名,MyParameters)
{
MyResultType结果=新的MyResultType{ErrorCode=0};
使用(SqlConnection conn=newsqlconnection(_connectionString))
使用(SqlCommand cmd=newsqlcommand(conn,procedureName))
{
cmd.CommandType=CommandType.storedProcess;
设置参数(cmd,参数);
//打开连接,执行存储过程
conn.Open();
使用(SqlDataReader rdr=cmd.ExecuteReader())
{
//获取第一个结果集-状态代码,一行一列,INT类型
while(rdr.Read())
{
result.ErrorCode=rdr.GetInt32(0);
}
//如果我们得到一个“0”(成功)->转到下一个结果集并将其加载到表中
if(result.ErrorCode==0&&rdr.NextResult())
{
result.ResultTable=新数据表();
结果可结果负荷(rdr);
int colCount=result.ResultTable.Columns.Count;
int rowCount=result.resultable.Rows.Count;
}
rdr.Close();
}
康涅狄格州关闭();
}
返回结果;
}
我的问题是:对存储过程的调用工作得很好,错误代码=0拾取得很好,创建了数据表,列数是预期值-但是没有加载行

我一直在想尽一切办法把这些行放到数据表中——运气不好。当然,如果我在SQLServerManagementStudio中执行相同的存储过程,一切正常,我得到的错误代码为0,结果集为18列5行,没问题


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

隐式调用NextResult方法,因此将其与显式调用相结合,它将前进到不存在的结果集。如果您想使用DataTable.Load或loop-through并自己填充DataTable,您应该删除自己对NextResult的调用

发布的代码运行良好-我从C#和在SQL Server Management Studio中的调用方式有所不同:空处理

我将一些输入参数设置为
int
,因此向存储过程提供了一个
0
值,而如果没有定义该值,它实际上希望得到一个
NULL


愚蠢的新手错误。。。。。对不起,伙计们!谢谢你的投入

列计数是预期值,并且“result”表是正确创建的(没有行的除外),这表明从“console”(SQL Server Management Studio)和ADO.Net代码调用存储过程的方式存在一些差异。特别是存储过程采用哪些参数?在上面的代码片段中,您可以引用而不将它们作为“参数”公开。应该能够通过运行探查器跟踪
DataTable来检查这一点。在加载其结果集后加载
calls
NextResult
。。。。如果我没有将
.NextResult()
放在那里,那么我将再次加载第一个结果集(仅一行一列)。我已经测试过了