将DataGridView数据插入Access数据库时提示找不到Challan No列的问题
问题解决:DataGridView插入Access数据库时提示“Column named Challan No cannot be found”
错误原因
- DataGridView列名不匹配:代码中使用
row.Cells("Challan No"),但DataGridView列的Name属性(与显示的HeaderText是不同属性)可能并非"Challan No"(比如实际是无空格的ChallanNo)。 - SQL语句不规范:带空格的参数/列名未用方括号包裹,且INSERT未指定目标列,易因列顺序出错。
- 代码拼写错误:参数
@Comapny拼写错误(应为@Company)。
解决步骤
1. 核对DataGridView列的Name属性
打开窗体设计器,选中DataGridView,在属性面板中查看每个列的Name属性,确保代码中row.Cells("xxx")的xxx与列Name完全一致。比如列显示标题是"Challan No",但Name可能是ChallanNo,则代码需改为row.Cells("ChallanNo").Value。
2. 修正SQL语句
Access中带空格的列名/参数需用方括号包裹,且INSERT语句明确指定目标列,避免顺序问题:
INSERT INTO inwarddb ([Challan No], [Date], [Company], [Item Name], [Qty], [Unit]) VALUES (@ChallanNo, @Date, @Company, @ItemName, @Qty, @Unit)
(参数改用无空格命名,减少语法问题)
3. 修正代码拼写与逻辑
修复拼写错误,同时将数据库连接移到循环外提升性能,跳过新行避免空数据插入:
Private Sub Button_IWP_Save_Click_1(sender As Object, e As EventArgs) Handles Button_IWP_Save.Click DataGridView1.RowHeadersVisible = False Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\SUKHVIR PC\Documents\InwardDB.accdb") conn.Open() Dim sql As String = "INSERT INTO inwarddb ([Challan No], [Date], [Company], [Item Name], [Qty], [Unit]) VALUES (@ChallanNo, @Date, @Company, @ItemName, @Qty, @Unit)" Using cmd As New OleDbCommand(sql, conn) ' 预先定义参数类型(可根据数据库列类型调整) cmd.Parameters.Add("@ChallanNo", OleDbType.VarChar) cmd.Parameters.Add("@Date", OleDbType.Date) cmd.Parameters.Add("@Company", OleDbType.VarChar) cmd.Parameters.Add("@ItemName", OleDbType.VarChar) cmd.Parameters.Add("@Qty", OleDbType.Integer) cmd.Parameters.Add("@Unit", OleDbType.VarChar) For Each row As DataGridViewRow In DataGridView1.Rows ' 跳过DataGridView的新增空行 If row.IsNewRow Then Continue For ' 赋值参数,注意列名要与DataGridView的列Name一致 cmd.Parameters("@ChallanNo").Value = row.Cells("ChallanNo").Value ' 替换为实际列Name cmd.Parameters("@Date").Value = row.Cells("Date").Value cmd.Parameters("@Company").Value = row.Cells("Company").Value cmd.Parameters("@ItemName").Value = row.Cells("ItemName").Value ' 替换为实际列Name cmd.Parameters("@Qty").Value = row.Cells("QTY").Value cmd.Parameters("@Unit").Value = row.Cells("Unit").Value cmd.ExecuteNonQuery() Next End Using conn.Close() End Using MsgBox("Save Successful", vbOK) End Sub
4. 额外检查点
- 确认Access表
inwarddb的列名与SQL中指定的完全一致,带空格的列必须用方括号包裹。 - 若DataGridView允许新增行(
AllowUserToAddRows=True),必须跳过IsNewRow的行,避免插入空数据。 - 参数类型尽量与数据库列类型匹配,比
AddWithValue更严谨,可防止类型转换错误。
内容的提问来源于stack exchange,提问作者PANDA
相关产品推荐
相关产品推荐

