2016-11-21 17 views
-1

SQL Serverデータベースにデータテーブルの値を挿入するコマンドを実行すると、エラーが発生します。C#SQL文が機​​能しない

'、'の近くに構文が正しくありません。

マイコード:

for (int i = 1; i < dt.Rows.Count; i++) // i = 1 instead of 0 because of the header row 
{ 
    wipSql = "INSERT INTO tblWIP ([FSR Number], [Customer Name], REGN_NM, SUBREGN_NM, [EMP/SUPPLIER Name], [INVTY DATE], " + 
      "[COST CATEGORY], [PL&M AMOUNT], [LABOR AMOUNT], [T&L PERDIEM], [MEMO COST], [EDI SEQ#], [INVOICE NUMBER], [Grand Total], Age, Business) " + 
      "VALUES ('" 
         + dt.Rows[i]["FSR Number"].ToString().Trim() + "', '" 
         + dt.Rows[i]["Customer Name"].ToString().Trim() + "', '" 
         + dt.Rows[i]["REGN_NM"].ToString().Trim() + "', '" 
         + dt.Rows[i]["SUBREGN_NM"].ToString().Trim() + "', '" 
         + dt.Rows[i]["EMP/SUPPlier Name"].ToString().Trim() + "', '" 
         + dt.Rows[i]["INVTY DATE"].ToString().Trim() + "', '" 
         + dt.Rows[i]["COST CATEGORY"].ToString().Trim() + "', " 
         + dt.Rows[i]["PL&M AMOUNT"].ToString().Trim() + ", " 
         + dt.Rows[i]["LABOR AMOUNT"].ToString().Trim() + ", " 
         + dt.Rows[i]["T&L PERDIEM"].ToString().Trim() + ", " 
         + dt.Rows[i]["MEMO COST"].ToString().Trim() + ", '" 
         + dt.Rows[i]["EDI SEQ#"].ToString().Trim() + "', '" 
         + dt.Rows[i]["INVOICE NUMBER"].ToString().Trim() + "', " 
         + dt.Rows[i]["Grand Total"].ToString().Trim() + ", " 
         + dt.Rows[i]["Age"].ToString().Trim() + ", '" 
         + dt.Rows[i]["Business"].ToString().Trim() + "')"; 

    SqlCommand cmdWIP = new SqlCommand(wipSql, localConnection); 
    cmdWIP.ExecuteNonQuery(); 
} 
+7

あなたは 'wipSql'を印刷し、得られた出力クエリを見てみたのですか?これを試してみてくださいお勧めの方法は、SQLのパラメータを使用して、SQL文を作成するために文字列を追加しないでください – ughai

+0

あなたのエラーに基づいて私はいくつかの引用符が不足していると感じています。 –

+2

+1を使用すると、パラメータを使用することが推奨されます。お客様の名前に引用文が含まれている場合(例: "O'Connor")、SQLインジェクション攻撃の場合は、エラーのために自分自身を広げておきます。 https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare(v=vs.110).aspx – racraman

答えて

1

string wipSql = string.Empty; 

     for (int i = 1; i < dt.Rows.Count; i++) // i = 1 instead of 0 because of the header row 
     { 
      wipSql = "INSERT INTO tblWIP ([FSR Number], [Customer Name], REGN_NM, SUBREGN_NM, [EMP/SUPPLIER Name], [INVTY DATE], [COST CATEGORY], [PL&M AMOUNT], [LABOR AMOUNT], [T&L PERDIEM], [MEMO COST], [EDI SEQ#], [INVOICE NUMBER], [Grand Total], Age, Business) VALUES(@FSRNumber, @CustomerName, @REGN_NM, @SUBREGN_NM, @SupplierName, @InventoryDate, @CostCategory, @PLMAmount, @LaborAmount, @TLPerdiem, @MemoCost, @Ediseq, @InvoiceNumber, @GrandTotal, @Age, @Business)"; 

      SqlCommand cmdWIP = new SqlCommand(wipSql, localConnection); 
      cmdWIP.Parameters.AddWithValue("@FSRNumber", dt.Rows[i]["FSR Number"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@CustomerName", dt.Rows[i]["Customer Name"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@REGN_NM", dt.Rows[i]["REGN_NM"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@SUBREGN_NM", dt.Rows[i]["SUBREGN_NM"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@SupplierName", dt.Rows[i]["EMP/SUPPlier Name"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@InventoryDate", dt.Rows[i]["INVTY DATE"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@CostCategory", dt.Rows[i]["COST CATEGORY"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@PLMAmount", dt.Rows[i]["PL&M AMOUNT"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@LaborAmount", dt.Rows[i]["LABOR AMOUNT"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@TLPerdiem", dt.Rows[i]["T&L PERDIEM"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@MemoCost", dt.Rows[i]["MEMO COST"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@Ediseq", dt.Rows[i]["EDI SEQ#"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@InvoiceNumber", dt.Rows[i]["INVOICE NUMBER"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@GrandTotal", dt.Rows[i]["Grand Total"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@Age", dt.Rows[i]["Age"].ToString().Trim()); 
      cmdWIP.Parameters.AddWithValue("@Business", dt.Rows[i]["Business"].ToString().Trim()); 


      cmdWIP.ExecuteNonQuery(); 
     } 
+0

これはうまくいった!どうもありがとうございます! – swridings

6

次のようにクエリパラメータとの問題を使用してスタートが回避されると、あなたは、SQLインジェクションから保護されます。また、@を使い始めると、複数の行に文字列を書くことができます。

wipSql = @"INSERT INTO 
      tblWIP ([FSR Number], [Customer Name], REGN_NM, SUBREGN_NM, [EMP/SUPPLIER Name], [INVTY DATE], [COST CATEGORY], [PL&M AMOUNT], [LABOR AMOUNT], [T&L PERDIEM], [MEMO COST], [EDI SEQ#], [INVOICE NUMBER], [Grand Total], Age, Business) 
      VALUES 
       (@Number, @Name, @Regn_NM, .... and so on)"; 

//after that here 
SqlCommand cmdWIP = new SqlCommand(wipSql, localConnection); 
cmdWIP.Parameters.AddWithValue(@Number, dt.Rows[i]["FSR Number"].ToString().Trim()); 
cmdWIP.Parameters.AddWithValue(@Name, dt.Rows[i]["Customer Name"].ToString().Trim()); 
cmdWIP.Parameters.AddWithValue(@Regn_NM, dt.Rows[i]["REGN_NM"].ToString().Trim()); 
//and so on for other parameters 
+0

推奨読書:[SQLインジェクション](https://www.owasp.org/index)「Too() .php/SQL_Injection#Example_2) –

関連する問題