Я рефакторинг программы С#, которая вызывает хранимую процедуру, которая заканчивается:
SELECT @ResultCode AS ResultCode
Код С# выглядит так:
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
в конце.
SET NOCOUNT ON
в вашей хранимой процедуре? Где SQL, который имеет дело с@Foo
? - person Jodrell   schedule 09.08.2011