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

时间:2014-09-09 18:30:13

标签: c# ms-access oledbexception oledbparameter

请您检查以下代码是否有错误导致我在标准表达式' 例外中出现'数据类型不匹配?我似乎无法找到问题的根源......

enter image description here

可以为record.Date类型的{p> * DateTime?明确投放到DateTime

对于程序中的其他用途,

* record.Date设置为可为空。但是 INSERT操作record.Date集是从 DateTimePicker 中检索的,因此此方法record.Date值永远不应为null 即可。

WHERE

enter image description here

AND(如果你想知道的话)

enter image description here


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

enter image description here


谢谢!


这是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();
        }
    }

3 个答案:

答案 0 :(得分:13)

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

HERE我学到了

  

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

     

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

这意味着方便的AddWithValue在我身上拉了一个快......

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

答案 1 :(得分:0)

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;是处理对象的正确方法试试这个我刚刚在我的结尾检查并做了类似的测试工作..

答案 2 :(得分:0)

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

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