0

ねえ、私はこのクエリを実行しようとしています:

command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "','" + "(SELECT ProductId FROM Products WHERE ProductName =N'" + listBox1.Text + "')','" + listBox1.Text + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");

今はcommand.UseSqlCommandクエリを実行しているだけですが、このエラーが発生し続けます: 「intel」付近の構文が正しくありません

(intel は「ProductName」です (ここから取得します:

SELECT ProductId FROM Products WHERE ProductName =N'" + listBox1.Text + "'

編集:これはコマンドの値です(「intel」の近くで「不正な構文を取得しています」)

INSERT INTO DisplayOrders 
Values ('2', '(SELECT ProductId FROM Products WHERE ProductName =N'Intel Quad Core i5 3470 3.2Ghz 6MB Tray')','Intel Quad Core i5 3470 3.2Ghz 6MB Tray','1','900')"
4

4 に答える 4

3

他の人が述べているように、この問題を克服するパラメータ化されたクエリを使用する必要があります。しかし、あなたの質問に「そのまま」答えるには...

一重引用符を二重に閉じる必要があります。これを確認する最善の方法は、文字列に保存し、トレースにデバッグ/書き込みすることです。ここでクエリを二重に閉じる方法の例: How to insert text with single quote sql server 2005

そのままでは、クエリ文字列には次のようなものが含まれます。

INSERT INTO DisplayOrders Values ('1234','(SELECT ProductId FROM Products WHERE ProductName =N'Fred')'...

しかし、実際には次のようなものが含まれている必要があります ( に注意してください'''):

INSERT INTO DisplayOrders Values ('1234','(SELECT ProductId FROM Products WHERE ProductName =N'''Fred''')'...

INSERT Valuesそれ以外の場合は、 not theSELECTステートメントを閉じています。

于 2013-04-10T10:02:00.263 に答える
2

SELECT ステートメントを囲む一重引用符を削除するだけです

command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "'," + 
         "(SELECT ProductId FROM Products WHERE ProductName =N'" + listbox.Text +"'), " +
         "'" + listBox1.Text + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");

ただし、リストボックス項目のいずれかに一重引用符が含まれている場合、このコードは失敗します。
SQL インジェクションはここでは問題にならないというあなたのコメントを読みましたが、学業でも使用するのは良い習慣です。少なくともに変更

string itemName = listBox1.Text.Replace("'", "''");
command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "'," + 
         "(SELECT ProductId FROM Products WHERE ProductName =N'" + itemName +"'), " +
         "'" + itemName + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");
于 2013-04-10T10:15:53.623 に答える
0

これに交換する必要があります

  command.UseSqlCommand("INSERT INTO DisplayOrders Values ('" + OrderId.Text + "'," + "(SELECT IdProduct FROM Products WHERE ProductName =N'" + listBox1.Text + "'),'" + listBox1.Text + "','" + OrderQuantity.Text + "','" + TotalCost.Text + "')");
于 2013-04-10T10:14:04.307 に答える
-2
SELECT ProductId FROM Products WHERE ProductName =N'" + listBox1.Text + "'

テーブルを返すため、insert ステートメント内で使用するのは間違っています。

this を使用する代わりに、このコマンドを単独で実行し、戻り値を取得してから、insert ステートメントを単独で実行します

于 2013-04-10T10:03:55.390 に答える