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
错误原因
- BC30800错误:你直接在VB代码里写了SQL的
Insert语句,VB编译器会把它当作方法调用处理,但Insert不是VB内置方法,就算是方法,参数也没按要求用括号包裹——本质是混淆了SQL语句和VB代码的语法规则。 - 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
相关产品推荐
相关产品推荐

