数据适配器问题

时间:2018-01-30 13:10:48

标签: sql vb.net oledbdataadapter

当我运行代码时,填充我的数据表的行表示没有给出一个或多个参数的值

Order = New OleDb.OleDbDataAdapter("SELECT * FROM Orders WHERE 
Driver_ID = " & ID, DBREF)
Order.Fill(dataODtable)
DGVorders.DataSource = dataODtable

代码说:

  

未处理的类型' System.Data.OleDb.OleDbException'   发生在System.Data.dll

下面是它引用的数据库和表的图像链接。 (数据库订单表)

enter image description here

如果我尝试在没有崩溃的情况下运行没有where语句的代码。

3 个答案:

答案 0 :(得分:1)

字段DRIVER_ID显然是一个字符串,因此您需要围绕要用于WHERE子句的值的单引号。
但是由于一系列原因(Sql Injection,Parsing错误,具有不兼容语言环境的自动类型转换),这将是错误的。

所以你真的需要尽快开始使用参数化查询以避免这些错误

Dim cmdText = "SELECT * FROM Orders WHERE Driver_ID = @drvID"
Order = New OleDb.OleDbDataAdapter(cmdText, DBREF)
Order.SelectCommand.Parameters.Add("@drvID", OleDbType.VarWChar).Value = ID
Order.Fill(dataODtable)
DGVorders.DataSource = dataODtable

现在查询不再构建在一起连接字符串片段(sql注入黑客的主要来源),但是您创建了一个正确类型的参数对象,并将其传递给将在需要时使用它的数据库引擎。
另一个好处是你得到的代码更清晰。在这种情况下,可能不是很明显,但是对于更复杂的查询,您将更清楚地了解您要对数据库做什么。

答案 1 :(得分:0)

您可以尝试这样:

Order = New OleDb.OleDbDataAdapter("SELECT * FROM Orders WHERE 
Driver_ID = '"& ID &"'", DBREF)
Order.Fill(dataODtable)
DGVorders.DataSource = dataODtable

也许这就是问题所在。

答案 2 :(得分:0)

如果Driver_ID是字母数字列,则选择查询应为SELECT * FROM Orders WHERE Driver_ID = '" & ID & "' ;"