在数据库中同时从文本框和 datagridview 插入

Posted

技术标签:

【中文标题】在数据库中同时从文本框和 datagridview 插入【英文标题】:inserting from textbox and datagridview at sametime in database 【发布时间】:2021-09-21 01:26:15 【问题描述】:

如何在一个表格中单击一个按钮同时从 datagridview 和文本框插入数据。这是我使用 foreachloop 从 DataGridview 插入的代码,但它插入 null 任何帮助表示感谢。

SqlCommand cmd, cmd1, cmd2, cmd3;

con.Open();
cmd = new SqlCommand("insert into sale_detail(sale_bill_number, discount,currency,date) values(@sale_bill_number, @discount ,@currency,@date)", con);
cmd.Parameters.AddWithValue("@sale_bill_number", billbox.SelectedItem);
cmd.Parameters.AddWithValue("@discount", txtdiscount.Text);
cmd.Parameters.AddWithValue("@currency", currencyid);
cmd.Parameters.AddWithValue("@date", dateTimePicker.Value.Date);
cmd1 = new SqlCommand("insert into payment(sdetail,totalprice) values(@sdetail,@totalprice)", con);
cmd1.Parameters.AddWithValue("@sdetail", sid);
cmd1.Parameters.AddWithValue("@totalprice", txtpayment.Text);
cmd2 = new SqlCommand("insert into sale(customer) values(@customer)", con);
cmd2.Parameters.AddWithValue("@customer", customerid);
foreach (DataGridViewRow dr in saleDataGridView.Rows)

    string sqlquery = "insert into sale_detail(medicine_id,purchase_rate,quantity)values(@medicine_id,@purchase_rate, @quantity)";
    cmd = new SqlCommand(sqlquery, con);
    cmd.Parameters.AddWithValue("@medicine_id", dr.Cells["شماره مسلسل"].Value);
    // cmd.Parameters.AddWithValue("@country", saleDataGridView.Rows[i].Cells["کشور"].Value);
    cmd.Parameters.AddWithValue("@purchase_rate", dr.Cells["قیمت"].Value);
    // cmd.Parameters.AddWithValue("@sale_rate", dr.Cells["قیمت فروش"].Value ??DBNull.Value);
    cmd.Parameters.AddWithValue("@quantity", dr.Cells["تعداد"].Value);


if (cmd.ExecuteNonQuery() == 1)

   if (cmd1.ExecuteNonQuery() == 1) 
        if (cmd2.ExecuteNonQuery() == 1)
        

【问题讨论】:

foreach 循环中的 cmd 在您退出循环时只执行一次。可能,如果您希望为每一行执行它,您需要在循环内移动 ExecuteNonQuery。然而,变量 cmd 在循环内重新初始化,一切都被重置。因此,在第一行中分配给您的 cmd 变量及其参数的外部查询将永远不会被执行。 那么解决办法是什么?? 很难说不知道你到底想做什么。首先,当您完成参数后,我将执行每个 SqlCommand。因此,执行第一个 cmd,如果结果不是 1,则返回。对 cmd1 和 cmd2 应用相同的逻辑。在循环内部,在每个循环处执行 cmd。但是,我怀疑您想插入所有内容,或者,如果某些内容失败,则什么都不插入。如果是这样的话,那就看看SqlTransaction对象是如何工作的 cmd3 呢?为什么这些类型不同? insert into sale_detail(sale_bill_number, discount,currency,date)insert into sale_detail(medicine_id,purchase_rate,quantity) 我在树表中插入,所以我在一个表 sale_detail 中使用不同的 cmd 注释,我必须同时从文本框和数据网格插入。 【参考方案1】:

也许:

using con = new SqlCommand(...);

con.Open();
var tran = con.BeginTransaction();

var cmd = new SqlCommand("insert into sale_detail(sale_bill_number, discount,currency,date) values(@sale_bill_number, @discount ,@currency,@date)", con);
cmd.Parameters.AddWithValue("@sale_bill_number", billbox.SelectedItem);
cmd.Parameters.AddWithValue("@discount", txtdiscount.Text);
cmd.Parameters.AddWithValue("@currency", currencyid);
cmd.Parameters.AddWithValue("@date", dateTimePicker.Value.Date);
cmd.ExecuteNonQuery();

cmd = new SqlCommand("insert into payment(sdetail,totalprice) values(@sdetail,@totalprice)", con);
cmd.Parameters.AddWithValue("@sdetail", sid);
cmd.Parameters.AddWithValue("@totalprice", txtpayment.Text);
cmd.ExecuteNonQuery();

cmd = new SqlCommand("insert into sale(customer) values(@customer)", con);
cmd.Parameters.AddWithValue("@customer", customerid);
cmd.ExecuteNonQuery();

foreach (DataGridViewRow dr in saleDataGridView.Rows)

    string sqlquery = "insert into sale_detail(medicine_id,purchase_rate,quantity)values(@medicine_id,@purchase_rate, @quantity)";
    cmd = new SqlCommand(sqlquery, con);
    cmd.Parameters.AddWithValue("@medicine_id", dr.Cells["شماره مسلسل"].Value);
    // cmd.Parameters.AddWithValue("@country", saleDataGridView.Rows[i].Cells["کشور"].Value);
    cmd.Parameters.AddWithValue("@purchase_rate", dr.Cells["قیمت"].Value);
    // cmd.Parameters.AddWithValue("@sale_rate", dr.Cells["قیمت فروش"].Value ??DBNull.Value);
    cmd.Parameters.AddWithValue("@quantity", dr.Cells["تعداد"].Value);
    cmd.ExecuteNonQuery();


tran.Commit();

然后将整个东西(除了使用)包装在一个 try catch 中(我会这样做,但我在手机上;没有代码缩进按钮)并将 tran.Rollback(); 放在 catch 中

【讨论】:

con.CommitTransation 和 con.RollbackTransaction 给出错误,它说 sqlconnection 不包含 CommitTransaction 和 Rollbacktransaction 的定义。 它将空值保存在表中 确保您传递的数据不为空?

以上是关于在数据库中同时从文本框和 datagridview 插入的主要内容,如果未能解决你的问题,请参考以下文章

带有按钮、组合框和文本框的 C# WinForms (.NET Framework) DataGridView:使用按钮添加新行以添加组合框项时出错

如何在c#中单击按钮时将datagridview值插入数据库

双击datagridview后,Combobox中的SelectedValue

使用来自另一个表单的数据更新 datagridview (C#)

从 DataGridView 选定的单元格中获取文本

Datagridview vb.net中的组合框