如何以与区域性无关的方式向 MS Access OleDb 命令提供日期

本文关键字:OleDb Access MS 命令 日期 方式 区域性 | 更新日期: 2023-09-27 18:35:32

我正在开发一个C#程序。在该程序中,我从 Access 2010 数据库和流程数据中选择一些日期。但是,我无法访问和处理包含 01/12/2014 和 11/12/2014 范围内日期的行的数据,但我可以处理剩余日期。

cmd = new OleDbCommand("SELECT MIN([Vch No]) FROM [" + group + "] WHERE [Entry Date]=#" + date + "#", conn); long Vch = long.Parse(cmd.ExecuteScalar().ToString()) - 1;

我在网上收到错误long Vch = ... - 1;说无法获得正确的输入字符串。然而,它适用于这些特定日期之前或之后的其他日期。

我用这个代码声明日期:

cmd = new OleDbCommand("SELECT TOP 1 * FROM (SELECT DISTINCT [Entry Date] FROM [" + group + "]) WHERE [Entry Date]>#" + initDate + "# ORDER BY [Entry Date]", conn); dr = cmd.ExecuteReader(); dr.Read(); string date = dr["Entry Date"].ToString();

提前谢谢你!

如何以与区域性无关的方式向 MS Access OleDb 命令提供日期

尝试将变量date设置为非区域性特定的日期格式,以便YYYY/MM/DD例如 2014/12/01

如果date是 C# DateTime 对象,则需要调用:

date.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture);

根据将日期时间转换为年/月/日

转换

所以:

cmd = new OleDbCommand("SELECT MIN([Vch No]) FROM [" + group + "] WHERE [Entry Date]=#" +
date.ToString("yyyy/MM/dd", CultureInfo.InvariantCulture) +
"#", conn);
long Vch = long.Parse(cmd.ExecuteScalar().ToString()) - 1;

编辑以添加

根据@Gord-Thompson的评论,在可能的情况下使用参数始终被认为是最佳实践(通常总是!

所以:

cmd = new OleDbCommand("SELECT MIN([Vch No]) FROM [@pGroup] WHERE [Entry Date]=@pDate", conn);
cmd.Parameters.Add("@pGroup", OleDbType.NVarChar).Value = group;
cmd.Parameters.Add("@pDate", OleDbType.DateTime).Value = date;
long Vch = long.Parse(cmd.ExecuteScalar().ToString()) - 1;

尽量避免使用cmd.Parameters.AddWithValue() - 有关更多详细信息,请参阅 http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/。