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

时间:2009-10-16 12:56:05

标签: c# asp.net ms-access datetime oledb

我使用C#从MS Access读取/更新数据。 我的代码是:

public static void UpdateLastLogin(int userid, DateTime logintime) ///logintime = DateTime.Now
{
    string sql = @"UPDATE [Customers] SET [LastLogin]=?";
    OleDbParameter[] prms = new OleDbParameter[] { 
     new OleDbParameter("@LastLogin",logintime)
    };
    using (DAL dal = new DAL())
    {
        dal.UpdateRow(sql, false, prms);
    }
}

谈到日期,我遇到了麻烦。 这会引发“条件表达式中的数据类型不匹配”。错误。 (我删除了WHERE子句以使其更简单) 我是不是要封装[LastLogin] =?单引号的问号,#符号..没有帮助。 任何有关如何使用Access和OleDb提供程序处理DateTime对象的线索都将非常感激。

提前致谢。

6 个答案:

答案 0 :(得分:4)

OleDb和日期存在已知问题。尝试做类似的事情:

OleDbParameter p = parameter as OleDbParameter;
if (null == p)
  parameter.DbType = DbType.DateTime;
else
  p.OleDbType = OleDbType.Date;

或使用显式格式字符串:

value.ToString("yyyy-MM-dd hh:mm:ss")

答案 1 :(得分:1)

我使用以下代码

解决了这个问题
OleDbCommand cmd = new OleDbCommand(qry, cnn);
cmd.Parameters.Add("datenow", OleDbType.Date);
cmd.Parameters["datenow"].Value = DateTime.Now;

答案 2 :(得分:0)

首先,您的SQL语句不应该是:

"UPDATE Customers SET LastLogin=@LastLogin"

其次,您收到日期不匹配错误的原因可能是您传递'?'作为您进入LastLogin字段的日期时间而不是实际的logintime参数。

答案 3 :(得分:0)

也许试试

DateTime.Now.ToShortDateString() + ' ' + DateTime.Now.ToShortTimeString()

相反,将其作为String传递(并且可能用#括起来)

答案 4 :(得分:0)

不应该

"UPDATE Customers SET LastLogin='@LastLogin'"

@LastLogin应该是

logintime.ToString("yyyy-MM-dd hh:mm:ss")

修改的 你不能只是内联整个事情吗?

"UPDATE Customers SET LastLogin='" + logintime.ToString("yyyy-MM-dd hh:mm:ss") + "'"

答案 5 :(得分:0)

尝试设置参数的“DBTYPE”属性,以根据需要将其标识为日期,日期时间或日期时间...

prms[0].DbType = DbType.DateTime;

新的OleDbParameter()调用有7个签名,因此您可以更改签名实例,或者只是在我上面采样时显式执行,因为在这种情况下您只有1个参数。