MS访问日期和时间与ASP.NET

在使用ASP.NET访问的日期和时间时获得奇数结果和意外错误是一个常见问题。以下是访问DateTime数据类型的概述,以及一些分辨率更常见的错误。

首先,值得注意的是,访问的唯一数据类型适合存储日期和时间是DateTime数据类型。发现人们正在尝试使用存储在文本字段中的日期和时间并不罕见。这种方法的问题是,在文本字段中的任何排序都只会按字母顺序执行,因为它们将被视为字符串。

访问DateTime实际上是一个OLE自动化日期数据类型。它被实现为双精度(64bits)浮点数。我开始输入的时间和日期是2008年12月13日08:34:27。作为OLE自动化日期,这显示为39795.3572615509。小数点左侧的整数部分表示自12月31日以来以来自12月31日以来的天数,而当时午夜以来已经过去几秒钟的当前日期的比例出现。上午8点是一天中的三分之一,或每天0.33。正如午间确切地说,OLE自动化日期为39795.5。您还将使用Excel查看此行为。例如,如果您在单元格中键入13/12/2008,则直接选择单元格,然后按Ctrl +'(直接复制单元格的组合),您将获得39795,除非新的单元格格式化为特定的日期和时间格式。

将当前日期插入到访问中可以以多种方式完成。第一个示例显示了如何直接使用.NET DateTime Data类型执行此操作:

  

细绳 Connect =. “Provider = Microsoft.jet.oledb.4.0;数据源= | DataDirectory | MBBase.mdb”;

使用 (OledBConnection. CN = 新的 OledBConnection.(连接))

{

    细绳 SQL = “插入测试(MyDateTime)值(?)”;

    OledbCommand. cmd = 新的 OledbCommand.(SQL,CN);

   cmd.parameters.addwithvalue(, 约会时间.now.date);

   cn.Open();

   cmd.executenonquery();

}

  

这导致13/12/2008出现在我的访问副本中,我的机器上设置为英国DD / mm / yyyy。

但是,最简单的方法可能是当前日期是在访问中使用内置日期()函数,并忘记所有关于参数的所有功能。 Date()函数获取当前系统日期:

  

细绳 Connect =. “Provider = Microsoft.jet.oledb.4.0;数据源= | DataDirectory | MBBase.mdb”;

使用 (OledBConnection. CN = 新的 OledBConnection.(连接))

{

    细绳 SQL = “插入测试(MyDateTem)值(Date())”;

    OledbCommand. cmd = 新的 OledbCommand.(SQL,CN);

   cn.Open();

   cmd.executenonquery();

}

  

Jet Provider非常擅长将字符串解析为OLE自动化日期,只要字符串遵循可识别日期的格式。我将添加一个文本框和一个按钮到表单,并使用它作为将输入的值的源:

  

<形式 id="form1" runat.="server">

<div>

    <asp.:文本框 ID="TextBox1" runat.="server" />

    <布尔 />

    <asp.:按钮 ID="Button1" runat.="server" onclick.="Button1_Click" 文本="Button" />

</div>

</形式>

  

接下来,我将更改代码后面以将处理放在按钮单击事件中:

 

保护 空白 Button1_Click(目的 发件人, eventargs. e)

{

  细绳 Connect =. “Provider = Microsoft.jet.oledb.4.0;数据源= | DataDirectory | MBBase.mdb”;

  使用 (OledBConnection. CN = 新的 OledBConnection.(连接))

  {

    细绳 SQL = “插入测试(MyDateTime)值(?)”;

    OledbCommand. cmd = 新的 OledbCommand.(SQL,CN);

    cmd.parameters.addwithvalue(,textbox1.text);

    cn.Open();

    cmd.executenonquery();

  }

}

 

使用此设置,所有以下字符串都可以输入文本框并插入数据库DateTime字段而不存在问题:

2008年12月13日
13 December 2008
13 Dec 08
13 December 08
Dec 13 08
Dec 13 2008
13/12/2008
13/12/08
13-12-08
13 12 08
13 12 2008
与其他人一起,但这应该是为了暂时做。

问题是您如何将用户以可接受的格式输入日期?有许多UI方式可以完成这一点。您可以通过向表单添加说明来告诉他们,或者您只需使用日历控件(来自Ajax控件工具包的日历扩展器是好的,就像许多jQuery日期选择器插头INS)并自行设置格式。或者您可以提供日期,月和年的下拉列表,并控制这种格式。

约会时间的时间部分是一个微小的比特不同。例如尝试在DateTime中传递.Now将导致一个"标准表达中的数据类型不匹配"错误。原因是.NET DateTime.Now属性包含毫秒,可以通过使用以下格式写入当前时间来查看:

 

细绳。格式(“{0:yyyy-mm-dd hh:mm:ssss:ffffff}”, 约会时间。现在)

 

访问无法处理毫秒,因为如果我们记得,OLE自动化日期的右侧只能持有经过一天的比例 全秒。对于当前的时间,最简单的解决方案是在您的SQL中使用现在()的访问内置函数,就像我们之前的date()一样。如果要添加另一个时间,则有各种选项。 ToString()方法从.NET DateTime对象中删除毫秒,因此这是一种方法:

 

保护 空白 Button1_Click(目的 发件人, eventargs. e)

{

  细绳 Connect =. "Provider = Microsoft.jet.oledb.4.0;数据源= | DataDirectory | MBBase.mdb";

  使用 (OledBConnection. CN = 新的 OledBConnection.(连接))

  {

    细绳 SQL = "插入测试(MyDateTem)值(?)";

    OledbCommand. cmd = 新的 OledbCommand.(SQL,CN);

    cmd.parameters.addwithvalue("", 约会时间.now.adddays(-10).tostring());

    cn.Open();

    cmd.executenonquery();

  }

}

 

另一个是使用tooadate()方法,将.NET DateTime转换为OLE自动化日期,就像我们建立的那样是什么访问真的很喜欢:

 

保护 空白 Button1_Click(目的 发件人, eventargs. e)

{

  细绳 Connect =. "Provider = Microsoft.jet.oledb.4.0;数据源= | DataDirectory | MBBase.mdb";

  使用 (OledBConnection. CN = 新的 OledBConnection.(连接))

  {

    细绳 SQL = "插入测试(MyDateTem)值(?)";

    OledbCommand. cmd = 新的 OledbCommand.(SQL,CN);

    cmd.parameters.addwithvalue("", 约会时间.now.addhours(36).tooadate());

    cn.Open();

    cmd.executenonquery();

  }

}

 

同样,有一个相当数量的有效格式作为字符串进入文本框:

13/12/2008 20:00:00
2008年12月13日8:00:00 PM
13 Dec 08 08:00:00
2008-12-13 18:00:00
etc.

区域设置

通常,在Web应用程序运行时,您将在同一台计算机上拥有访问数据库,因此在日期格式方面不太可能是任何变化。但是,值得指出,内置访问功能,日期()和现在()从数据库所在的计算机上拾取当前系统时间。因此,它来说是一个问题在具有英国区域设置的机器上开发应用程序,其中日期格式通常是DD / mm / yyyy,然后将其转移到美国的服务器,其中区域设置将期望mm / dd / yyyy。在Access中更改表设计器中的格式绝对没有对底层值的影响。正如我们已经建立的那样,底层值存储为双重精度浮点数,而不是格式化的日期和时间。格式选项仅允许您指示您希望如何在表视图中查看日期和时间的访问,或者以表单和报告。

如果您认为,您的应用程序可能在您无法控制区域设置的计算机上运行,​​或者它们未知,则始终建议您以Yyyy-mm-dd格式或Toooadate的输入日期( )。这样,7月3日的可能性在未来的某个阶段成为3月的第7月。当然,在访问中查询日期时,最好使用YYYY-MM-DD格式。此外,使用参数消除了使用日期和时间的分隔符时遇到的大多数问题。