2016-10-24 7 views
2

私は映画館のためのC#プログラムを書いています。ムービーが完全に予約されている場合、プログラムはユーザーを待機リストに移動します。誰かが映画の予約をキャンセルした場合、待機リストは自動的に予約リストに移動されますTOPを使用した文の挿入と削除

私は完全なものであれば待機リストに移動するための部分をコーディングしています。 私は、待機中のリストからトップユーザーを選択して予約リストに移動するために、この部分に取り残されています。そして待機リストからその人のレコードを削除してください

これは私のsqlが待機から予約に移行するためのものです。

string myQry = "INSERT INTO reserve (ID,M_ID,R_Date) VALUES (SELECT TOP 1 (ID,M_ID,R_Date) FROM Wait WHERE M_ID=)" + mID+ " (ORDER BY R_Date ASC)"; 

この人はこの人を削除します。

 string myQry= "DELETE FROM Wait WHERE M_ID IN SELECT TOP 1 M_ID FROM Wait WHERE M_ID =" + mid; 

私の他の機能は完全に動作し、プログラムのコンパイルと実行中にエラーは発生しません。だから、私のSQLには問題があるはずだと思います。ありがとうございました。列名の周り

INSERT INTO reserve (ID,M_ID,R_Date) 
    SELECT TOP 1 ID, M_ID, R_Date 
    FROM Wait WHERE M_ID = . . .; 

括弧どちらが間違っている:私はあなたが意図し考える

INSERT INTO reserve (ID,M_ID,R_Date) 
    VALUES (SELECT TOP 1 (ID,M_ID,R_Date) FROM Wait WHERE M_ID= . . . 

:これは正しい構文ではありません

... WHERE M_ID = " + mid + " ORDER BY R_Date ASC)"; 
+4

警告! SQLインジェクションリスクアサート! http://bobby-tables.com/ –

+1

'mID'は何らかの種類の整数であると仮定しますか?もしそうでなければ、これはSQLインジェクションかもしれません...トランザクションを使用しているため、2つのステートメントがセパレートでは発生しませんか? – ebyrob

答えて

2

+0

返信いただきありがとうございます... Insertステートメントが機能しました。しかし、Delete文が機能しませんでした。 – jdk

+0

私はdelete文を更新しました。それを調べてください。ありがとうございます – jdk

0

あなたは冗長ブラケットを持っていますselectからvalues clに複数の値が返されるのと同様ですause。

潜在的なタイミングの競合のために、あなたがやっていることが安全でないように見えると付け加えるべきです。 OUTPUT句を調査する必要があります。 1つの方法は、レコードをwaitから削除し、一時テーブルに入れて、reserveに挿入することです。

1

あなたはこれを安全にするために、トランザクションを必要とするだろうが、これらの調整が働く可能性があります

string myQry = "INSERT INTO reserve (ID,M_ID,R_Date) " 
      + " SELECT TOP 1 (ID,M_ID,R_Date) " 
      + " FROM Wait WHERE M_ID=" + mID + " " 
      + " ORDER BY R_Date ASC"; 

その後、削除のために:

string myQry = "DELETE FROM Wait WHERE ID IN " 
      + " (SELECT TOP 1 ID FROM Wait WHERE M_ID =" + mID + " " 
      + " ORDER BY R_Date ASC)"; 

注:これは、上の自動インクリメントのIDを取得するために、おそらく良いでしょうWaitテーブルを変数に挿入し、それを挿入クエリと削除クエリに使用しますが、選択した値を取得する例を記述するために使用しているSQL Server APIがわかりません。

PS - IDがユーザーID(おそらく)の場合は、user_IDのように名前を変更することができます。また、1行だけを識別するには、Waitテーブルの自動インクリメントIDを使用することをお勧めします。

1

は多分ここによる

DELETE TOP (1) FROM Wait WHERE M_ID = mid 

ためのようなものがあまりにも便利かもしれません。

+0

あなたはorder by節を忘れてしまいましたが、実際には、使用中の自動インクリメントIDがないので、実際にはやや正しいことを行う方法です。 – ebyrob

関連する問題