【问题标题】:'Column 'CustID' does not allow nulls.' error when trying to write to access database VB.net'列'CustID'不允许空值。'尝试写入访问数据库 VB.net 时出错
【发布时间】:2021-11-18 12:45:39
【问题描述】:

我正在尝试从 VB 形式的文本框写入我的数据库。但是,当我单击“添加”按钮时,即使我的所有文本框都已填写,此错误也会出现在 `CustomersBindingSource.EndEdit() 行下。

Using connection As New OleDbConnection(builder.ConnectionString)

        connection.Open()

        Dim str As String
        str = "Insert into Items([InvoiceID]. [Item],[Cost],[Quantity]) Values (?,?,?,?,?,?)"
        Dim cmd As OleDbCommand = New OleDbCommand(str, connection)
        cmd.Parameters.Add(New OleDbParameter("CustID", CType(CustIDTextBox.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("FirstName", CType(First_NameTextBox.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("LastName", CType(Last_NameTextBox.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Address", CType(AddressTextBox.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("PhoneNo", CType(Phone_noTextBox.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("Points", CType(PointsTextBox.Text, String)))

        CustomersBindingSource.AddNew()
        CustomersBindingSource.EndEdit()
        CustomersTableAdapter.Update(POS_database_latestDataSet.Customers)

 End Using

我不明白我做错了什么。

【问题讨论】:

  • 您的 Insert 语句似乎与您的参数没有任何关系。

标签: database vb.net ms-access error-handling null


【解决方案1】:

由于 sql 字符串和参数不匹配,我选择了参数并更改了 sql 字符串。我不得不猜测数据库中的表名和字段名。请检查正确的名称。如果字段是自动编号字段(通常作为主键和 ID 字段找到),则不要为该字段插入值。数据库将为您插入值。

连接和命令都需要处理,因此将命令包含在Using 块中,方法是在第一行之后放置一个逗号并删除Dim

在命令执行之前不要打开连接。

TextBoxText 属性是String。你不需要转换类型。

我使用了With...End With 来节省一点混乱。

OleDb 中,参数在sql 字符串中出现的顺序必须与它们添加到参数集合中的顺序相匹配。 Add 方法将创建一个新的Parameter 对象并将其添加到参数集合中。我不得不猜测数据类型。检查您的数据库。

您编写了所有可爱的命令代码,然后您完全忽略了它。执行命令将更新数据库。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim str = "Insert into Customers(FirsName, LastName, Address, PhoneNo, Points) Values (@FirstName, @LastName, @Address, @PhoneNo, @Points);"
    Using connection As New OleDbConnection(builder.ConnectionString),
            cmd As OleDbCommand = New OleDbCommand(str, connection)
        With cmd.Parameters
            .Add("@FirstName", OleDbType.VarWChar).Value = First_NameTextBox.Text
            .Add("@LastName", OleDbType.VarWChar).Value = Last_NameTextBox.Text
            .Add("@Address", OleDbType.VarWChar).Value = AddressTextBox.Text
            .Add("@PhoneNo", OleDbType.VarWChar).Value = Phone_noTextBox.Text
            .Add("@Points", OleDbType.Integer).Value = CInt(PointsTextBox.Text)
        End With
        connection.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

【讨论】:

  • 非常感谢您的帮助。我按照您的建议做了,但是现在当我运行程序并单击“添加”时,出现错误:“查询值和目标字段的数量不一样。”即使陈述的值与数据库字段相同
  • 嘿,所以我设法弄清楚了。但是现在有一些新的东西::'INSERT INTO 语句包含以下未知字段名称:'FirstName'。确保您输入了正确的名称,然后重试该操作。我仔细检查了,名字都匹配。
  • @HamzaAsim 在 Access 数据库中检查字段(列)的名称。确保有一个名为 FirstName 的字段。没有空格或其他不显示的字符。
【解决方案2】:

正如错误所述,该列不允许使用 NULL 值。而且您没有在其中插入值。您正在插入这些列:

([InvoiceID]. [Item],[Cost],[Quantity])

哪 (1) 看起来像前两列之间的错字,而 (2) 甚至与您尝试插入的 不同。

指定要插入值的列:

([CustID], [FirstName], [LastName], [Address], [PhoneNo], [Points])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2020-09-05
    • 2012-05-28
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多