VB.NET向Access数据库写入数据时提示CustID列不允许为空错误如何解决
问题排查与解决方案
现有代码的核心问题
- 语法错误:Insert语句中
[InvoiceID]后误写为.,应为分隔字段的, - 表与字段逻辑不匹配:你编写的Insert语句目标是写入
Items表,后续添加的参数却对应Customers表的CustID、FirstName等字段,二者完全不匹配 - 两套写入逻辑混用冲突:你把文本框的取值全部赋值给了自行创建的
OleDbCommand参数,但是既没有执行这个命令,也没有把取值赋值给CustomersBindingSource新增的行。调用AddNew()后生成的新行所有字段均为空值,自然触发CustID非空约束报错 - 冗余代码:自行创建的数据库连接、SQL命令逻辑和后续的
BindingSource+TableAdapter更新逻辑完全独立,没有任何关联,属于无用代码
修复方案(二选一即可)
方案1:使用BindingSource+TableAdapter(强类型模式,推荐)
删除所有自行编写的OleDbConnection、Insert语句、OleDbCommand相关代码,替换为给新增行赋值的逻辑:
' 新增行并赋值 Dim newRow = CType(CustomersBindingSource.AddNew(), POS_database_latestDataSet.CustomersRow) newRow.CustID = CustIDTextBox.Text newRow.FirstName = First_NameTextBox.Text newRow.LastName = Last_NameTextBox.Text newRow.Address = AddressTextBox.Text newRow.PhoneNo = Phone_noTextBox.Text newRow.Points = PointsTextBox.Text ' 如果Points是数值类型,需转为对应Integer/Decimal类型 CustomersBindingSource.EndEdit() CustomersTableAdapter.Update(POS_database_latestDataSet.Customers)
方案2:使用原生SQL命令执行
删除后续的BindingSource、TableAdapter相关代码,修正SQL语句并执行命令:
Using connection As New OleDbConnection(builder.ConnectionString) connection.Open() ' 修正Insert语句,目标表改为Customers,字段对应实际列名 Dim str As String = "Insert into Customers([CustID],[FirstName],[LastName],[Address],[PhoneNo],[Points]) Values (?,?,?,?,?,?)" Dim cmd As OleDbCommand = New OleDbCommand(str, connection) cmd.Parameters.Add(New OleDbParameter("CustID", CustIDTextBox.Text)) cmd.Parameters.Add(New OleDbParameter("FirstName", First_NameTextBox.Text)) cmd.Parameters.Add(New OleDbParameter("LastName", Last_NameTextBox.Text)) cmd.Parameters.Add(New OleDbParameter("Address", AddressTextBox.Text)) cmd.Parameters.Add(New OleDbParameter("PhoneNo", Phone_noTextBox.Text)) ' 若Points为数值类型,需转换为对应类型:CInt(PointsTextBox.Text) / CDec(PointsTextBox.Text) cmd.Parameters.Add(New OleDbParameter("Points", PointsTextBox.Text)) ' 执行插入命令 cmd.ExecuteNonQuery() End Using
内容的提问来源于stack exchange,提问作者Hamza Asim
相关产品推荐
相关产品推荐

