【问题标题】:Access SQL query missing more required parameters访问 SQL 查询缺少更多必需参数
【发布时间】:2015-07-08 06:04:13
【问题描述】:

在一个网络项目中,我正在尝试执行以下查询:

SELECT ItemName as Name,
       ItemPicture as Picture,
       ItemHeroModif as Assistance,
       ItemTroopModif as Charisma,
       HerbCost as Herbs,
       GemCost as Gems
FROM Item WHERE ItemId = @value0

通过断点,我可以看到我附加到 @value0 的值 2

尽管如此,我收到以下错误:

没有为一个或多个必需参数指定值。

我了解此错误通常是由于 SQL 语法错误而产生的。我的所作所为有什么问题吗?

编辑

附件代码:

var madeForCommand = "SELECT ItemName as Name,ItemPicture as [Picture],ItemHeroModif as Assistance,ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems FROM Item WHERE ";
OleDbCommand command = new OleDbCommand();
for (int ii = 0; ii < items.Count; ii++)// items is a list of items with IDs I want to get from the query.
{
    madeForCommand += "ItemId =@value"+ii+" OR ";   
}
madeForCommand = madeForCommand.Substring(0, madeForCommand.Length - 4); // making sure I trim the final or; In the case I shown, it's just one item, so there are none at all.

后来:

OleDbCommand forOperations = new OleDbCommand(madeForCommand, _dbConnection); //_dbConnection is the connection to the database, it seems to work pretty well.
for (int ii = 0; ii < items.Count; ii++) 
{
    string attach = "@value" + ii;
    command.Parameters.AddWithValue(attach, items[ii].ID);
}

我很确定items[ii].ID 没问题,断点显示它等于 2 并且附件正常。

编辑 2: 我按照 Krish 和 Hans 的建议编辑了代码,我得到以下查询,没有任何附件:

SELECT ItemName as [Name],ItemPicture as Picture,ItemHeroModif as Assistance,ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems FROM [Item] WHERE (ItemID in (2));

如果有任何改变,我仍然会遇到同样的错误。

编辑 3: 在 Access 中执行查询要求我给参数“ItemPicture”一个值... ItemPicture 是一个列,不是吗?

【问题讨论】:

  • 发布您设置值的代码。
  • 你能把你设置@value0的代码贴到2吗?这大概就是问题所在。此外,有时您将参数设置为null 并得到相同的错误。
  • @Kobi 用代码编辑。
  • 您应该尝试直接在 MS Access 中运行查询。例如,如果您拼错列名,Access 会认为它是一个参数。因此,请确保所有列名的拼写正确。
  • 您还可以将“items”转换为逗号分隔的字符串并将其传递给 SQL,而不是使用 for 循环。我总是被告知不要使用循环来执行多个单独的查询。为此,请使用类似于 @krish 使用的查询

标签: c# sql ms-access


【解决方案1】:

NameItemPicture 在 Access 查询中是 problem words。将它们括在方括号中:

SELECT ItemName as [Name], ItemPicture as [Picture], ItemHeroModif as Assistance, ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems
FROM [Item] WHERE ItemID in (2);

由于将这些名称括起来仍然会给您一个缺少参数的投诉,因此我要求您在 Access 的查询设计器中测试该查询。在这种情况下,Access 提供了一个参数输入框,其中还包括 Access 解释为参数的单词。

您报告 Access 认为 ItemPicture 是一个参数。因此,通过在 Access Design View 中检查该表,您发现实际的字段名称是 ItemImageURL

SELECT ItemName as [Name], ItemImageURL as [Picture], ItemHeroModif as Assistance, ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems
FROM [Item] WHERE ItemID in (2);

【讨论】:

  • 好点,我过去也遇到过这样的错误 - 但是,这并没有解决问题,我得到了同样的错误信息:/
  • 我没有注意到Picture。请重试。
  • 您能否在 Access 中通过查询设计器测试该查询?
  • 它要求我为“ItemPicture”提供一个值......这可能是解决问题的关键;这有什么想法吗?
  • 绝对!现在试试SELECT ItemPicture FROM [Item]; 还是同样的错误?
【解决方案2】:

您没有从应用程序外部获取 Where 条件,因此字符串连接是安全的。 (至少我是这么认为的)

只需像这样添加参数:

var madeForCommand = "SELECT ItemName as Name,ItemPicture as Picture,ItemHeroModif as Assistance,ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems " +
    "FROM Item WHERE (ItemID in (";
     OleDbCommand command = new OleDbCommand();
     for (int ii = 0; ii < items.Count; ii++)// items is a list of items with IDs I want to get from the query.
     {
          if (i<=1) {
              madeForCommand += items[ii].ID
          }else {
              madeForCommand += "," + items[ii].ID;
          }
     }
    madeForCommand += "))"

最后你会得到一个类似的 SQL 查询:

"SELECT ItemName as Name,ItemPicture as Picture,ItemHeroModif as Assistance,ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems " +
"FROM Item WHERE (ItemID in (1,2,3))";

【讨论】:

  • 确实可以编译,我得到一个很好的查询 - SELECT ItemName as Name,ItemPicture as Picture,ItemHeroModif as Assistance,ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems FROM Item WHERE (ItemID in (2)); - 尽管如此,我还是得到了同样的错误。有什么想法吗?
【解决方案3】:

MS Access 不知道这样的参数:@value0!

请改用?named parameters,如下所示:

PARAMETERS [value0] INT;
SELECT ItemName as Name,
       ItemPicture as Picture,
       ItemHeroModif as Assistance,
       ItemTroopModif as Charisma,
       HerbCost as Herbs,
       GemCost as Gems
FROM Item WHERE ItemId = [value0];

如何调用这个查询?请阅读:Accessing Microsoft Office Data from .NET Applications
如需更多信息,请参阅:OleDbCommand.Parameters Property

[编辑]

据我了解,您希望将几个ItemId 传递到查询中。所以,你必须使用IN 子句:

SELECT ...
FROM ...
WHERE ItemID IN (1, 2, 5, 8)

【讨论】:

  • 我明白了.... 但是,正如您从我的代码中看到的那样,我动态地进行查询。我将如何使用这种语法来做到这一点?我之前也做过类似的查询,只是这个似乎不起作用....
  • 正如我在回答中提到的,您可以通过 ?: WHERE ItemId = ? 使用非命名参数;)
  • 我很难理解你的意思......我在谷歌中查找了参数,但我不知道语法是怎么回事(这不是我以前做查询的方式);你能给我一个简单的例子,这样我以后做这些事情会更容易吗?提前致谢!
  • 我如何动态附加这些值?我可以使用 AddWithValue() 吗?
  • 没有。您必须在 for-next 循环内构建查询字符串。没有参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2018-10-28
  • 2018-12-01
相关资源
最近更新 更多