2016-01-26 3 views
1

В программе есть часть кода, который выполняет запрос:Различные результаты при выполнении запроса SQL Server

string SPROC = "#Some MSSQL Query#"; 
comm.CommandType = CommandType.Text; 
comm.CommandText = SPROC; 
comm.Parameters.Add(new SqlParameter("@Parameter1", SqlDbType.VarChar, 50)).Value = PARAM1; 
comm.Parameters.Add(new SqlParameter("@Parameter2", SqlDbType.VarChar, 20)).Value = PARAM2; 
comm.CommandTimeout = CurrentSettings.SQLTimeout; 

conn.Open(); 
SqlDataAdapter adapter = new SqlDataAdapter(comm); 
DataSet TempDS = new DataSet(); 
adapter.Fill(TempDS); 

набора данных (TempDS) таблица должна иметь около 20000 записей (количество строк), но внутри программы он говорит только 20 записей в режиме отладки.

Я запустил сценарий отдельно в той же таблице базы данных, которая используется в строке подключения SQL Server, но в SQL Server Management Studio она возвратила 20000 записей, как это должно быть сделано.

Сценарий выглядит примерно то, что нравится:

Select 
    [Table1].Column1,[Table2].Column1 
From 
    [Table1] 
Inner Join 
    [Table2] on ([Table2].Column1 = [Table1].Column2) 
Where 
    [Table2].Column1 = @Parameter1 
    and ([Table1].Column1 in (Select * from dbo.Split(@Parameter2,',')) 

Это тот же самый текст сценария, который выполняет код, а также.

Означает ли кто-нибудь, почему программный код возвращает только часть записи, тогда как сценарий в SQL Server Management Studio возвращает все записи?

P.S. Я также проверил SQLTimeOut и установлен на 240, поэтому более чем достаточно времени для правильной записи записей. И @ Parameter1 и @ Parameter2 являются строковыми переменными.

string PARAM1 = "Random1"; //in C# 
string PARAM2 = "Random2,Random3,Random4,Random5"; //in C# 
@Parameter1 = PARAM1 
@Parameter2 = PARAM2 
+3

Профилировщик первого использования, чтобы просмотреть запрос, отправляемый из вашего приложения в SQL, и убедиться, что это запрос, который вы ожидаете от него. –

+0

Проверьте, что вы фактически используете одну и ту же базу данных при отладке. – Polyfun

+0

Вы пытались запустить хранимую процедуру непосредственно на SQL напрямую, щелкнув правой кнопкой по сохраненной процедуре и выбрав «выполнить»? Если это так, убедитесь, что вы передаете те же значения параметров, что и ваша программа. – DiscipleMichael

ответ

2

Значение строки превышает длину параметра в C#

string PARAM2 = "Random2,Random3,Random4,Random5"; //in C# 

comm.Parameters.Add(new SqlParameter("@Parameter2", SqlDbType.VarChar, 20)).Value = PARAM2; 

поэтому вам нужно выделить больше длины здесь

Попробуйте использовать AddWithValue: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue(v=vs.110).aspx

Примечание: если вы сделайте это, также знайте о возможности функции SPLIT для входа; его, возможно, необходимо будет скорректировать до некоторого большого значения - найдите некоторые функции разделения, которые занимают большие входы.

+0

OP должен был поймать это на трассе профайлера. –

+0

Честно говоря, я допустил эту ошибку; и поймал его, иногда второй набор глаз очень продуктивен. Опыт и ошибки и исправление их использования. –

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