2015-09-03 1 views
-2

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

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\rnawa_000\Documents\Visual Studio 2013\Projects\Random\Random\sales.mdf;Integrated Security=True"); 
SqlCommand cmd = new SqlCommand(); 
cmd.Connection = conn; 
conn.Open(); 
cmd.CommandText = "insert into salesTB (Date,Time,Name,Quantity,Cost) values ('"+date.Text+"','"+time.Text+"','"+txtName.Text+"','"+listBox1.Items.Count+"','"+ txtCost.Text+")"; 

foreach (string item in listBox1.Items) 
{ 
    cmd.CommandText = "insert into salesTB (Purchase) values ('" +item.Substring(0,10) + "')"; 
} 
cmd.ExecuteNonQuery(); 
cmd.Clone(); 
conn.Close(); 

В date.text и time.text этикетки отображает дату и время respectively.they присваивается значения в случае загрузки формы. в txtName.text и txtCost.text метки получают свои значения из предыдущей формы с помощью конструктора, как

public Form2(ListBox.ObjectCollection objectCollection, string name,string total) 
{ 
    InitializeComponent(); 
    this.listBox1.Items.AddRange(objectCollection); 
    txtName.Text = name; 
    txtCost.Text = total; 
} 

Когда я выполнения этого, он дает мне ошибку говоря «Не удается вставить значение NULL в столбец" Стоимость». И если я установил разрешить nulls в столбце затрат в базе данных, тогда он показывает любое другое имя столбца в ошибке исключения.

+5

Пользователь может Вводите код с помощью текстовых полей в базе данных. ** Параметры привязки, не объединяйте строку SQL **. Во-вторых, вы, вероятно, попытаетесь вставить строку «NULL» в int/decimal. – lad2025

+0

Первый текст команды никогда не выполняется, команды, созданные во время цикла, никогда не выполняются, кроме последнего, когда вы выходите из цикла. – Steve

+0

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

ответ

0

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

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\rnawa_000\Documents\Visual Studio 2013\Projects\Random\Random\sales.mdf;Integrated Security=True"); 

SqlCommand cmd = new SqlCommand(); 

cmd.Connection = conn; 
conn.Open(); 

foreach (string item in listBox1.Items) 
{ 
    cmd.CommandText = "insert into salesTB (Date,Time,Name,Quantity,Cost,Purchase) values (@date, @time, @name, @quantity, @cost, @purchase)"; 

    cmd.Parameters.Add(new SqlParameter("date", date.Text)); 
    cmd.Parameters.Add(new SqlParameter("time", time.Text)); 
    cmd.Parameters.Add(new SqlParameter("name", txtName.Text)); 
    cmd.Parameters.Add(new SqlParameter("quantity", listBox1.Items.Count)); 
    cmd.Parameters.Add(new SqlParameter("cost", txtCost.Text)); 
    cmd.Parameters.Add(new SqlParameter("purchase", item.Substring(0,10))); 

    cmd.ExecuteNonQuery(); 
    cmd.Clone(); 
} 

conn.Close(); 

Это не проверено, но вы получаете эту идею.

+0

Благодарю вас за помощь. Я получаю представление об использовании параметризованных запросов. но из вашего предыдущего кода я думаю, что он добавит новую строку в таблицу для каждого элемента в списке. не могли бы вы показать мне, как я могу получить все значения item.substring в столбце покупки. –

+0

также оберните вышеуказанное при использовании;) –

+1

Это правильно. Зачем вам нужен один ряд для покупки, а затем еще одна совершенно несвязанная строка с NULL, показывающая только покупку? Это не очень хорошая практика РСУБД. –

0

Вот лучше и безопасный способ сделать то, что ваш после:

 string SQLQuery = "INSERT INTO salesTB (Date,Time,Name,Quantity,Cost)" + 
          "VALUES (@date, @time, @name, @quantity, @cost)"; 

     using (SqlConnection DBConn = new SqlConnection(cs.ToString())) 
     { 
      using (SqlCommand sqlCmd = new SqlCommand(SQLQuery, DBConn)) 
      { 
       sqlCmd.Parameters.Add("@date", SqlDbType.Text); 
       sqlCmd.Parameters["@date"].Value = date.Text; 

       sqlCmd.Parameters.Add("@time", SqlDbType.Text); 
       sqlCmd.Parameters["@time"].Value = time.Text; 

       sqlCmd.Parameters.Add("@name", SqlDbType.Text); 
       sqlCmd.Parameters["@name"].Value = txtName.Text; 

       sqlCmd.Parameters.Add("@quantity", SqlDbType.Int); 
       sqlCmd.Parameters["@quantity"].Value = listBox1.Items.Count; 

       sqlCmd.Parameters.Add("@cost", SqlDbType.Text); 
       sqlCmd.Parameters["@cost"].Value = txtCost.Text 

       DBConn.Open(); 
       sqlCmd.ExecuteNonQuery(); 
       DBConn.Close(); 
      } 
     } 
+0

спасибо. таблица содержит еще один столбец «покупка», где мне нужны все значения, присутствующие в списке. Можете ли вы показать мне, как я могу это сделать? –

+0

'INSERT INTO salesTB (дата, время, имя, количество, стоимость, покупка)" "VALUES (@date, @time, @name, @quityity, @ cost, @ anythingyouwantPurchase)' Then' sqlCmd.Parameters.Add («@anythingyouwpupase», SqlDbType.Text); sqlCmd.Parameters ["@ anythingyouwantPurchase"]. Значение = txtPurchase.Text; ' – ravenx30

+0

Я хочу ВСЕ ЗНАЧЕНИЯ ИЗ СПИСКА. любую функцию окна списка, которую я могу использовать? –

Смежные вопросы