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

条件表达式中的数据类型不匹配|访问,OleDb,C#,c#,asp.net,ms-access,datetime,oledb,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 Ole

我使用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 provider处理DateTime对象的线索都将不胜感激


提前感谢。

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

"UPDATE Customers SET LastLogin=@LastLogin"
其次,您收到日期不匹配错误的原因可能是您将“?”作为日期时间传递到LastLogin字段,而不是实际的logintime参数。

请尝试

DateTime.Now.ToShortDateString() + ' ' + DateTime.Now.ToShortTimeString()
相反,应该将其作为字符串传递(可能用#then括起来)

"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") + "'"
尝试设置参数的“DBTYPE”属性,将其标识为日期、日期时间或日期时间2(视情况而定)

prms[0].DbType = DbType.DateTime;

新的OleDbParameter()调用有7个签名,因此您可以更改签名实例,或者只需按照上面的示例进行显式更改,因为在这种情况下您只有1个参数。

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")

我用下面的代码解决了这个问题

OleDbCommand cmd = new OleDbCommand(qry, cnn);
cmd.Parameters.Add("datenow", OleDbType.Date);
cmd.Parameters["datenow"].Value = DateTime.Now;

代码位将更易于阅读。如果通过缩进4空格将其格式化为代码,则这是access。。我认为oleDb不支持命名参数:(假设您使用的是OLEDBCommand,也可能是传递给ToString()的格式字符串,则上述语句应该可以)当然,DateTime将有助于编辑我的帖子…应该可以。可能有更优雅的方法来做,因为这可能取决于您的本地化选项…您可以内联整个内容,是的,但是创建动态sql是一个不好的习惯。使用参数是更好的设计,也同样容易阅读。