Boopalslm Ответов: 3

Тип поля базы данных, хранящийся в двух временах


using (SqlConnection connect = new SqlConnection(db.Connectionstring()))
           {
               using (SqlCommand command = new SqlCommand())
               {
                   string pro = "";
                   int qty;
                   int totqty;

                   int i=0;

                        foreach (DataGridViewRow rows in dataGridView1.Rows)
                        {

                            SqlConnection con1 = new SqlConnection(db.Connectionstring());
                            con1.Open();
                            SqlCommand cmd1 = new SqlCommand("select * from sales where empnames='" + comboBox1.Text + "' ", con1);
                            SqlDataReader dr = cmd1.ExecuteReader();

                            if (dr.HasRows)
                            {
                                //while (dr.Read())
                                //{
                                    SqlConnection con2 = new SqlConnection(db.Connectionstring());
                                    con2.Open();

                                    SqlCommand cmd2 = new SqlCommand("update sales set empnames=@empnames+'" + comboBox1.Text + "',  categories=@categories, weight=@weight,per=@per,wastage=@wastage,customer=@customer,party=@party  where date=@date ", con2);

                                   cmd2.Parameters.AddWithValue("@empnames", Convert.ToString((comboBox1.Text)));
                                    cmd2.Parameters.AddWithValue("@date", Convert.ToDouble(rows.Cells[0].Value));
                                    cmd2.Parameters.AddWithValue("@categories", Convert.ToString(rows.Cells[1].Value));
                                    cmd2.Parameters.AddWithValue("@weight", Convert.ToString((rows.Cells[2].Value)));
                                    cmd2.Parameters.AddWithValue("@per", Convert.ToDouble(rows.Cells[3].Value));
                                    cmd2.Parameters.AddWithValue("@wastage", Convert.ToString((rows.Cells[4].Value)));
                                    cmd2.Parameters.AddWithValue("@customer", Convert.ToDouble(rows.Cells[5].Value));
                                    cmd2.Parameters.AddWithValue("@party", Convert.ToString((rows.Cells[6].Value)));




                                    cmd2.ExecuteNonQuery();
                                    con2.Close();


                                    SqlConnection con4 = new SqlConnection(db.Connectionstring());
                                    con4.Open();
                                    SqlCommand cmd4 = new SqlCommand("update sales set amtcst='" + txt_netamount.Text + "', amtparty='" + txtparty.Text + "', amtfinal='" + txtfinal.Text + "' where empnames='" + comboBox1.SelectedText + "'", con4);
                                    cmd4.ExecuteNonQuery();
                                    con4.Close();

                          // }
                            }


                            else
                            {
                                SqlConnection con3 = new SqlConnection(db.Connectionstring());
                                con3.Open();
                                SqlCommand cmd3 = new SqlCommand("insert into sales(empnames,date,categories,weight,per,wastage,customer,party,amtcst,amtparty,amtfinal)values('" + comboBox1.Text + "', '" + rows.Cells[0].Value + "','" + rows.Cells[1].Value + "','" + rows.Cells[2].Value + "','" + rows.Cells[3].Value + "','" + rows.Cells[4].Value + "','" + rows.Cells[5].Value + "','" + rows.Cells[6].Value + "','" + txt_netamount.Text + "','" + txtparty.Text + "','" + txtfinal.Text + "')", con3);
                                cmd3.ExecuteNonQuery();
                                con3.Close();


                            }
                        }

                   }
               }




это мой скрипт вставки и обновления для моих c# 2010 win forms, у меня есть проблема в empnames insert in two times to data base.

Кто-нибудь подскажет мне идеи

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

data base field type stored in two times

3 Ответов

Рейтинг:
0

P_Z

> & gt; empnames=@empnames+'" + поле combobox1.Текст
&ГТ;&ГТ; cmd2.Параметры.AddWithValue ("@empnames", Convert.ToString ((comboBox1. Text)));

Вы уже передаете @empnames в качестве параметра (что хорошо), поэтому вам не нужно повторно добавлять его с помощью запроса. As is empname будет сохранен как: "sometext" " sometext"

Но с 1-й строки подумайте о sql-инъекции queries...as вы передаете любой текст в запрос, а не просто параметр.

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

Нет проверки данных на сервере side...so некоторые запросы могут завершиться неудачно, например вставить строку вместо int и т. д.


Boopalslm

что я сейчас делаю, Сэр, пожалуйста, измените мой запрос обновления и пришлите мне сэра.

P_Z

Вы читали / понимали решение? Первая строка просто показывает вам, как это сделать...смотрите зачеркнутый текст, который означает удалить это

Boopalslm

чертой является правильным

empnames=@empnames+'", категории=@категорий, вес=@массой одного=@в,потери=@потерь,поддержки=@поддержки,партия=@вечеринке, где дата=@дата ", con2);

ошибка бур старт на категории=@категорий, как решит сэр

Boopalslm

сэр, просто направьте меня, Сэр, я проведу 4 дня, сэр. но до сих пор я не могу добиться результата.

Рейтинг:
0

Wendelius

Вы смешиваете параметры и литералы, и это вызывает у вас путаницу. Используйте параметры и только параметры в своих заявлениях. Каждый раз, когда вы начинаете писать что-то вроде ..." + ... в SQL-операторе вы, скорее всего, находитесь на неправильном пути.

Таким образом, обновление должно выглядеть примерно так

SqlCommand cmd2 = new SqlCommand(
@"update sales 
  set empnames=@empnames,
      categories=@categories,      
      weight=@weight,
      per=@per,
      wastage=@wastage,
      customer=@customer,
      party=@party  
where date=@date ", con2);
cmd2.Parameters.AddWithValue("@empnames", comboBox1.Text);
cmd2.Parameters.AddWithValue("@categories", Convert.ToString(rows.Cells[1].Value));
cmd2.Parameters.AddWithValue("@weight", Convert.ToString((rows.Cells[2].Value)));
cmd2.Parameters.AddWithValue("@per", Convert.ToDouble(rows.Cells[3].Value));
cmd2.Parameters.AddWithValue("@wastage", Convert.ToString((rows.Cells[4].Value)));
cmd2.Parameters.AddWithValue("@customer", Convert.ToDouble(rows.Cells[5].Value));
cmd2.Parameters.AddWithValue("@party", Convert.ToString((rows.Cells[6].Value)));
cmd2.Parameters.AddWithValue("@date", Convert.ToDouble(rows.Cells[0].Value));

cmd2.ExecuteNonQuery();

Но на этом дело не заканчивается, вы должны исправить все операторы, чтобы использовать параметры.

Кроме того, вы должны
- Откройте соединение только один раз внутри одного метода. Зачем многократно открывать его?
- Используйте блоки using, чтобы убедиться, что объекты расположены правильно.
- Используйте блоки try..catch для правильной обработки исключений.

Я предлагаю прочитать до конца Правильное выполнение операций с базой данных[^]


Boopalslm

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

Boopalslm

сэр, дайте мне несколько идей.

Wendelius

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

Boopalslm

нет ошибки, я привязываю свою предыдущую запись и ввожу вторую строку, но не могу сохранить вторую строку в базе данных.

Wendelius

Какой код вы используете в данный момент?

Boopalslm

над вашим кодом

Wendelius

Это обновляет одну строку, как вы вставляете две строки? У вас все еще есть тот же цикл foreach, что и в коде в вопросе?

Boopalslm

нет, сэр, как использовать цикл foreach в моем запросе обновления.

Wendelius

Я не имею в виду, что вы должны использовать foreach в обновлении. Команды обновления обновляют существующую строку. В опубликованном примере у вас был цикл foreach, в котором вы решали, обновлять ли или вставлять строку. Команда insert страдала от тех же проблем, что и команда update, так что вы уже исправили это?

Кроме того, решение об обновлении или вставке строки было принято с помощью оператора select. Отладили ли вы, работает ли оператор select так, как ожидалось?

Boopalslm

сэр что я могу сделать сэр.

Boopalslm

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

Wendelius

Я не могу исправить ваш код. У меня нет ни проекта, ни данных, ни требований, и самое главное, вы бы не учились на нем.

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

Сказав это, вы в настоящее время, кажется, зацикливаете все строки в gridview. Однако вы принимаете решение об обновлении или вставке на основе выбора поля со списком (comboBox1). Это поле со списком имеет только один выбор, так что, возможно, причина в том, что даже если вы перебираете несколько строк, решение об обновлении всегда одно и то же. Другими словами, логика неверна.

Рейтинг:
0

Patrice T

Никогда не создавайте SQL-запрос с такой конкатенацией:

SqlCommand cmd1 = new SqlCommand("select * from sales where empnames='" + comboBox1.Text + "' ", con1);

Если пользовательский ввод является экзотическим, запрос не будет выполнен, если он является вредоносным, он открывает дверь для SQL-инъекции.
SQL-инъекция[^]
SQL-инъекция-Википедия[^]


Boopalslm

так как же изменить мои запросы дать мне некоторые идеи

Patrice T

читать вторую ссылку

Boopalslm

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