2016-11-16 3 views
0

У меня есть столбец с именем ast_codeвыберите запрос, где положение с более чем 1 значение

enter image description here

, который я уже получен в string переменной. Я пытаюсь запустить запрос select с использованием предложения where на основе строкового значения, которое я сохранил в этой переменной.

Вот код, который я попробовал:

public void grid() 
{ 
    datatable dt = new datatable(); 
    SqlDataAdapter adapter = new SqlDataAdapter(); 
    SqlCommand command = new SqlCommand(); 
    try 
    { 
    command.Connection = myConnection; 
    command.CommandText = "SELECT code, name from table.menu where code <> '"+ ast_code + "'"; 
    adapter.SelectCommand = command; 
      adapter.Fill(ds); 
      adapter.Fill(dt); 
      myConnection.Open(); 
    } 
     catch(Exception ex) 
     { 
      MessageBox.Show("error" + ex); 
     } 
     myConnection.Close(); 
    gridControl1.DataSource = dt;   
    } 

Когда я запускал запрос, он не дал никаких результатов, если значение в строковой переменной только не содержит одно значение (например, 0110300).

Затем я попытался преобразовать содержимое переменной:

ast_code = a.Replace(';',',').Replace(' ','\''); 

но возвратил ошибку из-за отсутствующего '. Не против a; это значение переменной синтаксического анализа. Я уже пытался сохранить их в list, но это тоже не работает.

Что мне нужно сделать, это сгенерировать предложение where, которое может обрабатывать несколько значений.

UPDATE

IAM с помощью @ rbr94 предложения ast_code = a.Replace("; ", "', '");

command.CommandText = "SELECT code, name from table.menu where code not in '"+ ast_code + "'"; 

это работает, когда IAM используя верхний string value, но для второй строки `значение строк дает мне ошибку enter image description here enter image description here

+3

Привет, я бы посоветовал использовать параметризованные запросы. http://stackoverflow.com/questions/35163361/how-can-i-add-user-supplied-input-to-an-sql-statement – xszaboj

+0

@xszaboj, если я использую параметризованное, только 1 значение, а также нужно поставить он вручную через код .. – chopperfield

ответ

0

Я думаю, вы должны использовать NOT IN в своем statem Ent, как это:

command.CommandText = "SELECT code, name from table.menu where code NOT IN ('" + ast_code.Replace(";", "','") + "')"; 
+0

его все еще показывает второе значение. например, я получил два значения - 001,002, тогда первое значение 001 не показывалось (было истинным), но второе значение 002 все еще отображается .. – chopperfield

+1

Это потому, что это должно быть 'ast_code.Replace ("; "," ',' ")' – rbr94

2

ошибка вы получите результаты от неправильно установки ' в вашем где предложение. Я приведу пример:

У вас есть строка, как это: 0110300; 0110370

Затем вы используете ast_code = a.Replace(';',',').Replace(' ','\''); и это приводит к следующим образом: 0110300,'0110370. При использовании этого в вашем где п, очевидно, что это не будет работать:

where code <> '0110300,'0110370' 

Прежде всего использовать WHERE NOT IN, а затем вам нужно сделать следующее:

C#:

ast_code = string.Format("'{0}'", a.Replace("; ","', '")); 

SQL:

where code NOT IN (" + ast_code + ") 

//results in 
where code NOT IN ('0110300','0110370') 

' Это устанавливает до и после того, как ваш ast_code строка.Затем вы заменяете свой ; и пространство после него '; ', чтобы каждое значение было заключено с отметками ' с обеих сторон.

Это приведет к следующим образом: '0110300', '0110370'

+0

thx для ответа, но когда itry поставить 'ast_code = string.Format ('\' {0} \ '', a.Replace (';', '\', \ ''));' его дать мне ошибку '' слишком много символов в символе literal' – chopperfield

+0

'(';')' это не два символа, включая пробел? – chopperfield

+0

@chopperfield Я отредактировал мое сообщение. Я ошибочно использовал '' 'вместо' '', потому что это 'string', а не' char' – rbr94

0

так, мое решение моей проблемы заключается в том, что первый РМКО расщепление его для хранения в list<> так РМКО только непосредственно хранить ast_code = a

и затем код я использую для хранения

string[] code_asst = ast_code.Split(';'); 
    List<string> clean_code_asst = new List<string>(); 
    foreach (string s in code_asst) 
     { 
      clean_code_asst.Add("'"+s.Trim()+"'"); 
     } 
    string types = string.Join(",", clean_code_asst.ToArray()); 

для запроса я использую

var sql = "Select code from table.menu where code NOT IN ("+types+")"; 
    command.CommandText = sql; 
Смежные вопросы