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

时间:2015-03-16 22:22:07

标签: c# ms-access webforms datasource

在.NET WebForms Project for .NET 3.5中,数据被传输到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字段中。

如果不改变遗留代码页面的内容,我有什么方法可以纠正这个问题?

3 个答案:

答案 0 :(得分:0)

将其更改为

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

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

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

答案 1 :(得分:0)

我通过更改App Pool用户的区域设置解决了这个问题(在Windows 2003上它是“网络服务”)。

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

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

IIS重新启动后,一切都运行良好。

答案 2 :(得分:0)

这只是一个危险的解决方法。您的核心问题是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())";