2016-09-23 146 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。 –