【发布时间】:2013-10-23 08:42:24
【问题描述】:
DataTable在我加载时必须有多行时返回仅一行:
Dim comm As New MySqlCommand
Dim conn As New MySqlConnection
With comm
.CommandText = "SELECT tblSupplierPO.supplier_POID, tblSupplier.supplier_name, tblSupplierPO.supplier_PODate, tblCategory.category_description, tblSupplierPOList.part_num, tblSupplierPOList.item_name, tblSupplierPOList.order_qty, tblUnit.unit_name FROM tblSupplierPO INNER JOIN tblSupplierPOList ON tblSupplierPO.supplier_POID = tblSupplierPOList.supplier_POID INNER JOIN tblSupplier ON tblSupplierPO.supplier_id = tblSupplier.supplier_id INNER JOIN tblUnit ON tblSupplierPOList.unit_id = tblUnit.unit_id INNER JOIN tblCategory ON tblSupplierPOList.category_id = tblCategory.category_id WHERE tblSupplierPOList.supplier_POID LIKE 'po-1010'"
.connection = conn
.ExecuteNonQuery
End With
然后将其加载到我的 DataTable...
DataTable1.Load(comm.ExecuteReader)
当我使用消息框对其进行测试时...
MsgBox(DataTable1.Rows.Count)
它只返回一行...但是当我将 commandText 复制粘贴到 PhpMyAdmin SQL 并运行它时,它显示了完整的 5 行。请在这里提供一点帮助...谢谢!
我使用 MS VisualStudio2012
【问题讨论】:
-
我很确定
ExecuteReader为您提供了一个只进游标,它一次处理一行。要填充数据表,请尝试使用数据适配器。 this page 上的第一个代码示例显示了如何。 -
另一件事:我向右滚动了几英尺,看到您的查询以
WHERE tblSupplierPOList.supplier_POID LIKE 'po-1010'结尾。如果您的真实代码在这里替换了用户提供的值,则您对 SQL 注入持开放态度,这并不好。我建议使用准备好的语句,它适用于数据适配器。有一个例子here。 -
另外,你应该知道
.ExecuteNonQuery这一行运行查询并给你记录的数量,然后你再次运行它,所以你无缘无故地对你的数据库运行了两次查询.把那条线去掉,不需要。 -
但我需要使用
DataTable,因为我需要将这些数据显示在 Crystal Report 上,而且我认为使用DataAdapter不会显示我的数据在我的 CReport 正确... -
请注意,
comm.ExecuteReader将成功填充DataTable而不会出现问题。DataAdapter不是必需的。