Я выполняю рефакторинг программы на 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
в конце.