写入时数据类型不匹配,读取工作正常

Data type mismatch on write, reading works fine

在 .NET 3.5 的 ASP.NET WebForms 项目中,数据被传输到 Access 数据库。该网站在 Windows 2003(英文版)的 IIS 6 上运行。

在ASPX文件中,AccessDataSource用于读取和写入数据。读取数据工作正常,但写入日期失败。但是,如果日期以 MM-dd-yyyy 形式提供,则写作有效,但 dd.mm.yyyy 无效。如果日期以 dd.mm.yyy 形式提供,我会收到此错误:

System.Data.OleDb.OleDbException: Data type mismatch in criteria expression.

导致此错误的代码示例:

AccessDataSource myAds = new AccessDataSource("~/App_Data/mydb.mdb", "");
myAds.InsertCommand =
    "INSERT INTO [table1] " +
    "([Value], [Date]) VALUES ('data', DateValue('" + DateTime.Now.ToString("dd.MM.yyyy") + "'))";
myAds.Insert();

区域和语言设置设置为德语,因此日期格式正确。 在数据库中,日期和时间存储在 DateTime 字段中。

在不更改成百上千页遗留代码的情况下,我必须配置什么才能更正此问题?

改为

DateTime.Now.ToString("yyyy-MM-dd")

如果您尝试插入 CurrentDateTime 您可以这样做

 "INSERT INTO [table1] " +
"([Value], [Date]) VALUES ('data', Now())";

我通过更改 App Pool 用户的区域设置解决了这个问题(在 Windows 2003 上是 "Network Service")。

为此,我不仅为管理员设置了区域设置,还为默认用户帐户设置了区域设置(请参阅 "regional and language settings" 对话框中最后一个选项卡上的复选框)。

重启后,我从默认用户数据设置中导出了 HKEY_USERS\.DEFAULT\Control Panel\International 的内容。然后我编辑了 .reg 文件并将其导入到 ID 为 S-1-5-20 的网络服务用户 HKEY_USERS\S-1-5-20\Control Panel\International.

IIS 重启后,一切正常。

这只是一个危险的解决方法。您的核心问题是 SQL 表达式,您错过了将日期值转换为有效字符串表达式或从函数插入日期值的地方。您可以使用 DateValue 但不能使用德语格式的字符串作为参数:

操作方法如下:

myAds.InsertCommand =
    "INSERT INTO [table1] " +
    "([Value], [Date]) VALUES ('data', #" + DateTime.ToDay.ToString("yyyy'/'dd'/'MM") + "#)";

或:

myAds.InsertCommand =
    "INSERT INTO [table1] " +
    "([Value], [Date]) VALUES ('data', Date())";