我正在尝试插入数据库-有关事件的各种详细信息。 asp.net文本框正在使用Calendar Extender(日历弹出器)(因此会弹出一个小日历,并用正确格式的日期填充文本框)。我的Access数据库中的EventDate字段的类型为Date/Time。我需要将文本/字符串转换为日期/时间格式

到目前为止,我已经尝试过了:

VB:



这是我的客户端代码,仅供引用:



当我尝试填写表格时,出现以下错误:

我的两个问题是:

  • 上面的代码有什么问题,如何成功使用DateTimeFormatInfo类将String转换为Date/Time?
  • 旁注:日历扩展器以美国时间格式(MM/DD/YYYY)将日期输入到文本框中,如何将其更改为英国(DD/MM/YYYY)格式(我看不到属性对话框中的属性来执行此操作?)
    预先感谢您的回答!

    亚当

    编辑:更新下面的代码:

    最佳答案

    我建议您使用DateTime.ParseExact静态方法,尤其是以下方法:
    DateTime.ParseExact(textBox.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture )
    这将根据您指定的具体格式来解析您的文本(当前为"dd/MM/yyyy"的情况对于很重要,因为mm是分钟,而不是MM是月)。使用CultureInfo.InvariantCulture可以确保从格式字符串(第二个参数)中检索日期分隔符。我注意到,如果使用当前的区域性,它将覆盖传递给ParseExact的格式字符串的某些方面。

    关于CultureInfo的注释

    不变的文化也很好,这是因为您的本地开发环境可能具有与部署环境不同的区域信息设置。通常,.NET在所有.ToString调用以及隐式格式或解析中都使用当前区域性。显式强制格式和区域性不变时,您不太容易出现无法在本地复制但存在于生产应用程序中的问题。

    关于日期/时间格式的注释

    通过精确的解析,datetime格式应严格匹配输入格式。然后,您应考虑以下示例:

  • dd仅匹配两位数的日期。因此,"dd/MM/yyyy"将与"01/01/2013"匹配,但对于"1/1/2013"将失败,因为它期望日部分的确切位数。如果您不希望前导零,请使用:d/M/yyyy。单个字母表示少于10的天数为一位,其余为两位数。
  • MM与两位数的月份匹配,因此,适用于ddd的所有月份都相同。
  • yyyy期望年份为4位数字。如果您使用两位数的年份,请改用yy


  • 有关某些ADO.NET提供程序的说明

    事实证明,使用MS Access时,正确分析的日期时间对象不足以使查询正常工作。目前,以下代码
     cmd.Parameters.AddWithValue(...)
    

    用于向查询添加参数。但是,此方法省略了传递信息到ADO.NET db提供程序的信息,该提供程序告诉该参数要使用哪种数据库类型。我已经在某些论坛上阅读到MS Access/OleDb不能在所有情况下都解析正确的类型。因此,我建议采用以下方法:
    Dim prm as OleDbParameter = _
       New OleDbParameter("@dateTimeParameterName", OleDbType.DateTime)
    prm.Value = value  'value is an instance of `System.DateTime` parsed
                       'from the input
    cmd.Parameters.Add(prm)
    

    上面的代码允许显式地指定参数数据库类型,因此OleDb驱动程序现在能够正确地将DateTime对象传递给MS Access数据库。

    10-01 23:20
    查看更多