尝试插入 Access 数据库时,条件表达式中的数据类型不匹配错误

Posted

技术标签:

【中文标题】尝试插入 Access 数据库时,条件表达式中的数据类型不匹配错误【英文标题】:Data type mismatch in criteria expression error when trying to insert into Access database 【发布时间】:2015-02-17 16:32:29 【问题描述】:

我正在尝试将用户在 Winform 上输入的值插入到以下 Access 表中:

C#代码是:

    OleDbCommand oleCmd = new OleDbCommand("INSERT INTO Projects (projectTitle,partyID,receiveDate,dueDate, projectTypeID, pages, "+
        "lines, words, prepay, cost, settled,projectComment)"
    + " VALUES (@projectTitle,@partyID,@receiveDate,@dueDate,@projectTypeID,@pages, @lines, @words, @prepay, @cost, @settled, @projectComment)", conn);


    PersianCalendar p=new PersianCalendar();
    DateTime thisDate=DateTime.Now;
    oleCmd.Parameters.Add("@projectTitle", OleDbType.VarChar).Value = txtProjectTitle.Text;
    oleCmd.Parameters.Add("@partyID", OleDbType.Numeric).Value = Convert.ToInt32(comboProjectType.SelectedValue.ToString());
    oleCmd.Parameters.AddWithValue("@receiveDate", string.Format( "0, 1/2/3 4:5:6",
        p.GetDayOfWeek(thisDate), p.GetYear(thisDate),p.GetMonth(thisDate),p.GetDayOfMonth(thisDate), p.GetHour(thisDate),p.GetMinute(thisDate),p.GetSecond(thisDate))) ;                        
    oleCmd.Parameters.Add("@dueDate", OleDbType.VarChar).Value = comboDay.Text + "/" + comboMonth.Text + "/" + comboYear.Text;          
    oleCmd.Parameters.Add("@projectTypeID", OleDbType.Numeric).Value = Convert.ToInt32(comboContractParty.SelectedValue.ToString());
    oleCmd.Parameters.AddWithValue("@pages", Convert.ToInt32(txtPages.Text));
    oleCmd.Parameters.AddWithValue("@lines", Convert.ToInt32(txtLines.Text));
    oleCmd.Parameters.AddWithValue("@words", Convert.ToInt32(txtWords.Text));
    oleCmd.Parameters.AddWithValue("@cost", Convert.ToDouble(txtWholeProjCost.Text));
    oleCmd.Parameters.AddWithValue("@prepay", Convert.ToDouble(txtPrePay.Text));
    oleCmd.Parameters.AddWithValue("@settled", chkSettled.CheckState); 
    oleCmd.Parameters.Add("@projectComment", OleDbType.VarChar).Value = txtComment.Text.ToString();
    try
    
        conn.Open();
        oleCmd.ExecuteNonQuery();
        conn.Close();
    
    catch (Exception ex)
    
        MessageBox.Show(ex.ToString());
        return;
    

异常说:

条件表达式中的数据类型不匹配。

我重新检查了类型,但不知道错误是从哪里引发的。

【问题讨论】:

如果您将@receiveDate 参数的当前(字符串)值暂时替换为thisDate,您的代码是否有效? @GordThompson,仅使用 thisDate 后显示此错误:- ************ 异常文本 ************ ** System.FormatException:输入字符串的格式不正确。在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) 在 System.Convert.ToDouble(String value) @GordThompson 上述错误是由于空输入,似乎可以通过为条目设置默认值 0 来解决。但是,我仍然收到“数据类型不匹配”错误。 如果使用... VALUES (@projectTitle,@partyID,Date(),@dueDate, ... 并注释掉创建@receiveDate 参数的语句会怎样? 那是什么?我以前没见过这样的。括号中的 Date() 是什么? 【参考方案1】:

receiveDatedueDate 在数据库中定义为 DateTime,但您将文本(字符串)传递给参数:

oleCmd.Parameters.AddWithValue("@receiveDate", string.Format(... 

oleCmd.Parameters.Add("@dueDate", OleDbType.VarChar).Value = ...

传递实际的DateTime 变量,它应该可以工作。由于日期是零散的,我会先创建它们以便对其进行测试:

// why not use thisDate rather than chopping it up to recombine?
DateTime recDate = New DateTime(p.Getyear(thisDate)...);

// personally, I might use a DateTimePicker rather than 3 CBOs
DateTime dueDate  = New DateTime(ConvertToInt32(comboYear.Text), ...

然后将它们作为参数传递。如果您使用Add,请指定OleDbType.Date

oleCmd.Parameters.AddWithValue("@receiveDate", recDate); 
...
oleCmd.Parameters.AddWithValue("@dueDate", dueDate);

【讨论】:

我砍日期是因为我实际上将公历转换为波斯日期。我已经通过 varchar oledbtype 来访问 datetime 单元格并且它有效。 好的,日历转换有意义。允许 Access 将字符串转换为日期可以工作,但不是在插入之前获取可以检查的 Date 类型,这是您遇到的错误类型。其他字段似乎都与日期和/或日历转换相匹配。

以上是关于尝试插入 Access 数据库时,条件表达式中的数据类型不匹配错误的主要内容,如果未能解决你的问题,请参考以下文章

“条件表达式中的数据类型不匹配”错误将日期插入 Access 数据库中的日期/时间字段

尝试从 WPF 中的 Access 数据库中获取给定条件的日期时出错

MS Access - 条件表达式中的数据类型不匹配

条件表达式 Oledb Access 数据库中的数据类型不匹配

插入记录时“条件表达式中的数据类型不匹配”

运行时错误 3464:条件表达式中的数据类型不匹配