Двойные записи, вставленные Datatable в sql серверную базу данных - PullRequest
0 голосов
/ 16 марта 2020

У меня есть DataTable, и я вставляю записи в SQL базу данных сервера. У меня уже есть мой пользовательский тип таблицы и хранимая процедура, и она работает нормально. все записи из моей таблицы данных были вставлены в базу данных, но проблема в том, что всякий раз, когда я нажимаю кнопку Сохранить, две одинаковые записи будут вставлены в мою базу данных. например, моя таблица данных содержит только одну запись

TRANSACTION ID | QTY | UNIT | ARTICLES | UNIT PRICE | AMOUNT
TR-001            2     CASE  PRODUCT-A    100.00     200.00

, но когда я нажимаю кнопку СОХРАНИТЬ, в мою серверную таблицу sql будут вставлены две одинаковые записи, например:

TRANSACTION ID | QTY | UNIT | ARTICLES | UNIT PRICE | AMOUNT
TR-001            2     CASE  PRODUCT-A    100.00     200.00
TR-001            2     CASE  PRODUCT-A    100.00     200.00

Я пробовал разные виды механизма l oop, как для l oop и для каждого l oop, но тот же результат. в чем проблема? вот мой код:

                 public DataTable GetDataTable()
                {
                 dt_SalesInv.Columns.Add("TRANSACTION ID");
                 dt_SalesInv.Columns.Add("QTY");
                 dt_SalesInv.Columns.Add("UNIT");
                 dt_SalesInv.Columns.Add("ARTICLES");
                 dt_SalesInv.Columns.Add("UNIT PRICE");
                 dt_SalesInv.Columns.Add("AMOUNT");

                 DataRow drLocal = null;
                foreach (DataGridViewRow dr in dgvSalesInv.Rows)
               {
                drLocal = dt_SalesInv.NewRow();
                drLocal["TRANSACTION ID"] = dr.Cells["TRANSACTION ID"].Value;
                drLocal["QTY"] = dr.Cells["QTY"].Value;
                drLocal["UNIT"] = dr.Cells["UNIT"].Value;
                drLocal["ARTICLES"] = dr.Cells["ARTICLES"].Value;
                drLocal["UNIT PRICE"] = dr.Cells["UNIT PRICE"].Value;
                drLocal["AMOUNT"] = dr.Cells["AMOUNT"].Value;
                dt_SalesInv.Rows.Add(drLocal);

               }

                return dt_SalesInv;
            }

          public void Save_SalesInvoice()
         {


            try
           {

            //calling stored proc
            SqlConnection connectionstring = connectionString.Getconnection();
            SqlCommand comm = new SqlCommand("sp_Save_SalesInvoice_2", connectionstring);
            comm.CommandType = CommandType.StoredProcedure;

                GetDataTable();
                comm.Parameters.AddWithValue("@data", dt_SalesInv);
                comm.ExecuteNonQuery();



            if (comm.ExecuteNonQuery() >= 1)
                {
                    MessageBox.Show("New Sales Invoice has been added to the Database!", "Sub- 
                Category", MessageBoxButtons.OK, MessageBoxIcon.Information);

                 }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Try Catch Error Message", MessageBoxButtons.OK, 
            MessageBoxIcon.Error);

        }
    }

помогите пожалуйста. спасибо

1 Ответ

0 голосов
/ 16 марта 2020

Вы должны избегать вызова ExecuteNonQuery() несколько раз, потому что он будет выполнять команду столько раз, а это не то, что вам нужно в этом случае.

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

GetDataTable();
comm.Parameters.AddWithValue("@data", dt_SalesInv);
int rowsAffected = comm.ExecuteNonQuery();
if (rowsAffected >= 1)
{
    MessageBox.Show("New Sales Invoice has been added to the Database!", "Sub-Category", MessageBoxButtons.OK, MessageBoxIcon.Information);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...