添加参数时查询不执行

时间:2014-05-28 15:21:58

标签: c# database ms-access-2010

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

我有产品表和供应商

当我调试此代码时:

//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. 价格列位于表格Products
  3. 我删除了两个表中的所有记录
  4. 价格列类型:数字 - 长整数
  5. SupplierID是“供应商表”中的主键
  6. 调试时,str值为4,与其中一个供应商的值相同

3 个答案:

答案 0 :(得分:1)

尝试移动此行:

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

设置@Supp参数后,查看错误是否仍然存在

答案 1 :(得分:0)

更改此行

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更正了查询。

答案 2 :(得分:0)

此处的问题很可能是由于您提供的供应商ID作为@sup参数的值未包含在Suppliers表(外键约束)中。您输入的数据是否可能在没有price参数的查询字符串运行和使用price参数运行查询字符串之间发生了变化?

“您试图执行违反相关表的参照完整性规则的操作。例如,如果您尝试在”多“表中更改或插入记录,则会发生此错误 - 很多关系,而且该记录在“一”方面的表格中没有相关记录。 如果要添加或更改记录,请首先将记录添加到“one”表中,该表包含匹配字段的相同值。“ - Microsoft Office支持