You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将DataGridView数据插入Access数据库时提示找不到Challan No列的问题

问题解决:DataGridView插入Access数据库时提示“Column named Challan No cannot be found”

错误原因

  1. DataGridView列名不匹配:代码中使用row.Cells("Challan No"),但DataGridView列的Name属性(与显示的HeaderText是不同属性)可能并非"Challan No"(比如实际是无空格的ChallanNo)。
  2. SQL语句不规范:带空格的参数/列名未用方括号包裹,且INSERT未指定目标列,易因列顺序出错。
  3. 代码拼写错误:参数@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:46:03