2016-09-23 2 views
1

MYSQLデータベースのBack Orderテーブルに新しいBack Orderを追加しようとしています。私が得ている問題は、Supplier_IDを選択してBack Order Tableに追加しようとすると、「サブクエリが1つ以上の値を返す」というエラーメッセージが表示されます。"サブクエリが2行以上を返します"というエラーはなぜ発生しますか?

サプライヤー表(それを適切に構造化する方法がわからない)

| 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と仮定します)が複数の値を返すことです。私は周りを見回してみたし、Stackoverflowを見ても問題の解決策を見つけることができませんでした。どんな助けもありがとう。

+0

値ブロックが意味をなしません – Drew

+0

「SupName」フィールドは一意ですか?それはすべきでしょうか? –

+0

サブクエリー 'サプライヤからのSupplier_IDの選択場所SupName = supname'は、同じ名前のデータベースに少なくとも2つのサプライヤがあるため、1つ以上の値を返します。このようなサブクエリを使用する場合は、一意の列で検索します。 –

答えて

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をクエリに追加すると、Suppnameの名前がsupname変数に設定されている場合でも、最初のSupplierが返されます。 –

+0

テーブルにはどのくらいの数の挿入が必要ですか? –

+0

クエリには、Orderを配置するサプライヤのSupplier_IDのみを追加する必要があります。ですから、私たちが置く各注文は、コンボボックスで選択されたサプライヤと新しい行を追加する必要があります。 「EWS」を選択すると、Supplier_ID 1が追加され、「Frankies Bakery」を選択するとSupplier_IDが追加されます。6. LIMIT 1を追加すると、選択されたSupplierに関係なく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が使用されます。つまり、Supplierテーブルからdatとsupnameを選択することはできません。 –

関連する問題