OleDbDataAdapter参数异常:DataTable填充时提示参数未赋值
解决OleDbDataAdapter带WHERE子句查询时的OleDbException异常
嘿,你的问题大概率出在SQL语句的字符串拼接方式上,咱们来一步步拆解:
问题根源
你直接把ID变量拼进SQL里,会出现两种常见问题:
- 如果
Driver_ID是字符串类型,拼接后的SQL会变成SELECT * FROM Orders WHERE Driver_ID = ABC(假设ID是"ABC")——字符串没加单引号,数据库根本认不出这是合法的文本值,直接触发语法错误,也就是你碰到的OleDbException。 - 就算
Driver_ID是数值类型,要是ID是空值或者包含非数字字符,同样会炸;更关键的是,这种拼接方式存在严重的SQL注入风险,绝对不是数据库操作的最佳实践。
最优解决方案:参数化查询
直接用参数化查询,既能解决语法问题,又能彻底避免注入风险,代码改完是这样的:
' 用?作为OleDb的参数占位符(OleDb不支持命名参数,按顺序匹配) Dim query As String = "SELECT * FROM Orders WHERE Driver_ID = ?" ' 用Using语句自动释放资源,代码更规范 Using adapter As New OleDb.OleDbDataAdapter(query, DBREF) ' 添加参数,自动处理数据类型转换 adapter.SelectCommand.Parameters.Add(New OleDb.OleDbParameter("@DriverID", ID)) adapter.Fill(dataODtable) End Using DGVorders.DataSource = dataODtable
要是非得用字符串拼接(不推荐!)
如果暂时想快速验证,得根据Driver_ID的类型手动处理:
- 要是
Driver_ID是字符串类型,记得给ID加单引号,还要转义ID里的单引号(避免SQL语法错误):
Dim query As String = "SELECT * FROM Orders WHERE Driver_ID = '" & ID.Replace("'", "''") & "'" Dim Order As New OleDb.OleDbDataAdapter(query, DBREF) Order.Fill(dataODtable) DGVorders.DataSource = dataODtable
但还是那句话,这种方式不安全,能不用就不用。
内容的提问来源于stack exchange,提问作者the real swifty
相关产品推荐
相关产品推荐

