【问题标题】:Yet another no value given for one or more required parameters issue另一个没有为一个或多个必需参数问题提供值
【发布时间】: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


【解决方案1】:

感谢您的所有建议。在过去的 4 个小时里,我一直在尝试您的每一个建议。作为对 Timothy G 的回答。我在这个应用程序的其他地方有完全相同的语法,它对 fill() 语句的语法很满意。

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

我简要了解了 XMLliterals,我想它是您最熟悉的。这就是我 15 年来创建运行时查询的方式,所以我想教老狗新技巧很难。我不得不不同意它使您的 SQL 更具可读性。我在日常工作中遇到过 XML 代码,我发现它非常冗长,而且常常使简单的任务过于复杂。我们只需要同意不同意:)

切入正题,我发现了问题,这是我的错。它归结为 Timothy G 的建议,一个简单的拼写问题,因为我针对一个数据库运行应用程序并针对同一数据库的副本测试查询而变得复杂。

这是罪魁祸首

Associates.Name1 as Breeder

应该是

Associates.FamilyName as Breeder

再次感谢大家。

彼得

【讨论】:

  • ...虎头蛇尾。 :) 不过,我建议使用.[Name],以避免任何潜在问题。
  • 请接受您自己的答案,以便问题显示为已关闭。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多