次で終わるストアドプロシージャを呼び出す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();
値は奇妙なことに0に設定されていResultますが、期待される結果はゼロより大きい整数値である必要があります。
この奇妙な行動の原因が何であるか知っていますか?
ノート:
ストアドプロシージャにはいくつかのifブロックがあり、特定のチェックの場合はゼロ未満の結果値を返します。これらのケースは、ExecuteScalar()によって正しく処理されます。
この問題は、ストアドプロシージャが正しく機能し、さまざまな更新のトランザクションをコミットしてResult、最後に値を返す場合に発生します。