将记录从C#保存到Access时"条件表达式中的数据类型不匹配"

Nic*_*ckG 6 c# oledb ms-access

在将新记录插入访问数据库时,我收到"条件表达式中的数据类型不匹配"错误.该应用程序在英国计算机上运行良好,但在南非计算机上它会抛出此错误.这让我觉得它与日期格式有关.但是,如果我将自己的区域设置更改为南非,我无法重现错误.

代码如下:

        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
Run Code Online (Sandbox Code Playgroud)

Stack上有许多类似的问题,但它们似乎都是手动构建SQL字符串,否则它们似乎是另一个原因.我已经仔细检查了参数顺序与InsertOrder查询中的相同(并且代码适用于99.9%的用户).

更新2014年8月8日

它实际上似乎 是导致问题的Price参数 - 而不是日期.如果我将价格硬编码为0,那么它可以正常工作.但是在英国和南非的计算机上,totalPrice.ToString()产生"350.6",因为我已经将应用程序强制转换为web.config中的en-GB.因此,必须是这样的情况,在南非的PC上,Access仍然会在十进制值上绊倒.如何在英国和南非的PC上制作相同的应用程序?我不明白在使用参数时它是如何误解十进制值的.

价格是Access数据库中的"货币"数据类型.

T_D*_*T_D 8

你试过用OleDbType.Currency而不是OleDbType.Decimal吗?也许这些类型的解释方式不同,尽管两者都根据文档映射到Decimal类型.正如您所说,这也是用于Access数据库的类型.