VB.NET中ListView项插入MS Access报错:INSERT INTO语句错误,求快速修复
排查并修复VB.NET向Access插入ListView数据的INSERT INTO错误
一、立即修复语法错误
- 缺失闭合括号:原INSERT语句中,列列表的最后一项
[Date Of Order]后未添加闭合的),直接衔接VALUES,导致语法不完整。 - 参数名错误:
@Quantity@多写了一个@符号,应修正为@Quantity。
修正后的INSERT语句:
Dim cmd As New OleDbCommand("INSERT into [Order]([Customer Name], [Address], [Phone], [Drink], [Quantity], [Size], [Size Price], [Add Ons], [Total of Add Ons], [Discount], [Payment], [DeliveryFee], [AmountPayable], [Date Of Order]) VALUES (@CustomerName,@Address,@Phone,@Drink,@Quantity,@Size,@SizePrice,@AddOns,@TotalOfAddOns,@Discount,@Payment,@DeliveryFee,@AmountPayable,@DateOfOrder)", conn)
二、修正参数匹配问题
OleDb不支持按参数名匹配,必须严格按照INSERT语句中列的顺序添加参数。原代码中列顺序为[Customer Name] → [Address] → [Phone],但参数添加顺序错误(先加@Phone再加@Address),会导致值插入错误列,触发类型不匹配或约束错误。
同时,需将文本转换为对应的数据类型(如数值、日期),避免OleDb自动推断类型出错:
cmd.Parameters.AddWithValue("@CustomerName", item.SubItems(0).Text) cmd.Parameters.AddWithValue("@Address", item.SubItems(2).Text) ' 对应列的第二个位置 cmd.Parameters.AddWithValue("@Phone", item.SubItems(1).Text) ' 对应列的第三个位置 cmd.Parameters.AddWithValue("@Drink", item.SubItems(3).Text) cmd.Parameters.AddWithValue("@Quantity", If(String.IsNullOrEmpty(item.SubItems(4).Text), 0, Convert.ToInt32(item.SubItems(4).Text))) cmd.Parameters.AddWithValue("@Size", item.SubItems(5).Text) cmd.Parameters.AddWithValue("@SizePrice", If(String.IsNullOrEmpty(item.SubItems(6).Text), 0D, Convert.ToDecimal(item.SubItems(6).Text))) cmd.Parameters.AddWithValue("@AddOns", item.SubItems(7).Text) cmd.Parameters.AddWithValue("@TotalOfAddOns", If(String.IsNullOrEmpty(item.SubItems(8).Text), 0D, Convert.ToDecimal(item.SubItems(8).Text))) cmd.Parameters.AddWithValue("@Discount", If(String.IsNullOrEmpty(item.SubItems(9).Text), 0D, Convert.ToDecimal(item.SubItems(9).Text))) cmd.Parameters.AddWithValue("@Payment", item.SubItems(10).Text) cmd.Parameters.AddWithValue("@DeliveryFee", If(String.IsNullOrEmpty(item.SubItems(11).Text), 0D, Convert.ToDecimal(item.SubItems(11).Text))) cmd.Parameters.AddWithValue("@AmountPayable", If(String.IsNullOrEmpty(item.SubItems(12).Text), 0D, Convert.ToDecimal(item.SubItems(12).Text))) cmd.Parameters.AddWithValue("@DateOfOrder", DateTime.Parse(item.SubItems(13).Text))
三、资源释放与异常处理
原代码每次循环创建新连接且未处理异常,易导致连接泄漏或错误无法定位。改用Using语句自动释放资源,添加异常捕获获取具体错误信息:
完整修正代码:
Try For Each item As ListViewItem In ListView1.Items Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\ADMIN\source\repos\TrooTeaFinal\Database\Loginform.accdb") Using cmd As New OleDbCommand("INSERT into [Order]([Customer Name], [Address], [Phone], [Drink], [Quantity], [Size], [Size Price], [Add Ons], [Total of Add Ons], [Discount], [Payment], [DeliveryFee], [AmountPayable], [Date Of Order]) VALUES (@CustomerName,@Address,@Phone,@Drink,@Quantity,@Size,@SizePrice,@AddOns,@TotalOfAddOns,@Discount,@Payment,@DeliveryFee,@AmountPayable,@DateOfOrder)", conn) ' 按列顺序添加参数并转换类型 cmd.Parameters.AddWithValue("@CustomerName", item.SubItems(0).Text) cmd.Parameters.AddWithValue("@Address", item.SubItems(2).Text) cmd.Parameters.AddWithValue("@Phone", item.SubItems(1).Text) cmd.Parameters.AddWithValue("@Drink", item.SubItems(3).Text) cmd.Parameters.AddWithValue("@Quantity", If(String.IsNullOrEmpty(item.SubItems(4).Text), 0, Convert.ToInt32(item.SubItems(4).Text))) cmd.Parameters.AddWithValue("@Size", item.SubItems(5).Text) cmd.Parameters.AddWithValue("@SizePrice", If(String.IsNullOrEmpty(item.SubItems(6).Text), 0D, Convert.ToDecimal(item.SubItems(6).Text))) cmd.Parameters.AddWithValue("@AddOns", item.SubItems(7).Text) cmd.Parameters.AddWithValue("@TotalOfAddOns", If(String.IsNullOrEmpty(item.SubItems(8).Text), 0D, Convert.ToDecimal(item.SubItems(8).Text))) cmd.Parameters.AddWithValue("@Discount", If(String.IsNullOrEmpty(item.SubItems(9).Text), 0D, Convert.ToDecimal(item.SubItems(9).Text))) cmd.Parameters.AddWithValue("@Payment", item.SubItems(10).Text) cmd.Parameters.AddWithValue("@DeliveryFee", If(String.IsNullOrEmpty(item.SubItems(11).Text), 0D, Convert.ToDecimal(item.SubItems(11).Text))) cmd.Parameters.AddWithValue("@AmountPayable", If(String.IsNullOrEmpty(item.SubItems(12).Text), 0D, Convert.ToDecimal(item.SubItems(12).Text))) cmd.Parameters.AddWithValue("@DateOfOrder", DateTime.Parse(item.SubItems(13).Text)) conn.Open() cmd.ExecuteNonQuery() End Using End Using Next MessageBox.Show("Payment Successful!") Catch ex As Exception MessageBox.Show($"插入失败:{ex.Message}") End Try
四、额外排查要点
- 确认Access表
Order的列名、数据类型与代码完全匹配(如Quantity为整数、Size Price为小数/货币、Date Of Order为日期类型)。 - 检查ListView的SubItems索引是否正确,避免越界或取错值。
- 确保数据库文件路径正确,且程序拥有该文件的读写权限。
内容的提问来源于stack exchange,提问作者Johane Grei Wall
相关产品推荐
相关产品推荐

