c#
  • sql
  • ms-access
  • insert-update
  • type-mismatch
  • 2014-01-09 25 views 1 likes 
    1

    我正在從access數據庫將數據加載到textboxes以編輯和更新。當我保存的數據時,我得到Data Type Mismatch錯誤...數據不匹配。在C#中的訪問更新聲明#

    我想更新OCR標題像下面編碼,但只有在選定的行,我試圖通過識別在OCR上面的文本框中的OCR號碼標題,然後我只能更新該特定行,而不是全部。

    string strSql = "UPDATE Responses SET [OCR Title] = '" + textBox6.Text + "' where OCR = '" + textBox5.Text + "'"; 
    
    using (OleDbConnection newConn = new OleDbConnection(strProvider)) 
    { 
        using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn)) 
        { 
         dbCmd.CommandType = CommandType.Text; 
         dbCmd.Parameters.AddWithValue("OCR", textBox5.Text); 
         dbCmd.Parameters.AddWithValue("DeadlineDate", textBox7.Text); 
         dbCmd.Parameters.AddWithValue("[OCR Title]", textBox6.Text); 
         newConn.Open(); 
         dbCmd.ExecuteNonQuery(); 
        } 
    } 
    

    回答

    0

    問題的順序:您還沒有實現parameterised queries正常。

    解決方案:您需要爲parameters提供值而不是列名。

    試試這個:

    string strSql = "UPDATE Responses SET [OCR Title] = @OCRTitle where OCR = @OCR"; 
    
        using (OleDbConnection newConn = new OleDbConnection(strProvider)) 
        { 
         using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn)) 
         { 
          dbCmd.CommandType = CommandType.Text; 
          dbCmd.Parameters.AddWithValue("@OCRTitle", textBox6.Text); 
          dbCmd.Parameters.AddWithValue("@OCR", textBox5.Text); 
          newConn.Open(); 
          dbCmd.ExecuteNonQuery(); 
         } 
        } 
    
    +0

    謝謝你,完美。 – JoshF91

    +0

    @ user3086447:歡迎您:)接受其中一個答案。 –

    +0

    它說不了5分鐘。 – JoshF91

    2

    您不能參數化列。您可以可以參數化值。

    我在您的dbCmd中看不到任何參數。聽起來像你不需要添加textBox7.Text作爲參數。

    string strSql = "UPDATE Responses SET [OCR Title] = ? 
           where OCR = ?"; 
    using (OleDbConnection newConn = new OleDbConnection(strProvider)) 
    { 
        using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn)) 
        { 
          dbCmd.CommandType = CommandType.Text; 
          dbCmd.Parameters.AddWithValue("@OCRTitle", textBox6.Text); 
          dbCmd.Parameters.AddWithValue("@OCR", textBox5.Text); 
          newConn.Open(); 
          dbCmd.ExecuteNonQuery(); 
        } 
    } 
    

    請注意,在OleDb中,參數順序很重要。

    OleDbCommand.Parameters

    的OLE DB .NET提供程序不支持命名的參數傳遞 參數的SQL語句或當CommandType設置爲文本的 的OleDbCommand調用的存儲過程。在這種情況下,必須使用 問號(?)佔位符。例如:

    SELECT * FROM Customers WHERE CustomerID =?

    因此,順序OleDbParameter對象添加到 OleDbParameterCollection必須直接對應於 問號佔位符在命令文本參數的位置。

    0

    您的更新語句不需要爲字段DeadLineDate的值,所以你應該從參數集合中刪除它 。
    當然,使用參數化查詢,需要以紀念參數的位置與?佔位

    string strSql = "UPDATE Responses SET [OCR Title] = ? where OCR = ?"; 
        using (OleDbConnection newConn = new OleDbConnection(strProvider)) 
        { 
         using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn)) 
         { 
          dbCmd.CommandType = CommandType.Text; 
          dbCmd.Parameters.AddWithValue("@p1", textBox5.Text); 
          dbCmd.Parameters.AddWithValue("@p2", textBox6.Text); 
          newConn.Open(); 
          dbCmd.ExecuteNonQuery(); 
         } 
        } 
    

    相反,如果你還更新字段爲DeadlineDate,您需要將值轉換爲日期時間,因爲這是使用參數

    string strSql = "UPDATE Responses SET [OCR Title] = ?, DeadlineDate = ? " + 
           "where OCR = ?"; 
    
    using (OleDbConnection newConn = new OleDbConnection(strProvider)) 
    { 
        using (OleDbCommand dbCmd = new OleDbCommand(strSql, newConn)) 
        { 
         dbCmd.CommandType = CommandType.Text; 
         dbCmd.Parameters.AddWithValue("@p1", textBox5.Text); 
         dbCmd.Parameters.AddWithValue("@p2", Convert.ToDateTime(textBox7.Text)); 
         dbCmd.Parameters.AddWithValue("@p3", textBox6.Text); 
         newConn.Open(); 
         dbCmd.ExecuteNonQuery(); 
        } 
    } 
    

    還要注意如何使用OLEDB不通過名稱識別參數正確傳遞日期的唯一方法,它根據漸進插入參數的值佔位符的位置,s啊,你能說出你喜歡的任何方式的參數,但是你應該尊重它們在查詢所需

    0

    如果DeadlineDate數據類型爲DateTime類型的數據庫,你必須把它的文本框的值轉換爲DateTime。

    相關問題