我正在重构一个 C# 程序,该程序调用一个以以下结尾的存储过程:
SELECT @ResultCode AS ResultCode
C# 代码如下所示:
SqlDbCommand.CommandType = System.Data.CommandType.StoredProcedure;
SqlDbCommand.CommandText = "PR_Foo";
SqlDbCommand.Parameters.Clear();
SqlDbCommand.Parameters.Add("@Foo", SqlDbType.Char);
SqlDbCommand.Parameters["@Foo"].Value = 'Foo';
System.Data.SqlClient.SqlDataAdapter SqlDbAdapter = new System.Data.SqlClient.SqlDataAdapter();
System.Data.DataSet SQLDataSet = new System.Data.DataSet();
SqlDbAdapter.SelectCommand = SqlDbCommand;
SqlDbAdapter.Fill(SQLDataSet);
SQLDataSet.Tables[0].TableName = "PR_Foo";
if (SQLDataSet.Tables.Count != 0) {
Result = int.Parse(SQLDataSet.Tables[SQLDataSet.Tables.Count - 1].Rows[0][0].ToString());
}
使用上面的代码,Result
正确填充了
存储过程返回的值。
用更简单的代码重构代码ExecuteScalar
:
SqlDbCommand.CommandType = System.Data.CommandType.StoredProcedure;
SqlDbCommand.CommandText = "PR_Foo";
SqlDbCommand.Parameters.Clear();
SqlDbCommand.Parameters.Add("@Foo", SqlDbType.Char);
SqlDbCommand.Parameters["@Foo"].Value = 'Foo';
Result = (int)SqlDbCommand.ExecuteScalar();
该Result
值奇怪地设置为 0,而预期结果应该是大于零的整数值。
你知道这种奇怪行为的原因是什么吗?
笔记:
存储过程有几个 if 块,在特定检查的情况下返回低于零的结果值;这些情况由 ExecuteScalar() 正确处理。
当存储过程正确完成其工作、提交各种更新的事务并Result
在最后返回值时,就会出现问题。