我有一个客户设置,它使用存储过程从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 ROWS 已加载......
我一直在努力尝试将这些行放入DataTable - 没有运气。当然 - 如果我在SQL Server Management Studio中执行这个相同的存储过程,一切正常,我得到我的ErrorCode = 0和我的结果集18列和5行 - 没问题....
我错过了什么?有人能在我的代码中发现问题吗?为什么不加载第二个结果集的行(但似乎正在检测列)?
答案 0 :(得分:3)
发布的代码工作正常 - 我在C#和SQL Server Management Studio中调用它的方式有所区别:NULL处理。
我将一些输入参数设置为int
,从而为存储过程提供了0
值,而如果未定义该值,则确实需要获得NULL
。 .....
愚蠢的菜鸟错误..... SORRY GUYS!感谢您的投入!
答案 1 :(得分:0)
DataTable.Load method隐式调用NextResult方法,因此将它与显式调用相结合,它将前进到不存在的结果集。如果要使用DataTable.Load 或循环并自己填充数据表,则应删除自己对NextResult的调用。