使用 MS Access 的 C# 标准表达式中的数据类型不匹配?

Posted

技术标签:

【中文标题】使用 MS Access 的 C# 标准表达式中的数据类型不匹配?【英文标题】:Data type mismatch in criteria expression in C# with MS Access? 【发布时间】:2013-11-27 12:45:22 【问题描述】:

您好,我尝试将表单中的数据保存到 MS Access 数据库。有 13 个字段要保存,但是当我单击此行上显示的保存按钮时出现错误 top.ExecuteNonQuery(); Data type mismatch in criteria expression

这是我的代码,尽可能帮助我

 OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:/Srihari/Srihari/Invoice.accdb");
        conn.Open();

        // to save top column in invoive
        int invoicenumber = Convert.ToInt32(TXE_Invoice_Number.Text);
        string terms = CBL_Terms.Text;
        DateTime date = CBL_Date.DateTime;
        string ourquote = TXE_OurQuote.Text;
        string salesperson = CBL_Sales_Person.Text;
        string customername = CBL_Customer_Nmae.Text;
        string oderno = CBL_Order_Number.Text;
        string invoiceaddress = TXE_Invoice_Address.Text;
        string deliveryaddress = TXE_Delivery_Address.Text;

        bool inclusive = CBX_New.Checked;

        decimal Price = Convert.ToDecimal(TXE_Price.Text);
        decimal tax = Convert.ToDecimal(TXE_Tax.Text);
        decimal grandtotal = Convert.ToDecimal(TXE_Total.Text);

        OleDbCommand top = new OleDbCommand("INSERT INTO test_top(InvoiceNumber,Terms,[InvoiceDate],OurQuote,SalesPerson,CustomerName,OrderNumber,InvoiceAddress,DeliveryAddress,InclusiveStatus,Price,Tax,GrandTotal) VALUES (" + invoicenumber + ",'" + terms + "','" + date + "','" + ourquote + "','" + salesperson + "','" + customername + "','" + oderno + "','" + invoiceaddress + "','" + deliveryaddress + "','" + inclusive + "','" + Price + "','" + tax + "','" + grandtotal + "')", conn);
        top.ExecuteNonQuery();
        MessageBox.Show("Inserted Successful (top)", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

conn.close();

在 Access 数据库中 13 列 InvoiceNumber 编号、条款文本、InvoiceDate 日期/时间、OurQuote 文本、SalesPerson 文本、CustomerName 文本、Orderno 文本、InvoiceAddress 备注、DeliveryAddress 备注、InclusiveStatus Yes/No、Price Decimal、Tax Decimal、GrandTotal Decimal .

我的代码出了什么问题?

【问题讨论】:

为什么在single Quotes 中传递十进制值?? 嗨 kyle 1st 我试过这样 '"+ Price +"' osame 错误来了,所以我像这样改变了但仍然错误 @SriHari - 请让自己熟悉 parameters 和 why 在没有使用它们的情况下永远不要使用数据库。 #corak, 刚接触 C# 能看清楚吗? @SriHari - 我认为您尝试学习 C# 很棒。更有理由去养成坏习惯。将数据直接注入 sql 命令是处理数据库时最糟糕的习惯之一。我希望提供的链接能帮助您学习“正确”的方法,这样您就不会在路上遭受痛苦和折磨。 【参考方案1】:

说真的,通过使用参数查询,省去你的麻烦,同时编写更可靠的代码:

OleDbCommand top = new OleDbCommand(
        "INSERT INTO test_top (" +
                "InvoiceNumber,Terms,[InvoiceDate],OurQuote," +
                "SalesPerson,CustomerName,OrderNumber," +
                "InvoiceAddress,DeliveryAddress,InclusiveStatus," +
                "Price,Tax,GrandTotal" +
            ") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)", conn);
top.Parameters.AddWithValue("?", invoicenumber);
top.Parameters.AddWithValue("?", terms);
top.Parameters.AddWithValue("?", date);
top.Parameters.AddWithValue("?", ourquote);
top.Parameters.AddWithValue("?", salesperson);
top.Parameters.AddWithValue("?", customername);
top.Parameters.AddWithValue("?", oderno);
top.Parameters.AddWithValue("?", invoiceaddress);
top.Parameters.AddWithValue("?", deliveryaddress);
top.Parameters.AddWithValue("?", inclusive);
top.Parameters.AddWithValue("?", Price);
top.Parameters.AddWithValue("?", tax);
top.Parameters.AddWithValue("?", grandtotal);
top.ExecuteNonQuery();

【讨论】:

【参考方案2】:

我认为您在保存到 Access Database 时应该知道的几点

1) String 应在 single Quotes 范围内

2) Numeric 值应该不在引号内

3) DateTime 值应使用 #

保存

【讨论】:

嗨凯尔,如果我从 NumericString 中删除双引号,则显示如下错误 Syntax error (missing operator) in query expression '+ invoicenumber +'. 我说的是Single Quotes re:“访问无法自动从文本转换为 DateTime” - 实际上可以:INSERT INTO Clients (LastName, DOB) VALUES ('foo', '1961-06-16') 工作正常。 @kyle 看我上面的代码我这样写第一个" + invoicenumber + ",'" + terms + "' 第一个是数字,第二个是字符串,你告诉用单引号写字符串,而不是用引号写数字所以我删除了双引号从现在开始我的代码都是`+ invoicenumber + ,' + terms + '` 那么只有这样的错误。

以上是关于使用 MS Access 的 C# 标准表达式中的数据类型不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 中保存来自 VB.Net Windows 窗体的数据时出现错误 System.Data.OleDb.OleDbException:“标准表达式中的数据类型不匹配”。

使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值

使用 C# 动态重命名 MS Access 中的列

ms access 数据库中条件表达式异常中的数据类型不匹配

C# Access OleDb 条件表达式中的数据类型不匹配

如何在 C# 中使用 OleDB 列出 MS Access 文件中的所有查询?