【发布时间】:2017-05-31 11:11:34
【问题描述】:
我正在尝试从 Visual Studio 2010 中的 VB 访问数据库中获取数据。
我正在运行时创建一个选择查询,它应该返回 1 行。然后我从返回的行中收集数据并将其放在屏幕上。
这是生成查询的代码。
Dim ls_querystring as string
ls_querystring = "SELECT Horses.Name, "
ls_querystring = ls_querystring & "Horses.Horseid, "
ls_querystring = ls_querystring & "Horses.Regno, "
ls_querystring = ls_querystring & "Horses.HorseType, "
ls_querystring = ls_querystring & "Horses.Sex, "
ls_querystring = ls_querystring & "Horses.Colour, "
ls_querystring = ls_querystring & "Horses.Ownerid, "
ls_querystring = ls_querystring & "Horses.Notes, "
ls_querystring = ls_querystring & "Horses.Sireno, "
ls_querystring = ls_querystring & "Horses.Damno, "
ls_querystring = ls_querystring & "Horses.Birthdate, "
ls_querystring = ls_querystring & "Horses.DNA, "
ls_querystring = ls_querystring & "Horses.Inscribe, "
ls_querystring = ls_querystring & "Horses.Revised, "
ls_querystring = ls_querystring & "Horses_1.Name as SireName, "
ls_querystring = ls_querystring & "Horses_2.Name as DamName, "
ls_querystring = ls_querystring & "Horses.IMAGE, "
ls_querystring = ls_querystring & "Associates.Name1 as Breeder "
ls_querystring = ls_querystring & " FROM ((Horses INNER JOIN Horses AS
Horses_1 ON Horses.Sireno = Horses_1.Regno) INNER JOIN Horses AS Horses_2 "
ls_querystring = ls_querystring & " ON Horses.Damno = Horses_2.Regno) INNER
JOIN Associates ON Horses.Breederid = Associates.AssocID "
ls_querystring = ls_querystring & " WHERE Horses.Regno = "
& Chr(34) & ls_RegNo & Chr(34)
变量 ls_Regno 被定义为一个字符串,并在创建 ls_querystring 时有一个值。
运行时 ls_querystring 包含:
SELECT Horses.Name, Horses.Horseid, Horses.Regno, Horses.HorseType,
Horses.Sex, Horses.Colour, Horses.Ownerid,
Horses.Notes, Horses.Sireno, Horses.Damno, Horses.Birthdate, Horses.DNA,
Horses.Inscribe,
Horses.Revised, Horses_1.Name as SireName, Horses_2.Name as DamName,
Horses.IMAGE,
Associates.Name1 as Breeder
FROM ((Horses INNER JOIN Horses AS Horses_1 ON Horses.Sireno =
Horses_1.Regno)
INNER JOIN Horses AS Horses_2 ON Horses.Damno = Horses_2.Regno)
INNER JOIN Associates ON Horses.Breederid = Associates.AssocID
WHERE Horses.Regno = "SO0324"
如果我对 Access 数据库运行它,它会返回预期的单行。
但是,当我将它包含在以下代码中时,它会失败并显示 在 da.Fill(datat) 语句中没有为一个或多个必需参数提供值发出消息。
Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\Web\horsebook.mdb")
Dim datat As New DataTable
Dim da As New OleDbDataAdapter(ls_querystring, cn)
da.Fill(datat)
da.Dispose()
cn.Dispose()
如果我将 ls_querystring 进程生成的查询替换为诸如“Select * from Horse”之类的良性脚本,则它可以正常工作。因此,问题似乎出在生成的查询中,但是如果只是在访问中运行,它按预期工作的事实让我感到困惑。
因此,Access 接受的查询与通过 oleDbDataAdapter 提交到同一数据库的查询之间似乎存在断开连接。
如果有人能以我的方式看到错误,我将不胜感激。
谢谢
【问题讨论】:
-
会不会是因为你在使用
Fill()时遗漏了一个参数? MSDN 没有显示只接受 DataTable 的有效重载。另外,请确保所有内容都是spelled right and of correct case。也许您在 SELECT 中有一个列名引用拼写错误。 -
.Name- 名称是保留字,尝试使用.[Name]或(更好)避免使用此列名。这也适用于.IMAGE。 -
P.S. +1 包括实际生成的 SQL,因此在询问有关动态 SQL 的问题时很少有人这样做。
-
我强烈建议您学习如何使用 XML 文字。这将使您的 SQL 代码更具可读性。你真的应该为
Regno值使用一个参数。 -
感谢您的所有建议。在过去的 4 个小时里,我一直在尝试您的每一个建议。作为对 Timothy G 的回答。我在这个应用程序的其他地方有完全相同的语法,它对 fill() 语句的语法很满意。
标签: sql vb.net ms-access oledbdataadapter