Nganku Junior Ответов: 2

У меня есть combobox, который называется combobox2, который я хочу заполнить содержимым столбца таблицы под названием "bulkinput". Есть идеи?


Мне нужно иметь возможность копировать содержимое поля таблицы (столбца) в combobox, чтобы пользователь мог выбирать непосредственно оттуда, не вводя значения combobox во время его проектирования

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

private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                SqlConnection bscn = new SqlConnection("Data Source=PV10\\LOCALSERVER;Initial Catalog=SmallSoftwareDB;Integrated Security=True;Pooling=False");
                string ins = "insert into BulkSale(ProductSource, Date, Quantity, Type, UnitPrice, Total) values('" + textBox2.Text + "', '" + dateTimePicker1.Value + "', '" + textBox3.Text + "', '" + comboBox1.Text + "', '" + textBox4.Text + "', '" + textBox5.Text + "' )";
                string sPN = "select ProductName from BulkInput";
                SqlCommand P = new SqlCommand(sPN, bscn);
                comboBox2.DataSource = P.BeginExecuteReader();
                SqlCommand scmd = new SqlCommand(ins, bscn);
                bscn.Open();
                scmd.ExecuteNonQuery();
                MessageBox.Show("Successfully Completed.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                bscn.Close();
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, " ", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            }
        } 

2 Ответов

Рейтинг:
17

OriginalGriff

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

Во-вторых, вам нужно открыть соединение, прежде чем пытаться использовать считыватель.

В-третьих, не используйте DataReader - им нужно все живое, пока они работают, и ваше соединение закрывается до того, как combobox может загрузиться. Вместо этого используйте DataAdapter и DataTable:

try
    {
    using (SqlConnection con = new SqlConnection(strConnect))
        {
        con.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT ProductName FROM BulkInput", con))
            {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                DataTable dt = new DataTable();
                da.Fill(dt);
                myComboBox.DataSource = dt;
                myComboBox.DisplayMember = "ProductName";
                }
            }
        }
    }
catch (Exception ex)
    {
    MessageBox.Show(ex.Message);
    }


Всегда старайтесь держать строку подключения внутри конфигурационного файла (app. config или web.config, в вашем случае это будет app.config). Скажем, если у вас есть ключ с именем "conn" в конфигурационном файле, вы можете получить значение, как показано ниже
string strConnect = ConfigurationManager.ConnectionStrings["conn"].ToString();


Nganku Junior

Спасибо за предложенное решение. Я все еще применял ваши поправки с небольшим успехом. Вы сказали, что всегда старайтесь держать строку подключения внутри конфигурационного файла (app. config или web.config, в вашем случае это будет app.config). Скажем, если у вас есть ключ с именем "conn" в конфигурационном файле
- где я могу найти этот файл? Кроме того, я попробовал определить StrConnect, который я получил в ConfigurationManager.Способ выберите, где именно я определил ?

OriginalGriff

Я этого не сделал - это было добавлено к моему решению.
Хотя это хороший совет , но где именно его хранить, будет зависеть от среды, в которой вы работаете.
Для WinForms я бы предложил ветвь settings. settings свойств вашего проекта:
https://msdn.microsoft.com/en-us/library/aa730869(v=против 80). aspx

Рейтинг:
1

Muhammad Rehbar Sheikh

try
           {
               using (SqlConnection con = new SqlConnection(ConString))
               {
                   SqlConnection con = new SqlConnection(CS);
                   con.Open();
                   string str = "SELECT ProductName FROM BulkInput";
                   cmd = new SqlCommand(str, con);
                   DataTable dTable = new DataTable();
                   DataRow dr;
                   SqlDataAdapter da = new SqlDataAdapter(cmd);
                   da.Fill(dTable);

                   //if you want to insert or validate as '--select--' text in your first index of ComboBox
                   dr = dTable.NewRow();
                   dr.ItemArray = new object[] { 0, "--Select--" };
                   dTable.Rows.InsertAt(dr, 0);

                   yourComboBox.DisplayMember = dTable.Columns["ProductName"].ToString();
                   yourComboBox.ValueMember = dTable.Columns["ID"].ToString();
                   yourComboBox.DataSource = dTable;
               }
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }


Always try to keep the connection string inside the configuration file (app.config).
And never concatenate strings to form an SQL command. you leave your code wide open to SQL Injection. Always use a parameterised query or stored procedure.