2016-09-23 95 views
1

我想在我的MYSQL数据库的Back Order表中添加一个新的Back Order。我得到的问题是,当我尝试选择Supplier_ID将其添加到Back Order Table时,该程序给我一个错误,指出“Subquery返回多个值”。什么导致“子查询返回多于一行”错误?

供应商表(如果您不清楚如何正确地构建它)

| Supplier_ID | SupName |

| 1 | EWS |

| 6 |富兰克林面包店|

返回顺序表

| BackOr_ID | Supplier_ID | BackOr_Org_Date | Sup_Name |

我目前使用MySQL查询:

CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder`(
 
in supname varchar(50), 
 
in dat date 
 
) 
 
BEGIN 
 
insert into Back_Order 
 
(
 
Supplier_ID, 
 
BackOr_Org_Date, 
 
Sup_Name 
 
) 
 
values 
 
(
 
(select Supplier_ID from Supplier Where SupName = supname), 
 
dat, 
 
supname 
 
); 
 

 
END

使用该查询的C#代码是:

MySqlCommand cmd = new MySqlCommand("sp_BackOrder", new MySqlConnection(*Connection String*)); 
 
       cmd.CommandType = CommandType.StoredProcedure; 
 
       cmd.Parameters.Add(new MySqlParameter("supname", Supp_Name)); //Supp_Name is the Supplier Name (a string variable) 
 
       cmd.Parameters.Add(new MySqlParameter("dat", DateTime.Now.ToShortDateString())); //dat is the date the Order is placed 
 
       cmd.Connection.Open(); 
 
       cmd.ExecuteNonQuery(); 
 
       cmd.Connection.Close();

我得到的唯一错误是子查询(我认为是Select Query)返回的值超过1。我试过四处寻找,甚至看着Stackoverflow,但找不到任何解决方案的问题。任何帮助,将不胜感激。

+0

你的值块没有意义 – Drew

+0

“SupName”字段是唯一的吗?它应该是? –

+0

子查询'从供应商中选择Supplier_ID其中,SupName = supname'返回多个值,因为您的数据库中至少有2个供应商具有相同的名称。当使用这些子查询时,按唯一列进行搜索。 –

回答

0

程序的参数名称supname和列名称SupName是相同的。将参数名称更改为列名以外的内容。

CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder`(
in selectedSupname varchar(50), 
in dat date 
) 
BEGIN 
insert into Back_Order 
(
Supplier_ID, 
BackOr_Org_Date, 
Sup_Name 
) 
values 
(
(select Supplier_ID from Supplier Where SupName = selectedSupname), 
dat, 
selectedSupname 
); 

END 
+0

当我将LIMIT 1添加到查询中时,无论将什么供应商名称设置为supname变量,它只返回第一个供应商。 –

+0

为每个供应商需要多少插入表格? –

+0

该查询只应添加我们下订单的供应商的Supplier_ID。因此,我们放置的每个订单都应该添加一个新行,以便在组合框中选择任何一个供应商。因此,当我选择“EWS”时,应该添加Supplier_ID 1,如果我选择“Frankies Bakery”,则应添加Supplier_ID 6.通过添加LIMIT 1,只需添加Supplier_ID 1,而不管选择的供应商如何。如果这是有道理的。 –

1

那就需要像:

delimiter $$ 
CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder` 
( in p_supname varchar(50), 
    in p_dat date 
) 
BEGIN 
    insert into Back_Order(Supplier_ID, BackOr_Org_Date, Sup_Name) 
    select Supplier_ID, p_dat, p_supname from Supplier Where SupName = p_supname; 
END$$ 
delimiter ; 

CREATE DEFINER=`root`@`%` PROCEDURE `sp_BackOrder` 
( in p_supname varchar(50), 
    in p_dat date 
) 
BEGIN 
    insert into Back_Order(Supplier_ID, BackOr_Org_Date, Sup_Name) 
    select Supplier_ID, p_dat, p_supname from Supplier Where SupName = p_supname; 
END 

两个同样的协议只是取决于你DELIMITER需求。

+0

通过C#参数添加日期,并使用supname,因为供应商名称是从组合框中提取的。这意味着我无法从供应商表中选择dat和supname。 –

相关问题