2016-12-10 20 views
0

私の間違いはどこですか? 'の近くに間違った構文が見つかりません!追加情報: 's'の近くの構文が正しくありません

public static DataTable InsertConnect(ComboBox Site , ComboBox server , ComboBox Host , ComboBox Domain , Label Price) 
{ 
    SqlConnection cn = new SqlConnection(); 
    cn.ConnectionString = Server.Connection; 
    cn.Open(); 

    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = cn; 
    cmd.CommandText = "insert into tblPrice(Site,Server,Host,Domain,Price) 
     values('" + Site.Text + "','" + server.Text + "','" + Host.Text + "','" + Domain.Text + "','" + Price.Text + "')'"; 


    SqlDataAdapter da = new SqlDataAdapter(cmd.CommandText, cn); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 
    return dt; 
} 
+0

最後の括弧の後に '' 'があるのはなぜですか? –

+3

私は実際にSQLインジェクションを避けるためにパラメータを使うことを提案しています。ここでの簡単な例です:http://stackoverflow.com/questions/17569051/sqlcommand-insert-into-query-does-not-execute –

+0

@ J.Pichardo原因if 'を入力しないでくださいエラーが発生しました – VorTex318

答えて

4

理由は、クエリに値を渡すためSqlParameterを使用していないため。
パラメータを使用している場合は、クエリに特別な'文字が含まれていても問題は発生しません。

常にSqlParametersを使用してください。あなたのcmdがクエリを実行するために必要なすべての情報が含まれているため

public static DataTable InsertConnect(ComboBox Site , ComboBox server , ComboBox Host , ComboBox Domain , Label Price) 
{ 
    using (var cn = new SqlConnection(Server.Connection)) 
    { 
     cn.Open(); 

     using (var cmd = new SqlCommand()) 
     { 
      cmd.Connection = cn; 
      cmd.CommandText = "insert into tblPrice(Site,Server,Host,Domain,Price) values (@Site, @Server, @Host, @Domain, @Price)"; 
      var parameters = new[] 
      { 
       new SqlParameter { ParameterName = "@Site", .SqlDbType = SqlDbType.VarChar, .Value = Site.text }, 
       new SqlParameter { ParameterName = "@Server", .SqlDbType = SqlDbType.VarChar, .Value = server.text }, 
       new SqlParameter { ParameterName = "@Host", .SqlDbType = SqlDbType.VarChar, .Value = Host.Text }, 
       new SqlParameter { ParameterName = "@Domain", .SqlDbType = SqlDbType.VarChar, .Value = Domain.Text }, 
       new SqlParameter { ParameterName = "@Price", .SqlDbType = SqlDbType.VarChar, .Value = Price.Text } 
      } 
      cmd.Parameters.AddRange(parameters); 

      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      DataTable dt = new DataTable(); 

      da.Fill(dt); 
      return dt; 
     } 
    } 
} 

次に、あなたは、パラメータとしてSqlCommand取るSqlDataAdapterのコンストラクタを使用することができます。

2

問題はおそらく、アポストロフィ( ')を含んでいるパラメータの一つである: はここに私のコードです。 cmd.CommandTextを印刷しようとすると、有効なSQLコマンドではないことがわかります。

これは、それがSQLインジェクションの基礎です。解決策は、値、特に文字列を連結してSQLコマンドを構築することではありません。代わりに、コマンドパラメータを使用して、パラメータ化されたコマンドを作成します。

あなたは、MSDNの詳細を学ぶことができます:How to: Execute a Parameterized Query

関連する問題