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

Posted

技术标签:

【中文标题】C# Access OleDb 条件表达式中的数据类型不匹配【英文标题】:C# Access OleDb Data type mismatch in criteria expression 【发布时间】:2014-09-09 18:30:13 【问题描述】:

请您检查以下代码中是否存在“标准表达式中的数据类型不匹配”异常的错误?我只是似乎无法找到问题的根源......

*record.Date 的可空 DateTime? 类型显式转换为 DateTime

*record.Date 设置为可为空,以供程序中的其他用途使用。但是为 INSERT 操作 设置的 record.Date 是从 DateTimePicker 中检索的,因此此方法的 record.Date不应为 null .

在哪里

AND(如果你想知道的话)


来自我的 Access 文件(设计视图):


谢谢!


这是 AddRecord 方法。谢谢!

public static int AddRecord(Record record)

    OleDbConnection connection = LABMeetingRecordsDB.GetConnection();
    string insertStatement = "INSERT INTO DocumentInfo " +
                             "([FileName], [Date], [Subject], [Type]) " +
                             "VALUES (?, ?, ?, ?)";
    try 
        OleDbCommand insertCommand = new OleDbCommand(insertStatement, connection);
        insertCommand.Parameters.AddWithValue("@FileName", record.FileName);
        insertCommand.Parameters.AddWithValue("@Date", (DateTime)record.Date);
        insertCommand.Parameters.AddWithValue("@Subject", record.Subject);
        insertCommand.Parameters.AddWithValue("@Type", record.getDBType());

        connection.Open();
        insertCommand.ExecuteNonQuery();

        string selectStatement = "SELECT IDENT_CURRENT('DocumentInfo') FROM DocumentInfo";
        OleDbCommand selectCommand = new OleDbCommand(selectStatement, connection);
        int recordID = Convert.ToInt32(selectCommand.ExecuteScalar());

        AddCategory(connection, recordID, record.Category);

        return recordID;

         catch (OleDbException ex) 
            throw ex;
         finally 
            connection.Close();
        
    

【问题讨论】:

在你的情况下record 是什么.. 你能显示那个结构吗.. 你还需要检查或将记录转换为 DBNULL 如果它为空你能显示更多代码声明.. 是你熟悉 `null-coalescing operator ??` 所以insertCommand.Parameters.AddWithValue("@Date", record.Date ?? DBNull.Value); 可能会起作用 抱歉,@DJKRAZE 造成了混乱。已编辑! 您正在分配数据时间?为空 我想知道你为什么要分配 Nullable 类型?无论哪种方式,我都发布了一个可行的解决方案,当您将属性声明为 Nullable ? 时,该解决方案应该适用于您,请使用`null-coalescing operator` record.getDBType() 这不是必需的,因为它根本不会返回值事实上我认为它会返回 System.String 或错误你能告诉我们更改是否对你有用..? 【参考方案1】:

所以...[问题已解决]:D

从HERE我了解到

条件表达式不匹配的问题是由于 OleDbType 分配给用于表示 DateTime.Now 的参数 调用 AddWithValue 时的值。

AddWithValue 选择的 OleDbType 是 DBTimeStamp,但 Access 想要 一个 OleDbType.Date。

意思是方便的AddWithValue给我拉了一个快...

感谢@LarsTech 和@DJKraze 帮助我,尽管演示文稿很混乱!

【讨论】:

是的,“AddWithValue”让我好几个小时......如果我没有看到这篇文章,我不会看到 AddWithValue 选择了不同的类型。 问题解决了,是的。此外,您注意到问题的基本原理。但是您并没有写出您实际为解决问题所做的工作。【参考方案2】:
OleDbConnection connection = LABMeetingRecordsDB.GetConnection();
string insertStatement = "INSERT INTO DocumentInfo " + "([FileName], [Date], [Subject], [Type]) " + "VALUES (?, ?, ?, ?)";
OleDbCommand insertCommand = new OleDbCommand(insertStatement, connection);
insertCommand.CommandType = CommandType.Text;
insertCommand.Parameters.AddWithValue("@FileName", record.FileName);
insertCommand.Parameters.AddWithValue("@Date", (DateTime)record.Date ?? (object)DBNull.Value);
insertCommand.Parameters.AddWithValue("@Subject", record.Subject);
insertCommand.Parameters.AddWithValue("@Type", record.getDBType ?? (object)DBNull.Value);
connection.Open();
try

  insertCommand.ExecuteNonQuery();

catch(OleDbException e)

   LogYourMessage(e.Message);

将 DBNull.Value 转换为(对象)DBNull.Value;是处理对象的正确方法试试这个我刚刚检查过并做了一个类似的测试..

【讨论】:

【参考方案3】:

我认为您也可以使用 ToString() 将您的日期数据设置为访问所接受的正确格式

 insertCommand.Parameters.AddWithValue("@Date", record.Date.ToString("dd-MM-yy"));

【讨论】:

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

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

条件表达式中的数据类型不匹配 (Access DB)

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

无法通过 C# 中的 OleDB 从 Microsoft Access 中删除表的所有行

向 Access 数据库发送数据时出错

C# Access OleDB 分别添加时间和日期