Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据适配器故障_Sql_Vb.net_Oledbdataadapter - Fatal编程技术网

Sql 数据适配器故障

Sql 数据适配器故障,sql,vb.net,oledbdataadapter,Sql,Vb.net,Oledbdataadapter,当我运行代码时,填充数据表的那一行表示没有为一个或多个参数给定值 Order=New OleDb.OleDbDataAdapter(“从订单中选择*,其中 驱动程序_ID=“&ID,DBREF) Order.Fill(数据表) DGVorders.DataSource=dataODtable 守则上说: “System.Data.OleDb.OLEDBEException”类型的未处理异常 发生在System.Data.dll中 下面是数据库及其引用的表的图像链接。 (数据库订单表) 如果我

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

Order=New OleDb.OleDbDataAdapter(“从订单中选择*,其中
驱动程序_ID=“&ID,DBREF)
Order.Fill(数据表)
DGVorders.DataSource=dataODtable
守则上说:

“System.Data.OleDb.OLEDBEException”类型的未处理异常 发生在System.Data.dll中

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


如果我尝试在不使用where语句的情况下运行代码,它将不会崩溃。

字段驱动程序ID显然是一个字符串,因此您需要在希望用于where子句的值周围加上单引号。
但这可能是错误的,原因有很多(Sql注入、解析错误、使用不兼容的区域设置进行自动类型转换)

因此,您确实需要尽快开始使用参数化查询,以避免这些错误

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注入黑客的主要来源)连接在一起构建的,而是创建一个正确类型的参数对象,并将其传递给数据库引擎,该引擎将在需要时使用它。
另一个好处是代码越清晰。在这种情况下,可能不是很明显,但通过更复杂的查询,您将更清楚地了解您要求对数据库执行的操作。

您可以这样尝试:

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

可能这就是问题所在。

如果
Driver\u ID
是字母数字列,则select查询应该是
select*FROM Orders,其中Driver\u ID='“&ID&';“

使用参数…
Driver_ID='”&ID&““
用记号括起ID。好的,谢谢您提供有关如何使我的代码更美观的建议。我真的需要努力。只有一个问题,我刚刚开始学习SQL,我想知道order.selectcommand.parameters.add()函数的作用是什么?创建适配器时,它会获取命令文本,并在属性selectcommand下构建一个OleDbCommand对象。此命令接收查询文本,您可以向其中添加参数。当查询文本(@something)中存在参数占位符时,数据库引擎将使用参数值。OleDb有其他规则,但在您的简单情况下,它们并不重要。此模式允许您避免命令文本中的复杂字符串连接(以及所有可能的错误),并删除任何Sql注入路径,同时,您可以精确地传递给数据库引擎的内容。当您升级到更强大的引擎(Sql Server、Oracle)时,他们可以使用此模式优化检索数据所需的代码,并在响应中实现更高的可伸缩性。这就解决了问题。我觉得有点失望,这是一个如此简单的修复,我没有看到它。