如何将同一供应商的所有DataGridView数据插入SQL数据库同一行
实现同一供应商的DataGridView数据插入数据库同一行
嘿,我懂你的需求啦——原来的代码会把DataGridView里的每一行明细都单独插成数据库的一条记录,现在要把同一个供应商的所有明细打包进同一条数据库行里对吧?咱们来一步步调整:
首先得明确核心思路:把DataGridView里的多行明细字段(比如数量、药品名称)用分隔符拼接成单个字符串,然后一次性插入数据库的一行,同时要避开SQL注入的坑(你原来的字符串拼接写法风险很高哦)。
步骤1:收集并拼接明细数据
先遍历DataGridView,把需要合并的字段(比如quantity和medicine_name)分别收集起来,用合适的分隔符(比如分号;)拼接成完整的字符串。
步骤2:用参数化查询执行插入
绝对不要用字符串拼接SQL语句!改用参数化查询,既安全又能避免格式错误(比如字段里有引号的情况)。
修改后的完整代码示例
string connString = "你的数据库连接字符串"; // 替换成实际的连接字符串 try { using (MySqlConnection conn = new MySqlConnection(connString)) { conn.Open(); // 1. 收集并拼接明细数据 List<string> quantities = new List<string>(); List<string> medicineNames = new List<string>(); for (int i = 0; i < invoice_insertion_grid_view.Rows.Count - 1; i++) { quantities.Add(invoice_insertion_grid_view.Rows[i].Cells["quantity"].Value.ToString()); medicineNames.Add(invoice_insertion_grid_view.Rows[i].Cells["medicine_name"].Value.ToString()); } // 用分号分隔拼接成单个字符串,也可以换成其他你喜欢的分隔符 string mergedQuantity = string.Join(";", quantities); string mergedMedicineNames = string.Join(";", medicineNames); // 2. 构造参数化的SQL语句 string strQuery = @"INSERT INTO purchasing VALUES('', @InvoiceNo, @VendorName, @PurchaseDate, '', '', @TotalBalance, @MergedQuantity, @MergedMedicines, 'pending', @Payable)"; using (MySqlCommand cmd = new MySqlCommand(strQuery, conn)) { // 添加参数,避免SQL注入 cmd.Parameters.AddWithValue("@InvoiceNo", bill_purchasing_invoice_textbox.Text); cmd.Parameters.AddWithValue("@VendorName", bill_purchasing_vendor_combobox.SelectedItem.ToString()); cmd.Parameters.AddWithValue("@PurchaseDate", bill_purchasing_date_textbox.Value.Date); cmd.Parameters.AddWithValue("@TotalBalance", bill_purchasing_total_balance_textbox.Text); cmd.Parameters.AddWithValue("@MergedQuantity", mergedQuantity); cmd.Parameters.AddWithValue("@MergedMedicines", mergedMedicineNames); cmd.Parameters.AddWithValue("@Payable", purchasing_invoice_payable_box.Text); cmd.ExecuteNonQuery(); } MessageBox.Show("数据已成功插入!"); } } catch (MySql.Data.MySqlClient.MySqlException ex) { MessageBox.Show("插入失败:" + ex.Message); }
重要提醒
- 请确保你的
purchasing表中,存储合并后数量和药品名称的字段(对应代码里的MergedQuantity和MergedMedicines)有足够的长度,建议把字段类型改成TEXT或者加大VARCHAR的长度,避免拼接后的字符串被截断。 - 如果之后需要拆分这些合并的数据,可以用字符串分割方法(比如
Split(';'))还原成原来的明细行。
内容的提问来源于stack exchange,提问作者Asfand Tariq
相关产品推荐
相关产品推荐

