0

テーブルを作成し、主キー列を自動インクリメントしました。ローカルでホストされている .NET プラットフォームの C# で Web フォームを作成しました。Web フォームからデータを入力しようとすると問題が発生します。他のフィールドに入力しても主キー列が自動的に入力されず、入力した値が取り込まれません。

  1. 自分で値を入力すると、「IDENTITY_INSERT が OFF に設定されている場合、テーブル 'Product' の ID 列に明示的な値を挿入できません」と表示されます。

  2. 値を入力しないと、次のように表示されます。

    「,」付近の構文が正しくありません。ソース エラー:

    行 41: objCommand.Connection=objConnection;

    42 行目: objCommand.CommandText = "Insert into Product(CustomerName,CustomerAddress,InvoiceNumber,InvoiceDate,ProductName,ProductDescription,UnitCost,Quantity,TotalAmountToBePaid) 値 ('" + tbcustomername.Text+ "','" + tbcustomeraddress.Text + "' ," + tbinvoicenumber.Text + ",'"+tbinvoicedate.Text + "','" + tbproductname.Text + "','" + tbproductdescription.Text + "'," + tbunitcost.Text + "," + tbquantity .Text + "," + tbamounttobepaid.Text + ")";

    行 43: objCommand.ExecuteNonQuery();

    44 行目:

    45 行目:

私はそれを自動インクリメントしたので、他の列を埋めるときに自動的に値を取得したいのですが、それは起こりません。私は何をしますか?

4

1 に答える 1

1

コマンドを変更できます。

objCommand.CommandText = "INSERT INTO Product " +
   "(CustomerName,CustomerAddress,InvoiceNumber,InvoiceDate,ProductName,"+  
   "ProductDescription,UnitCost,Quantity,TotalAmountToBePaid) VALUES " + 
   "(@cname, @caddress, @inumber, @idate, @pname, @pdesc, @unitcost, @qty, @total); " +
   "SELECT SCOPE_IDENITY();";

objCommand.Parameters.Add(new SqlParameter("@cname", tbcustomername.Text));
objCommand.Parameters.Add(new SqlParameter("@caddress", tbcustomeraddress.Text));
objCommand.Parameters.Add(new SqlParameter("@inumber", int.Parse(tbinvoicenumber.Text)));
objCommand.Parameters.Add(new SqlParameter("@idate", DateTime.Parse(tbinvoicedate.Text)));
objCommand.Parameters.Add(new SqlParameter("@pname", tbproductname.Text));
objCommand.Parameters.Add(new SqlParameter("@pdesc", tbproductdescription.Text));
objCommand.Parameters.Add(new SqlParameter("@unitcost", decimal.Parse(tbunitcost.Text)));
objCommand.Parameters.Add(new SqlParameter("@qty", int.Parse(tbquantity.Text)));
objCommand.Parameters.Add(new SqlParameter("@total", decimal.Parse(tbamounttobepaid.Text)));

int id = (int)objCommand.ExecuteScalar(); 

これは、アクセスしたい、このトランザクションに挿入された最後の ID を返します。1 つのコマンドで複数のステートメントを送信できることを覚えておくとよいでしょう。

また、@ Wiktor_Zychla が以下のコメントで述べているように、SQL インジェクションから逃れるためにクエリでパラメーターを使用することをお勧めします。

于 2012-07-10T14:58:47.403 に答える