2011-07-28 7 views
3

Я сталкиваюсь с очень интересной ошибкой (или функцией).ExecuteScalar возвращает другой результат, чем Pure SQL

У меня есть объект команды ADO, который вызывает вызов в базе данных.

Звонок похож на:

cmd.CommandText = "uspMySearch"; 
cmd.CommmandType = Command.StoredProcedure. 
cmd.Parameters.AddWithValue("@SearchBy", searchBy) 
// The value of searchBy is: '(FORMSOF (INFLECTIONAL, steve''s) AND FORMSOF (INFLECTIONAL, game))' 

int result = (int)cmd.ExecuteScalar(); 

// The result returned is 0. I was expecting 1. 

Когда я выполнить тот же запрос в SQL/в Query Analyzer, я получить другой результат.

СКП выглядит следующим образом:

EXEC uspMySearch @SearchBy = '(FORMSOF (INFLECTIONAL, steve''s) AND FORMSOF (INFLECTIONAL, game))' 

// The result returned is 1. This is the expected result. 

Для того, чтобы подтвердить, что я звонил правильно хранимую процедуру, я доработан uspMySearch возвращать случайное число. Я звонил вправо Sp!

У кого-нибудь есть идеи относительно того, что происходит здесь?

Спасибо.

Стив

Environment

SQL/Server 2008 R2

.NET 4.0

+0

Перейти в SQL Profiler и посмотреть, что запрос выглядит следующим образом отправляется на SQL Server. –

+0

Как выглядит ваш сохраненный proc? Похоже, вы динамически генерируете и выполняете SQL, правильно? – DoctorMick

+2

Вы возвращаете 'SELECT 1/0' из процедуры? Или вы просто делаете «RETURN 1/0»? Вы не получите значение из метода 'RETURN'. – FlyingStreudel

ответ

0

Я собираюсь выбрасывать диких догадаться, но я предполагаю, что есть что-то сделайте это с вашим броском. Вы можете изменить код:

object result = cmd.ExecuteScalar(); 

и использовать отладчик для проверки переменной result, чтобы увидеть, что это такое (и что это тип). Это может дать вам (или мне) ключ к тому, что происходит.

0

Когда вы говорите, что возвращенный результат 1 - как он возвращается; результатов или распечатанных?

Обычно при использовании ExecuteScalar() я использую запрос, который выбирает одно значение столбца (т. Е. Формата SELECT ... FROM ...).

1

Я считаю, что у вас есть посторонняя одинарная кавычка в вашей searchBy переменного в C#, попробуйте:

// note steve's rather than steve''s, shouldn't need to escape the single quote 
string searchBy = 
    "(FORMSOF (INFLECTIONAL, steve's) AND FORMSOF (INFLECTIONAL, game))"; 
... 
cmd.Parameters.AddWithValue("@SearchBy", searchBy); 

int result = (int)cmd.ExecuteScalar(); 

Другой возможность, поднятую @FlyingStreudel в комментариях, что хранимая процедура не использует SELECT для возврата значения. Если вы используете RETURN, вы должны вместо этого попробовать:

var retval = new SqlParameter("@RETVAL", SqlDbType.Int); 
retval.Direction = ParameterDirection.ReturnValue; 
cmd.Parameters.Add(retval); 
... 
cmd.ExecuteNonQuery(); 

int result = Convert.ToInt32(retval.Value); 
1

ExecuteScalar не для выполнения Stored Procedures - для этого вам использовать ExecuteNonQuery в сочетании с Parameters с направлением Output/InputOutput/Return.

http://msdn.microsoft.com/en-us/library/system.data.parameterdirection.aspx

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx

EDIT - возможно следующее тоже работает (хотя бы не рекомендовал его):

cmd.CommandText = "uspMySearch"; 
cmd.CommmandType = Command.StoredProcedure; 
cmd.Parameters.AddWithValue("@SearchBy", searchBy).Direction = ParameterDirection.InputOutput; 


int result = (int)cmd.ExecuteScalar(); 

var Result = cmd.Parameters ["@SearchBy"].Value; 
+2

Действительно? Пример веб-сайта Microsoft о том, как вернуть одно значение из SP, использует ExecuteScalar - http://msdn.microsoft.com/en-us/library/37hwc7kt(v=VS.100).aspx – DoctorMick

+0

спасибо ... узнал что-то новый ... по моему опыту это не всегда работает так, как ожидалось - я думаю, это зависит от сохраненной процедуры ... – Yahia

Смежные вопросы