2013-11-18 3 views
0

Я выполняю хранимую процедуру SQL Server из своего кода на C#, который по существу извлекает некоторые данные из базы данных на основе поставленного условия.Изменение количества записей

DataSet GetAllxxxxxByDate(string entityValue,string companyValue) 
{ 
    using (var sqlConn = new SqlConnection(GetConnectionString())) 
    { 
     using (var cmd = new SqlCommand()) 
     { 
      var data = new DataSet(); 
      cmd.CommandText = “myStoredprodecure”; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Connection = sqlConn; 

      var eVal = string.IsNullOrWhiteSpace(entityValue) ? string.Empty : entityValue; 
      cmd.Parameters.AddWithValue("@entity_value", eVal); 

      var company = string.IsNullOrWhiteSpace(companyValue) ? string.Empty : companyValue; 
      cmd.Parameters.AddWithValue("@company", company); 

      var sqlDataAdaptor = new SqlDataAdapter(cmd); 
      sqlDataAdaptor.Fill(data); 

      return data; 
     } 
    } 
} 

Здесь entityValue, companyValue должны быть разделены запятой строки, сформированные динамически в пределах C# код и передать его в хранимой процедуре.

Например:

’first’,’second’,’third’ 

И хранимая процедура использует эти значения для заполнения условия NOT IN, определенного в нем.

Проблема в том, что я получаю несогласованное количество записей при выполнении кода.

Следующий короткий снимок экрана, где первый WHERE статья возвращение 3 записи и вторая WHERE статья возвращение 1 запись. Входные значения для первого предложения WHERE были заполнены из кода C#, а вторая была заполнена вручную для проверки.

Both c# execution result and manual execution result

Единственное различие, которое я могу определить это количество котировок.

Вопрос: может кто-нибудь помочь мне в нуле в вопросе или разница в них дает WHERE пункт?

ответ

1

Ну, вы не показываете, что entity_value в ваших результатах, но разница между ними вы добавляете одинарные кавычки буквальных значений:

N'''FSEC''' в SQL является буквальным valiue 'FSEC'

'FSEC' в SQL - всего лишь FSEC (без кавычек).

Я предполагаю, что записи 2004981 и 2004982 имеют значение FSEC (без кавычек) для entity_value.

Если вы добавляете значения параметров из кода C#, не добавляйте кавычки вокруг них, как если бы вы строили строку. SQL будет обрабатывать значения в виде строк без необходимости использования спецификаторов строк.

EDIT

Хорошо, я только что прочитал это заявление:

Здесь EntityValue, companyValue должны быть разделены запятой строка

Вы не можете просто передать в разделенных запятыми string в позицию IN.Для поиска нескольких значений есть несколько вариантов:

  • Добавить запятые к каждому концу и использовать LIKE:

    Where (',' + @entity_value +',' LIKE '%,' + entity_value + ',%') 
    
  • Обработать строку во временную таблицу, чем использовать эту таблицу в вашем IN статья

  • Передайте значения в качестве параметра таблицы и используйте это в своем разделе IN.
  • Построение оператора SQL в виде строки и выполнить его с оценки EXEC
+0

@d Стенли кажется правильным для меня. «entityValue», вероятно, удерживает значение ['FSEC'] вместо [FSEC]. Вы можете попытаться изменить часть своего кода, которая вызывает GetAllxxxxxByDate, или вместо этого разделите переменную на ее лидирующие и конечные символы одиночной кавычки. – OnoSendai

+0

Изображение обновлено, чтобы включить entity_value. Спасибо – Nair

+0

@Nair, вы создаете динамический sql в своем SP? И ваш 'NOT IN' создается из параметра, разделенного запятой? – unlimit

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