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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:45:31