另一个没有给出一个或多个所需参数问题的值

时间:2017-05-31 11:11:35

标签: sql vb.net ms-access oledbdataadapter

我试图从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_querys过程生成的查询替换为良好的脚本,例如"选择*来自Horse"它没有问题。所以看起来这个问题出现在查询生成中,但如果只是在访问中运行,它会按预期工作,这让我感到困惑。

因此,似乎Access接受的查询与通过oleDbDataAdapter提交给同一数据库的查询之间存在脱节。

如果有人能以我的方式看到错误,我会很感激。

由于

1 个答案:

答案 0 :(得分:0)

感谢您的所有建议。我花了最后4个小时尝试你的每一个建议。回答Timothy G.我在这个应用程序的其他地方有完全相同的语法,并且对fill()语句的语法感到满意。

在回答Andre的评论时,我在应用程序的其他部分使用了Name和IMAGE,这没有任何问题。我已经更改了这些字段的名称,但我仍然有问题。

我简要介绍了XMLliterals,我猜你最熟悉的是什么。这是我创建运行时查询15年的方式,所以我觉得很难教老狗的新技巧。我不得不反对它使你的SQL更具可读性。我在日常工作中体验XML代码,我发现它非常冗长,并且经常使简单的任务过于复杂。我们只需同意不同意:)

为了减少追逐,我找到了问题,这是我的错。它归结为Timothy G所建议的,一个简单的拼写问题,因为我在针对一个数据库运行应用程序并针对同一数据库的副本测试查询。

这是罪魁祸首

Associates.Name1 as Breeder

它应该是

Associates.FamilyName as Breeder

再次感谢你。

彼得