2016-09-13 11 views
0

Вот история:Отправить несколько значений для Mysql Query

У меня есть проверенный список, который имеет элементы из моей базы данных нужно написать запрос, чтобы получить только выбранные элементы детали, которые затем населяют gridviwe

object[] items = checkedListBox1.CheckedItems.OfType<object>().ToArray(); 

     foreach (var item in items) 
     { 



      string connectionString = "server=127.0.0.1;uid=root;pwd=admin;database=per_update;"; 
      string query = "select * from tblcenters where centerName in('" + item + "')"; 
      using (MySqlConnection conn = new MySqlConnection(connectionString)) 
      { 
       using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn)) 
       { 
        DataTable ds = new DataTable(); 
        adapter.Fill(ds); 


        dataGridView1.DataSource = ds; 
       } 

}}

я написал этот код он только получает мне подробную информацию о последнем пункте, что я выбираю. но мне нужны детали для всех элементов я выбрать

, пожалуйста, не беспокойтесь, не используя параметры в запросе, поскольку это образец

+0

Но вы всегда должны использовать параметры, чтобы избежать инъекции SQL – BugFinder

+0

@ BugFinder. , , Затем объясните, как OP может использовать параметры для списка 'IN'. К сожалению, это один из тех случаев, когда использование параметров не просто. –

+1

Как выглядит 'item'? Я имею в виду содержание одного из них – rbr94

ответ

0

Попытка построить строку, которую вы должны использовать в WHERE IN заявление так:

var whereValues = ""; 

foreach (var item in items) { 
    whereValues += ", '" + item + "'"; 
} 

whereValues += whereValues.Substring(2, whereValues.Length-2); 

string query = "select * from tblcenters where centerName in(" + whereValues + ")"; 
+1

это работало с некоторыми поправками whereValues ​​+ = "," + "'" + item + "'"; – Binku

+0

Да, если ваши значения имеют тип string. Я забыл это рассмотреть. Я редактировал свой пост. – rbr94

+0

Я бы добавил, что это решение имеет две потенциальные ошибки. Он возвращает также строки с пустой строкой в ​​столбце _centerName_, и я надеюсь, что у вас никогда не будет значений со встроенными кавычками. – Steve

0

Обновлено. Возможно, вам стоит использовать StringBuilder для выполнения этой задачи. Также это очень неэффективно, если вы делаете запрос для каждого выбранного элемента. что-то вроде следующего может быть лучшим решением:

StringBuilder sb = new StringBuilder(); 
sb.Append("select * from tblcenters where centerName in("); 
for(int i=0;i<length;i++) 
{ 
    sb.Append('" + item[i] + "' + ","); 
} 
sb.Length--; // to get rid of the last comma (',') 
sb.Append(")"); 
string query = sb.ToString(); 
+0

Пожалуйста, используйте заявление, которое дается в вопросе, чтобы продемонстрировать вашу цель. Это может смутить некоторых пользователей, поскольку в нем отсутствует прямой контекст. – rbr94

+0

@ rbr94 Теперь лучше? – Garamaru

0
object[] items = checkedListBox1.CheckedItems.OfType<object>().ToArray(); 
string InStatement="("; //prepare the in clause 
foreach (var item in items) 
{ 
    InStatement+=item+","; 

} 
InStatement=InStatement.Substring(0, InStatement.Length - 1)+")";///trim last comma and add ending parenthesis 
string connectionString = "server=127.0.0.1;uid=root;pwd=admin;database=per_update;"; 
string query = "select * from tblcenters where centerName in"+InStatement; 
using (MySqlConnection conn = new MySqlConnection(connectionString)) 
{ 
    using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn)) 
    { 
     DataTable ds = new DataTable(); 
     adapter.Fill(ds); 
     dataGridView1.DataSource = ds; 
    } 
} 
0

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

// Get all the checked items in a list of strings... 
List<string> values = checkedListBox1.CheckedItems.Cast<string>().ToList(); 

List<MySqlParameter> prms = new List<MySqlParameter>(); 
List<string> prmsNames = new List<string>(); 

// Loop over the values and build the parameter names and the parameters 
for (int x = 0; x < values.Count; x++) 
{ 
    // The parameter with a conventional name 
    prms.Add(new MySqlParameter("@" + x.ToString(), MySqlDbType.VarChar) { Value = values[x] }); 
    // the parameter' names 
    prmsNames.Add("@" + x.ToString()); 
} 

// The command text 
string query = @"select * from tblcenters 
       where centerName in (" + 
       string.Join(",", prmsNames) + ")"; 

using (MySqlConnection conn = new MySqlConnection(connectionString)) 
using (MySqlDataAdapter adapter = new MySqlDataAdapter(query, conn)) 
{ 
    // Add the parameters collection to the select command.... 
    adapter.SelectCommand.Parameters.AddRange(prms.ToArray()); 
    DataTable ds = new DataTable(); 
    adapter.Fill(ds); 
    dataGridView1.DataSource = ds; 
}