[英]Data type mismatch in criteria expression | Access, OleDb, C#
我使用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对象的线索将不胜感激。
提前致谢。
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;
首先,你的SQL语句不应该是:
"UPDATE Customers SET LastLogin=@LastLogin"
其次,您收到日期不匹配错误的原因可能是您的传递'?' 作为您进入LastLogin字段的日期时间而不是实际的logintime参数。
也许试试
DateTime.Now.ToShortDateString() + ' ' + DateTime.Now.ToShortTimeString()
相反,将它作为String传递(并可能用#括起来)
不应该
"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个参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.