【问题标题】:Query not executing when adding a parameter添加参数时查询未执行
【发布时间】:2014-05-28 15:21:58
【问题描述】:

我正在为 Access 数据库使用 OleDB 提供程序,使用 C# VS2010 进行开发

我有一个Products表和Suppliers表

当我调试这段代码时:

//open connection
con.Open();

//set command query for inserting a product
com2 = new OleDbCommand(@"INSERT INTO Products (ProductName,Model,Provider,Manufacturer,ReleasedDate,Quantity,SupplierID) 
VALUES (@name,@model,@provider,@manf,@date,@quantity,@supp)", con);

/* ADDING PARAMETERS TO THE COMMMAND */
com2.Parameters.AddWithValue("@name", textBox1.Text);
com2.Parameters.AddWithValue("@model", textBox2.Text);
com2.Parameters.AddWithValue("@provider", textBox4.Text);
com2.Parameters.AddWithValue("@manf", textBox5.Text);
com2.Parameters.AddWithValue("@date", DbType.DateTime).Value = dateTimePicker1.Value;
com2.Parameters.AddWithValue("@quantity", Convert.ToInt32(textBox6.Text));
//  com2.Parameters.AddWithValue("@price", Convert.ToInt32(textBox3.Text));

/* Getting the ID of the Supplier by his/her/it name and adding the value as a parameter */
com = new OleDbCommand("Select SupplierID from Suppliers WHERE SupplierName=@name",con);
com.Parameters.AddWithValue("@name",comboBox1.SelectedValue);
int str = (int)com.ExecuteScalar();
com2.Parameters.AddWithValue("@supp", str);

//INSERT EXECUTION
com2.ExecuteNonQuery();
MessageBox.Show("Product Added To Stock");
con.Close();

程序运行良好并执行查询,但是当我取消注释该行

com2.Parameters.AddWithValue("@price", Convert.ToInt32(textBox3.Text));

并将com2查询字符串编辑为:

com2 = new OleDbCommand(@"INSERT INTO Products (ProductName,Model,Provider,Manufacturer,ReleasedDate,Quantity,SupplierID,Price) 
            VALUES (@name,@model,@provider,@manf,@date,@quantity,@supp,@price)", con);

程序在com2.ExecuteNonQuery(); 行崩溃并出现以下错误:

You cannot add or change a record because a related record is required in table 'Suppliers'.

注意事项:

  1. 如果您想知道我为什么要添加价格,那是因为我没有 从一开始就添加它
  2. Price 列存在于表Products 中
  3. 我删除了两个表中的所有记录
  4. 价格列类型:数字 - 长整型
  5. SupplierID 是 Suppliers 表中的主键
  6. 调试时,str 的值为 4,与其中一个供应商的值相同

【问题讨论】:

  • 列类型是什么?
  • @EhsanSajjad 数字 - 长整数
  • 我怀疑供应商 ID 错误,供应商表中不存在该 ID 的行
  • 是的。确保SupplierID存在于Supplier表中,因为是外键,所以出现了。
  • @EhsanSajjad 我调试了程序,str 的值为 4 ,这是其中一个供应商的 ID

标签: c# database ms-access-2010


【解决方案1】:

尝试移动这条线:

com2.Parameters.AddWithValue("@price", Convert.ToInt32(textBox3.Text));

设置@Supp参数后,看看错误是否依旧

【讨论】:

  • 哇!不知道参数添加顺序有什么不同
  • 好像是@S。安是对的。参数的顺序很重要。另一种可能的解决方案是在添加所有参数之前移动获取 supp 的代码块。
  • 有趣的是,我正在考虑给出你的答案,但我认为让 OP 更改查询比解释将代码移动到哪里更容易。哦,生活和学习。 :-)
【解决方案2】:

这里的问题很可能是由于您作为 @sup 参数值提供的供应商 ID 未包含在供应商表中(外键约束)。您推送的数据是否可能在运行不带价格参数的查询字符串和运行带价格参数的查询字符串之间发生了变化?

"您尝试执行的操作违反了相关表的参照完整性规则。例如,如果您尝试在“多”表中以一对一的方式更改或插入记录,则会发生此错误-many 关系,并且该记录在“一”侧的表中没有相关记录。 如果要添加或更改记录,请先在“一”表中添加一条记录,该记录包含匹配字段的相同值。” -- Microsoft Office 支持

【讨论】:

  • S. Ahn 提出了一个很好的观点,问题是您将价格变量的值传递给查询中的供应商 ID 字段,这将导致外键约束错误。
【解决方案3】:

改变这一行

com2 = new OleDbCommand(@"INSERT INTO Products (ProductName,Model,Provider,Manufacturer,ReleasedDate,Quantity,SupplierID,Price) 
        VALUES (@name,@model,@provider,@manf,@date,@quantity,@supp,@price)", con);

到

com2 = new OleDbCommand(@"INSERT INTO Products (ProductName,Model,Provider,Manufacturer,ReleasedDate,Quantity,Price,SupplierID) 
        VALUES (@name,@model,@provider,@manf,@date,@quantity,@price,@supp)", con);

您将price 作为@supp 和supp 作为@price 发送。订单很重要。其他提供程序允许您“按名称绑定”,但不允许 OleDb。

更新:根据 George T 更正了查询。

【讨论】:

  • 这将使列不匹配。在代码中,@supp 参数是最后一个。
  • 同样的错误,(你想做什么?)你正在改变参数索引!这是不对的
  • 您将 Price 放入 SupplerID 并支持 Price
  • @GabourX,我在答案中添加了更多信息。参数的名称几乎无关紧要。添加到Parameters时需要保留顺序。
  • @S.Ahn:您的想法是正确的,但您的答案中的查询是错误的。您是正确的,通过您的更改,“供应商 ID”值将与“@supp”匹配。但是,您只更改了查询中“@supp”和“@price”的顺序,而不是“SupplierID”和“Price”的顺序。所以 SQL 会将 "@supp" 匹配到 "Price"。
猜你喜欢
  • 2018-05-02
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多