我有一个客户设置,它使用存储过程从其 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 被拾取得很好,创建了数据表并且列数是预期值 - 但是没有加载任何行......
我一直在尝试一切我能想到的将这些行放入 DataTable - 没有运气。当然 - 如果我在 SQL Server Management Studio 中执行这个相同的存储过程,一切正常,我得到我的 ErrorCode=0 和我的 18 列和 5 行的结果集 - 没问题....
我错过了什么?谁能在我的代码中发现问题?为什么没有加载第二个结果集的行(但似乎正在检测列)?