2017-03-01 5 views
0
MySqlCommand cmd1 = 
        new MySqlCommand(
         "INSERT INTO quotedetails (name, address, district, date, forto, refto, total) VALUES('" + txttoname.Text + "', '" + txttoaddress.Text.Replace("\r\n", "<br />").ToString() + "', '" + txtdistrict.Text + "' , '" + dateTimePicker1.Value.Date.ToString("yyyy-MM-dd") +"', '" + txtfor.Text + "', '" + txtref.Text + "', '" + txttotal.Text + "')", conn); 
       { 

私は助けてもらえますか? Im getting command1が実行されると、列数が行1の値と一致しません。C#MySQLエラー "列数が行1の値と一致しません"

+0

入力を正しくエスケープすることから始めます。 – shmosel

+0

簡単に説明しましょう。新しいデータベースであるためです。 @shmosel – Mohankumar

答えて

0

これは、値の数が提供された列の数より多いか少ない場合に発生します。

あなたの声明では、これは当てはまりません。しかし、あなたは直接INSERTステートメント(SQLインジェクションの教科書の場合)にuielementsを提供しているので、あなたのINS文を壊すui要素の中に単一引用符'があると推測しています。 SQLパラメータを使用して

0
MySqlCommand cmd1 = conn.CreateCommand(); 

cmd1.CommandText = "INSERT INTO quotedetails (name, address, district, date, forto, refto, total) VALUES('" + txttoname.Text + "', '" + txttoaddress.Text.Replace("\r\n", "<br />").ToString() + "', '" + txtdistrict.Text + "', '" + dateTimePicker1.Value.Date.ToString("yyyy-MM-dd") +"', '" + txtfor.Text + "', '" + txtref.Text + "', '" + txttotal.Text + "')"; 
0

は、トラブルの多くからあなたを救うだけでなく、SQL injection.Iますあなたはパラメータを使用している場合、あなたの問題が解決されることをかなり確信しています:

MySqlCommand cmd1 = new MySqlCommand("INSERT INTO quotedetails (name, address, district, date, forto, refto, total) VALUES(@name,@address,@district,@date,@forto,@refto,@total)", conn); 

cmd1.Parameters.AddWithValue("@name",txttoname.Text); 
cmd1.Parameters.AddWithValue("@address",+ txttoaddress.Text.Replace("\r\n", "<br />").ToString()); 
cmd1.Parameters.AddWithValue("@district",txtdistrict.Text); 
... 
1

あなたはSQLを使用しないでくださいこのような。 SQLインジェクション攻撃を受けやすい。あなたのように使用すると、データベースから機密情報を盗んだり、テーブル、データなどを削除することもできます。SQL Injection on wiki

代わりに、パラメータ化されたSQLクエリを使用してください。そのようにして、注射攻撃から安全です。私はsqlを書く方がはるかに現実的だと思います。

あなたのケースでは、テキストボックスの1つに '文字'を入力すると、クエリが例外になることがあります。問題を解決するには、prametersを使用してください。

あなたの場合は、そのようなものを書くことができます。

string sqlString = @"INSERT INTO quotedetails (
          name, 
          address, 
          district, 
          date, 
          forto, 
          refto, 
          total) 
         VALUES (
          @PAR_name, 
          @PAR_address, 
          @PAR_district, 
          @PAR_date, 
          @PAR_forto, 
          @PAR_refto, 
          @PAR_total)"; 
    MySqlCommand cmd1 = new MySqlCommand(sqlString, conn); 

    cmd1.Parameters.AddWithValue("PAR_name", txttoname.Text); 
    cmd1.Parameters.AddWithValue("PAR_address", txttoaddress.Text.Replace("\r\n", "<br />")); 
    cmd1.Parameters.AddWithValue("PAR_district", txtdistrict.Text); 
    cmd1.Parameters.AddWithValue("PAR_date", dateTimePicker1.Value.Date); 
    cmd1.Parameters.AddWithValue("PAR_forto", txtfor.Text); 
    cmd1.Parameters.AddWithValue("PAR_refto", txtref.Text); 
    cmd1.Parameters.AddWithValue("PAR_total", txttotal.Text); 

は、私は私のSQLパラメータのプレフィックス PAR_を使用することに注意してください、それはあなたがそれを使用するかは重要ではありません PAR_接頭辞を省略することができ、単に慣例であり、それはすべての習慣を命名についてです。

追加;パラメータ化されたクエリでは、すべての値を文字列に変換する必要はありません。あなたの日付フィールドにはDateTimeを使うことができます。あるいはToString()を使わずにint変数を渡すこともできます。

関連する問題