ahmed_sa Ответов: 1

Как выбрать данные из базы данных на основе списка multi select ?


Я работаю в c# windows form vs2015

Проблема

Как выбрать несколько элементов из базы данных на основе списка множественный выбор?

Подробности

Я поставил списка 1 режим управления выбор отеля в нескольких простых

код ниже выберите только один элемент, выбранный из списка, и работайте без каких-либо проблем, но выберите только один элемент

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

public DataTable ShowaSpecificSerial(string SerialNo)
        {

            SqlConnection con = new SqlConnection(connection);


            con.Open();
            string str = "select * from View_showdata where SerialNo=@SerialNo";
            SqlCommand com = new SqlCommand();
            com = new SqlCommand(str, con);
            com.Parameters.AddWithValue("@SerialNo", SerialNo);
            SqlDataAdapter oledbda = new SqlDataAdapter();
            oledbda = new SqlDataAdapter(com);
            DataSet ds = new DataSet();
            ds = new DataSet();
            oledbda.Fill(ds, "View_showdata");
            con.Close();
            DataTable dt = new DataTable();
            dt = ds.Tables["View_showdata"];
            return dt;


        }

под кнопкой я пишу следующее :

private void button5_Click(object sender, EventArgs e)
        {
            string root = @"D:\Temp";


            if (!Directory.Exists(root))
            {

                Directory.CreateDirectory(root);

            }
            Class1 CLS = new Class1();
            DataTable dt = CLS.ShowaSpecificSerial(listBox3.SelectedValue.ToString());
           
            for (int i = 0; i <= Convert.ToInt32(dt.Rows.Count) - 1; i++)
            {
                txt = "UserID" + dt.Rows[i][0] + "ProductNo" + dt.Rows[i][1] + "Firm Name" + dt.Rows[i][2] + "BtachNo" + dt.Rows[i][3] + "SerialNo" + dt.Rows[i][4];
               
                dm.DM(txt, Color.FromName(comboBox1.SelectedItem.ToString()), Color.White).Save(root + "\\" + dt.Rows[i][4] + ".emf", System.Drawing.Imaging.ImageFormat.Emf);
            }
        }

Примеры данных для просмотра View_showdata :
Идентификатор Товара Фирма BatchNo Серийный Номер Serialno
Али Паразитемол Фарко 2099 000055
Ali ColdFlue Farco 2998 01112
Ali ColdFlue Farco 2998 08888866

Результат

допустим, я делаю множественный выбор в поле со списком, чтобы серийный номер на 000055 и 08888866

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

08888866 в E : / Temp

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

имя файла 08888866 при его чтении данные должны иметь :

Ali ColdFlue Farco 2998 08888866

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

согласно списку, он принимает multi select, но не из базы данных .

Что я уже пробовал:

Как выбрать данные из базы данных на основе списка multi select ?

1 Ответов

Рейтинг:
2

CHill60

К сожалению, SqlCommand не очень хорошо обрабатывает списки.

Вы можете построить список для предложения IN с помощью StringBuilder и добавить параметры один за другим следующим образом:

if (listBox1.SelectedItems.Count == 0) return;
using (var conn = new SqlConnection(constring))
{
    conn.Open();
    var query = new StringBuilder("SELECT CustomerID, CompanyName, City FROM Customers WHERE CustomerID IN (");

    using (var cmd = new SqlCommand())
    {
        cmd.Connection = conn;
        var commaRqd = false;
        for (var i = 0; i < listBox1.SelectedItems.Count; i++)
        {
            if (commaRqd) query.Append(",");
                var parmName = string.Format("@P{0}", i);
                query.Append(parmName);
                commaRqd = true;
                cmd.Parameters.AddWithValue(parmName, listBox1.SelectedItems[i].ToString());
        }
        query.Append(")");
        cmd.CommandText = query.ToString();

        var dr = cmd.ExecuteReader();
    }
    conn.Close();
}

ОПЕРАЦИОННАЯ
Немного более аккуратная версия этого цикла для
using (var cmd = new SqlCommand())
{
    var parmNames = new string[listBox1.SelectedItems.Count];
    for (var i = 0; i < listBox1.SelectedItems.Count; i++)
    {
        parmNames[i] = string.Format("@P{0}", i);
        cmd.Parameters.AddWithValue(parmNames[i], listBox1.SelectedItems[i].ToString());
    }
    query.Append(string.Join(",", parmNames));
    query.Append(")");

    cmd.Connection = conn;
    cmd.CommandText = query.ToString();

    var dr = cmd.ExecuteReader();

}