2017-03-01 87 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); 
       { 

請問我能得到一些幫助嗎?當執行command1時,獲取列計數與第1行的值計數不匹配。C#MySQL錯誤「列計數與第1行的值計數不匹配」

+0

首先正確轉義您的輸入。 – shmosel

+0

請讓我簡單解釋一下。因爲我對數據庫很陌生。 @shmosel – Mohankumar

回答

0

從表面上看,這發生在值的數量多於或少於提供的列時。

從您的發言看來,情況似乎並非如此。但由於您直接向插入語句(SQL注入的Textbook案例)提供元素,因此我猜測您的任何UI元素中都有單引號',這會破壞您的插入語句。

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參數會節省你很多麻煩以及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

你不應該使用SQLS喜歡這個。它很容易受到SQL注入攻擊。當您像使用它一樣使用它時,可以竊取數據庫中的機密信息,甚至刪除您的表格,數據等。有關詳細信息,請參閱SQL Injection on wiki

您應該使用參數化SQL查詢。這樣你就可以避免注入攻擊,我相信編寫sql更實用。

在你的情況下,輸入單個'字符到其中一個文本框會導致你的查詢得到異常。要解決這個問題,只需使用參數。

對於你的情況,你可以寫這樣的東西。

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); 

請注意,我用的前綴PAR_我的SQL參數,它只是你可以使用或跳過PAR_前綴沒有關係公約,它是所有關於命名習慣。

另外;在參數化查詢中,您不需要將所有值轉換爲字符串。您可以使用DateTime作爲日期字段,或者您可以傳遞int變量,而無需像以前那樣使用ToString()。

相關問題