Member 14947303 Ответов: 1

Попытка вставить/обновить базу данных на основе данных datagridview C# SQL


Я пытаюсь сделать вставку или обновление(в зависимости от того, существует ли продукт в БД)


В случае, если count ==0, данные должны быть вставлены
В противном случае, если count ==1 Данные должны быть обновлены (где указано кол-во)

Обновление qty для существующих данных выполняется нормально( count==1 случай), но новый продукт не вставляется, если данные не существуют( count==0 случай)
Что не так с кодом внутри count ==1 block code

Спасибо всем

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

         for (int i = 0; i < dtgartikulli.Rows.Count; i++)
                    {

                        SqlCommand cmdkontrolla = new SqlCommand("barkodicheck", conn);
                        cmdkontrolla.CommandType = CommandType.StoredProcedure;
                        cmdkontrolla.Parameters.AddWithValue("@barkodi", Convert.ToString(dtgartikulli.Rows[i].Cells[0].Value));
                        SqlDataAdapter adapt = new SqlDataAdapter(cmdkontrolla);
                        DataSet ds = new DataSet();
                        adapt.Fill(ds);
                        conn.Close();
                        int count = ds.Tables[0].Rows.Count;
                        //nese është barazi me 1, shfaqe dritaren pasuese
                        if (count == 0)
                        {
                            SqlCommand cmdinsertimi = new SqlCommand("insertprodukti", conn);
                            cmdinsertimi.CommandType = CommandType.StoredProcedure;
                            SqlParameter ibarkodi = cmdinsertimi.Parameters.Add("@barkodi", SqlDbType.Int);
                            SqlParameter iemertimi = cmdinsertimi.Parameters.Add("@emertimi", SqlDbType.VarChar, 200);
                            SqlParameter isasia = cmdinsertimi.Parameters.Add("@sasia", SqlDbType.Int);
                            SqlParameter istoku = cmdinsertimi.Parameters.Add("@stoku", SqlDbType.Int);
                            SqlParameter icmimi = cmdinsertimi.Parameters.Add("@cmimi", SqlDbType.Float);
                            SqlParameter icmimif = cmdinsertimi.Parameters.Add("@cmimif", SqlDbType.Float);
                            SqlParameter ifitimi = cmdinsertimi.Parameters.Add("@fitimi", SqlDbType.Float);
                            SqlParameter itvsh = cmdinsertimi.Parameters.Add("@tvsh", SqlDbType.Float);
                            SqlParameter ikategoria = cmdinsertimi.Parameters.Add("@kategoria", SqlDbType.VarChar, 100);
                            SqlParameter idata = cmdinsertimi.Parameters.Add("@data", SqlDbType.DateTime);
                            SqlParameter ishtuarnga = cmdinsertimi.Parameters.Add("@shtuarnga", SqlDbType.VarChar, 100);
                            SqlParameter injesia = cmdinsertimi.Parameters.Add("@njesia", SqlDbType.VarChar, 50);
                            foreach (DataGridViewRow row in dtgartikulli.Rows)
                            {
                                if (!row.IsNewRow)
                                {

                                    ibarkodi.Value = row.Cells[0].Value;
                                    iemertimi.Value = row.Cells[1].Value;
                                    isasia.Value = "1";
                                    istoku.Value = row.Cells[3].Value;
                                    icmimi.Value = row.Cells[2].Value;
                                    icmimif.Value = row.Cells[4].Value;
                                    ifitimi.Value = row.Cells[5].Value;
                                    itvsh.Value = row.Cells[7].Value;
                                    ikategoria.Value = row.Cells[6].Value;
                                    idata.Value = DateTime.Now;
                                    ishtuarnga.Value = lbluseri.Text;
                                    injesia.Value = row.Cells[9].Value;
                                    cmdinsertimi.ExecuteNonQuery();


                                }
                            }


                        }
                        else if (count == 1)
                        {
                            for (int j = 0; j < dtgartikulli.Rows.Count; j++)
                            {

                                SqlCommand cmdeditimi = new SqlCommand("updatestokublerja", conn);
                                cmdeditimi.CommandType = CommandType.StoredProcedure;
                                cmdeditimi.Parameters.AddWithValue("@barkodi", Convert.ToString(dtgartikulli.Rows[j].Cells[0].Value));
                                cmdeditimi.Parameters.AddWithValue("@sasi", Convert.ToString(dtgartikulli.Rows[j].Cells[3].Value));
                                conn.Open();
                                cmdeditimi.ExecuteNonQuery();
                                conn.Close();

                            }
                        }
                        clear();
                        conn.Close();
                        dtgartikulli.DataSource = null;
                        dtgartikulli.Refresh();
                    }
                }
            }
        }

First i am checking if that barcode does exist(                    cmdkontrolla.Parameters.AddWithValue("@barkodi", Convert.ToString(dtgartikulli.Rows[i].Cells[0].Value));
)


SP CODE:

        ALTER procedure [dbo].[barkodicheck]
        @barkodi int

        as

        select Barkodi from tabela_produktet where
        Barkodi = @barkodi


        ALTER procedure [dbo].[updatestokublerja]
        @barkodi int,
        @sasi int

        as

        update tabela_produktet set Stoku = Stoku + @sasi
       where
       Barkodi = @barkodi

Gerry Schmitz

Вы просто "стреляете и забываете". Никакого состояния или обработки ошибок. Не пытайся ... лови. Насколько нам известно, это работает.

Member 14947303

есть "попробуй", "поймай" и "наконец", но я не ставил их под сомнение, потому что это ограничивало меня. Внутри try находится верхний код, а в catch-исключение ex error, а в finally-четкое и тесное соединение

Но весь код не является; wroking, как я уже сказал в верхнем вопросе

Member 14947303

Я проверил код. Когда есть строки только в случае count==0(процесс вставки выполняется идеально), но когда есть несколько строк в обоих случаях( count==0 и count=1), Процесс вставки не выполняется, выполняется только процесс обновления

Gerry Schmitz

Вы говорите, что вставка не работает, но обновление работает.
1) Как вы получили запись для "обновления", если вы не можете вставить.
2) если вставка не работает, то почему показываются только те SP, которые работают?

Member 14947303

Вы, сэр, не поняли вопроса или, чтобы быть более ясным, вы не прочитали весь вопрос. Вопрос был и есть:
Сначала, когда я нажимаю кнопку Сохранить, данные в datagridview собираются проверить, существуют ли они в sql. Если он существует (count ==1), то используйте update SP( update the old qty+ new qty), если данные не существуют (count==0), то вставьте данные из datagridview.

1 Ответов

Рейтинг:
0

RickZeeland

Возможно, вас заинтересует эта статья:
Пожалуйста, прекратите использовать этот анти-паттерн UPSERT - SQLPerformance.com[^]