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

VB插入数据时遇BC30800、BC32017错误,求原因及解决方法

插入LogonTable数据时的VB编译错误原因与解决方法

报错信息

D:\A New Project\Proforma\UserLogon.vb(31,24): error BC30800: Method arguments must be enclosed in parentheses.
D:\A New Project\Proforma\UserLogon.vb(31,29): error BC32017: Comma, ')', or a valid expression continuation expected.

表定义

CREATE TABLE [dbo].[LogonTable] (
    [Id]       INT           IDENTITY (1, 1) NOT NULL,
    [UserName] NVARCHAR (50) NOT NULL,
    [DateIn]   SMALLDATETIME NULL,
    [DateOut]  SMALLDATETIME NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
)

问题代码

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Dim dteAdded As String = DateTime.Now.ToString("yyyy-MM-dd hh:mm")
        'Dim dteAdded As DateTime = Now()
        Dim dteAdded As DateTime
        'Dim stmnt As String = "Insert into LogonTable(UserName) values ('" & AuthUser & "')"
        Stop
        If SQL.HasConnection = True Then
            If IsAuthenticated() = True Then
                AuthUser = TextBox1.Text
                'dteAdded = Now()
                Stop
                'SQL.ExecQuery("Insert into LogonTable(UserName, DateIn) values ('" & AuthUser & "', '" & dteAdded & "'")
                'SQL.ExecQuery("Insert into LogonTable(UserName, DateIn) values (AuthUser,dteAdded)")
                Insert into LogonTable(UserName, DateIn) values (AuthUser,Now())
    
                Me.Hide()
                MainScreen.Show()
                'Me.Close()
            End If
        End If
End Sub

错误原因

  1. BC30800错误:你直接在VB代码里写了SQL的Insert语句,VB编译器会把它当作方法调用处理,但Insert不是VB内置方法,就算是方法,参数也没按要求用括号包裹——本质是混淆了SQL语句和VB代码的语法规则。
  2. BC32017错误:同理,直接写SQL语句导致VB编译器无法识别into这个SQL关键字,把它当成了VB表达式的一部分,引发语法混乱,找不到合法的分隔符(逗号、括号)。

解决方法

必须把SQL插入语句作为字符串参数,传给你项目中定义的SQL.ExecQuery方法,同时强烈建议用参数化查询避免SQL注入风险,以下是具体修复方案:

推荐修复(参数化查询)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dteAdded As DateTime = Now()
        If SQL.HasConnection = True Then
            If IsAuthenticated() = True Then
                AuthUser = TextBox1.Text
                ' 定义参数化SQL语句
                Dim insertSql As String = "INSERT INTO LogonTable(UserName, DateIn) VALUES (@UserName, @DateIn)"
                ' 假设你的SQL类支持添加参数的方法(比如AddParam)
                SQL.AddParam("@UserName", AuthUser)
                SQL.AddParam("@DateIn", dteAdded)
                ' 执行查询
                SQL.ExecQuery(insertSql)
    
                Me.Hide()
                MainScreen.Show()
            End If
        End If
End Sub

临时修复(字符串拼接,不推荐)

如果你的SQL类不支持参数化,至少要正确拼接SQL字符串,注意日期格式的转换:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim dteAdded As DateTime = Now()
        If SQL.HasConnection = True Then
            If IsAuthenticated() = True Then
                AuthUser = TextBox1.Text
                ' 拼接SQL字符串,注意日期转成数据库兼容格式
                Dim insertSql As String = $"INSERT INTO LogonTable(UserName, DateIn) VALUES ('{AuthUser}', '{dteAdded.ToString("yyyy-MM-dd HH:mm")}')"
                SQL.ExecQuery(insertSql)
    
                Me.Hide()
                MainScreen.Show()
            End If
        End If
End Sub

关键注意点

  • 永远不要直接在VB代码里写裸SQL语句,必须把SQL作为字符串传给数据库执行方法。
  • 参数化查询是最优解,既能避免SQL注入,又能避免日期、特殊字符导致的语法错误。

内容的提问来源于stack exchange,提问作者MGC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:05:04