【问题标题】:No value given for required parameters, with value所需参数没有给出值,有值
【发布时间】:2015-04-26 05:51:35
【问题描述】:

我正在使用 c#/ASP.NET 开发 Web 应用程序。 作为应用程序的一部分,我想连接到 ms-access 数据库,并从中获取值到 dataset

由于某种原因,我在用DataAdaptor 填充dataset 时出现标题错误-尽管如此,当我使用断点时,我可以看到命令如下: SELECT ..... WHERE ItemID = @value0(如果你需要参数,请向他们索取,我会复制整个内容)。

我还可以看到 @value0 的值为 2 并带有断点,我确信它是查询中的唯一值。

我的问题是,这怎么会发生?如果查询中的唯一值被填充,我错过了什么?

编辑: 完整查询: SELECT ItemName as Name,ItemPicture as Picture,ItemHeroModif as Assistance,ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems FROM Item WHERE ItemID = @value0"

完整的构建代码(为每个用户生成查询需要不同数量的项目,这个只有一个项目,所以我用它来测试):

static public DataSet getUserShopItemDS(string username,List<shopItem> items)
{
string madeForCommand = "SELECT ItemName as Name,ItemPicture as Picture,ItemHeroModif as Assistance,ItemTroopModif as Charisma, HerbCost as Herbs, GemCost as Gems FROM Item WHERE ItemID = ";
        int count = 0;
        foreach (shopItem item in items)
        {
            madeForCommand += "@value"+count+" OR ";
            count++;
        }
        madeForCommand = madeForCommand.Substring(0, madeForCommand.Length - 3);
        OleDbCommand command = GenerateConnection(madeForCommand);
        for (int ii = 0; ii < items.Count; ii++)
        {
            command.Parameters.AddWithValue("@value" + ii, items[ii].ID);
        }
        var FreestyleAdaptor = new OleDbDataAdapter();
        FreestyleAdaptor.SelectCommand = command;
        DataSet Items = new DataSet();
        FreestyleAdaptor.Fill(Items);//The error is thrown here.
        return Items;
    }

编辑 2: - shopitem 类:

public class shopItem
{
    //Irrelevant parameters,
    public int ID // Whenever a user logs in, I create a list of his items, and attach each one it's ID from the database. I send the list as a parameter to the function.
    {
        get;
        private set;
    }
    public shopItem(int ID)
    {
        this.ID = ID;
    }
    public shopItem() { }
    // more constructors.
}

【问题讨论】:

  • 请添加一些代码
  • 似乎是一个很容易解决的问题,但我们肯定需要看代码:-)
  • @SaagarEliasJacky 完成。
  • @PaoloCosta 很高兴听到 - 已编辑 (:
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# ms-access oledb


【解决方案1】:

这是您应该使用的代码:

        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++)
        {
            madeForCommand += "ItemId = ?  OR ";
            command.Parameters.AddWithValue("value" + ii, items[ii].ID);
        }

        madeForCommand = madeForCommand.Substring(0, madeForCommand.Length - 3);

在 MS Access 中,参数是使用 ?并且必须按照在查询中使用的顺序提供。

【讨论】:

  • 非常感谢,这将解决未来的问题 - 但是,就我而言,我只有一项给用户,所以它没有解决我当前的问题。 +1 (:
  • 尝试调试这行代码,看看你设置的参数值是什么 command.Parameters.AddWithValue(substr, items[numOutOfSubstr].ID);
  • 不管怎样,你的代码似乎真的有问题,ItemId 必须重复 foreach OR 条件,所以从第一个字符串中删除它并添加到循环中:madeForCommand += " ItemId = @value "+count+" 或 ";
  • ID 为 2 - 应该是这样;这正是我感到困惑的原因。不过,我不明白你的第二条评论,对不起:/你能改写一下/编辑你的帖子吗?
  • 如果你添加类 shopItem 的定义我可以提供一个解决方案。您解析查询以查找参数的方式真的很奇怪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2016-05-13
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多