C#中从SQL数据库加载指定PO_No行到DataGridView遇异常求解决
解决ComboBox选中PO_No后DataGridView仅显示单行且报错的问题
我看了你的代码和问题描述,这个问题主要是因为你用了手动循环给DataGridView赋值的方式,加上没有正确处理行的创建,同时还忽略了WinForms里DataGridView绑定的标准做法,才导致了索引越界的错误和只能显示单行的问题。
问题根源分析
- 索引越界错误:你的代码里直接用
dataGridView1.Rows[i]去赋值,但DataGridView初始状态下没有行(或者只有固定行数),当i超过现有行的数量时,就会抛出类似截图里的索引超出范围的异常。 - 只能显示单行:就算你提前创建了一行,循环里的
i++也只会填充现有行,多余的数据根本没法显示,自然只能看到单行。 - 额外风险:你用字符串拼接的方式写SQL语句,存在严重的SQL注入风险,而且如果PO_No里包含单引号这类特殊字符,还会直接导致SQL语法错误。
修复方案(推荐用标准数据绑定方式)
直接用DataTable绑定到DataGridView的DataSource是WinForms里最可靠、最简洁的做法,不需要手动循环赋值,还能自动处理行的创建。下面是修改后的代码:
public void loadPOCarttable() { // 使用using语句自动释放数据库连接资源,避免内存泄漏 using (DynamicConnection con = new DynamicConnection()) { try { // 改用参数化查询,彻底避免SQL注入和语法错误 con.sqlquery(@"select b.BookName, b.ISBN_No, p.OrderQuantity, p.UnitPrice, p.Total from TBL_Book b inner join TBL_PO_Cart p on b.ISBN_No = p.ISBN_No where PO_No = @PO_No"); // 给SQL查询添加参数(这里需要确保你的DynamicConnection类支持参数操作,如果不支持,建议改用.NET原生的SqlCommand) con.command.Parameters.AddWithValue("@PO_No", cmbPO.Text); con.mysqlconnection(); con.datatable(); // 直接将填充好的DataTable绑定到DataGridView,自动生成所有行和列 dataGridView1.DataSource = con.table; // 如果你需要自定义列标题,可以在这里设置,比如: // dataGridView1.Columns["BookName"].HeaderText = "图书名称"; // dataGridView1.Columns["ISBN_No"].HeaderText = "ISBN编号"; } catch (Exception ex) { MessageBox.Show("发生错误:" + ex.Message); } } }
额外注意事项
- 如果你的
DynamicConnection类封装有问题,建议直接使用.NET原生的SqlConnection、SqlCommand和SqlDataAdapter来操作数据库,这样更稳定也更容易排查问题。 - 如果你需要保留手动设置列的样式,可以先设置
dataGridView1.AutoGenerateColumns = true(默认就是true),或者提前定义好列,再绑定数据。 - 永远不要用字符串拼接的方式构建SQL查询,参数化查询是必须的,既安全又能避免很多语法问题。
内容的提问来源于stack exchange,提问作者Kith
相关产品推荐
相关产品推荐

