Как добавить значения в список из другого списка с помощью SQL-запроса? - PullRequest
0 голосов
/ 10 февраля 2019

Пользователь нажимает btnAdd, и он передает элементы в listBox1.Теперь я хочу создать запрос, который создает цикл из listBox1 в SELECT FROM таблицу из SQL и добавить элементы результата в listBox2

У меня есть этот пример кода, но он не работает.Кто-нибудь может мне помочь?

public void add()
{
    var con = new DBConnection();
    try
    {
        for (int i = 0; i < listBServices.Items.Count; i++)
        {
            SqlCommand cmd = new SqlCommand("SELECT price FROM price WHERE service = '" +
                listBServices.Items.ToString() + "';", con.Connection);
            SqlDataReader rd = cmd.ExecuteReader();

            while (rd.Read())
            {
                int price = rd.GetInt32(0);
                listBPrice.Items.Add(price.ToString());
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Я получаю это исключение:

enter image description here

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Вы должны закрыть ридер через некоторое время

public void add()
{
    var con = new DBConnection();
    try
    {
        for (int i = 0; i < listBServices.Items.Count; i++)
        {
            SqlCommand cmd = new SqlCommand("SELECT price FROM price WHERE service = '" +
                listBServices.Items.ToString() + "';", con.Connection);
            SqlDataReader rd = cmd.ExecuteReader();

            while (rd.Read())
            {
                int price = rd.GetInt32(0);
                listBPrice.Items.Add(price.ToString());
            }

            rd.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
0 голосов
/ 10 февраля 2019

listBServices.Items.ToString() приводит к строке "System.Windows.Forms.ListBox+ObjectCollection".Вы должны использовать

SqlCommand cmd = new SqlCommand("SELECT price FROM price WHERE service = '" + 
                                listBServices.Items[i] + "'",
                                con.Connection);

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

SqlCommand cmd = new SqlCommand("SELECT price FROM price WHERE service = @svc",
                                con.Connection);
cmd.Parameters.Add("@svc", SqlDbType.NVarChar).Value = listBServices.Items[i];
0 голосов
/ 10 февраля 2019

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

 string str = "Data Source=(local);Initial Catalog=Northwind;"
        + "Integrated Security=SSPI";
 string queryString =
        "SELECT price FROM price WHERE service ... ";

    using (SqlConnection connection =
               new SqlConnection(connectionString))
    {
        SqlCommand command =
            new SqlCommand(queryString, connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Call Read before accessing data.
        while (reader.Read())
        {
            ReadSingleRow((IDataRecord)reader);
        }

        // Call Close when done reading.
        reader.Close();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...