簡體   English   中英

將記錄從C#保存到Access時“條件表達式中的數據類型不匹配”

[英]“Data type mismatch in criteria expression” when saving record to Access from C#

在將新記錄插入訪問數據庫時,我收到“條件表達式中的數據類型不匹配”錯誤。 該應用程序在英國計算機上運行良好,但在南非計算機上它會拋出此錯誤。 這讓我覺得它與日期格式有關。 但是,如果我將自己的區域設置更改為南非,我無法重現錯誤。

代碼如下:

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "INSERT INTO tblOrders "
                        + "( UserID, AccountNumber, EmailAddress, InvoiceAddressID, DeliveryAddressID, PurchaseOrderReference, Comments, TotalPrice, [Date] )"
                        + "VALUES (?,?,?,?,?,?,?,?,?);";
        cmd.Parameters.Add(new OleDbParameter("@UserID", OleDbType.Integer)).Value = userID;
        cmd.Parameters.Add(new OleDbParameter("@AccountNumber", OleDbType.VarChar)).Value = accountNumber;
        cmd.Parameters.Add(new OleDbParameter("@EmailAddress", OleDbType.VarChar)).Value = emailAddress;
        cmd.Parameters.Add(new OleDbParameter("@InvoiceAddressID", OleDbType.Integer)).Value = invoiceAddressID;
        cmd.Parameters.Add(new OleDbParameter("@DeliveryAddressID", OleDbType.Integer)).Value = deliveryAddressID;
        cmd.Parameters.Add(new OleDbParameter("@PurchaseOrderReference", OleDbType.VarChar)).Value = purchaseOrderReference;
        cmd.Parameters.Add(new OleDbParameter("@Comments", OleDbType.VarChar)).Value = comments;
        cmd.Parameters.Add(new OleDbParameter("@TotalPrice", OleDbType.Decimal)).Value = totalPrice;
        cmd.Parameters.Add(new OleDbParameter("@Date", OleDbType.Date)).Value = date;
        cmd.Parameters.Add(new OleDbParameter("@ID",OleDbType.Integer)).Value = orderID;

        ExecuteNonQuery(cmd); // this line errors

Stack上有許多類似的問題,但它們似乎都是手動構建SQL字符串,否則它們似乎是另一個原因。 我已經仔細檢查了參數順序與InsertOrder查詢中的相同(並且代碼適用於99.9%的用戶)。

更新2014年8月8日

它實際上似乎是導致問題的Price參數 - 而不是日期。 如果我將價格硬編碼為0,那么它可以正常工作。 但是在英國和南非的計算機上,totalPrice.ToString()產生“350.6”,因為我已經將應用程序強制轉換為web.config中的en-GB。 因此,必須是這樣的情況,在南非的PC上,Access仍然會在十進制值上絆倒。 如何在英國和南非的PC上制作相同的應用程序? 我不明白在使用參數時它是如何誤解十進制值的。

價格是Access數據庫中的“貨幣”數據類型。

您是否嘗試使用OleDbType.Currency而不是OleDbType.Decimal 也許這些類型的解釋方式不同,盡管兩者都根據文檔映射到Decimal類型。 正如您所說,這也是用於Access數據庫的類型。

這聽起來更像是一個標准,所以說謊不是你的SP有問題。 嘗試這個:

驗證列的條件是否與列的基礎字段的數據類型匹配。 如果為數字或日期/時間字段指定文本條件,則會出現此錯誤。 例如,字段ReorderLevel具有Number數據類型。 因此,如果鍵入條件“50”,將返回錯誤消息,因為Microsoft Office Access 2003將引號中的值解釋為文本而不是數字。 導致數據類型沖突的其他情況包括:

您正在為“查找”字段指定條件,並且條件使用查找列表中顯示的值而不是其關聯的外鍵值。 由於外鍵值是實際存儲在基礎表中的值,因此在為字段指定條件時應使用它們。 您在為“貨幣”字段指定的條件中鍵入了美元符號($)。 刪除美元符號,然后查看結果。 驗證查詢中每對連接字段的數據類型是否相同。 如果不是,請更改其中一個連接字段的數據類型以匹配另一個字段的數據類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM