【问题标题】:Convert ASP.NET textbox control .text contents to Date/Time format将 ASP.NET 文本框控件 .text 内容转换为日期/时间格式
【发布时间】:2013-03-28 23:56:23
【问题描述】:

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

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

VB:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim oleDbConn As New OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("BookMeetConnString").ConnectionString)
    Dim SqlString As String = "Insert into Events(EventTitle,EventDescription,EventDate,EventCategory) Values
   (@f1,@f2,@f3,@f4)"
    Dim cmd As OleDbCommand = New OleDbCommand(SqlString, oleDbConn)

    Dim strDate As String = tb_eventdate.Text
    Dim dtfi As New System.Globalization.DateTimeFormatInfo
    dtfi.ShortDatePattern = "dd/MM/yyyy"
    dtfi.DateSeparator = "/"
    Dim objDate As DateTime = Convert.ToDateTime(strDate, dtfi)

    cmd.CommandType = CommandType.Text
    cmd.Parameters.AddWithValue("@f1", tb_eventtitle.Text)
    cmd.Parameters.AddWithValue("@f2", tb_eventdescription.Text)
    cmd.Parameters.AddWithValue("@f3", tb_eventdate.Text)
    cmd.Parameters.AddWithValue("@f4", dd_eventcategory.Text)
    oleDbConn.Open()
    cmd.ExecuteNonQuery()
    System.Threading.Thread.Sleep("2000")
    Response.Redirect("~/calendar.aspx")
End Sub

这是我的客户端代码仅供参考:

 <h1>Add An Event!<ajaxToolkit:ToolkitScriptManager
 ID="ToolkitScriptManager1" 
                   runat="server">
               </ajaxToolkit:ToolkitScriptManager>
            </h1>
            <p>Title of Event:
                <asp:TextBox ID="tb_eventtitle" runat="server"></asp:TextBox>
            </p>
            <p>Event Description:
                <asp:TextBox ID="tb_eventdescription" runat="server"></asp:TextBox>
            </p>
            <p>Event Date:
                <asp:TextBox ID="tb_eventdate" runat="server"></asp:TextBox>
                <ajaxToolkit:CalendarExtender ID="tb_eventdate_CalendarExtender" runat="server" 
                    TargetControlID="tb_eventdate">
                </ajaxToolkit:CalendarExtender>
            </p>
            <p>Event Category:
                <asp:DropDownList ID="dd_eventcategory" runat="server" 
                    DataSourceID="SqlDataSource1" DataTextField="CategoryTitle" 
                    DataValueField="CategoryTitle">
                </asp:DropDownList>
            </p>
            <p>
                <asp:Button ID="Button1" runat="server" Text="Submit" />
            </p>

当我尝试填写表格时,我收到此错误:

我的两个问题是:

  1. 上面的代码有什么问题,如何成功使用 DateTimeFormatInfo 类将字符串转换为日期/时间?
  2. 附带说明,日历扩展器以美国时间格式 (MM/DD/YYYY) 将日期输入到文本框中,如何将其更改为英国 (DD/MM/YYYY) 格式(我看不到属性对话框中有一个明显的属性来执行此操作?)

提前感谢您的回答!

亚当

编辑:更新以下代码:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim oleDbConn As New OleDb.OleDbConnection(ConfigurationManager.ConnectionStrings("BookMeetConnString").ConnectionString)
    Dim SqlString As String = "Insert into Events(EventTitle,EventDescription,EventDate,EventCategory) Values
 (@f1,@f2,@f3,@f4)"
    Dim cmd As OleDbCommand = New OleDbCommand(SqlString, oleDbConn)
    cmd.CommandType = CommandType.Text
    cmd.Parameters.AddWithValue("@f1", tb_eventtitle.Text)
    cmd.Parameters.AddWithValue("@f2", tb_eventdescription.Text)
    cmd.Parameters.AddWithValue("@f3", DateTime.ParseExact(tb_eventdate.Text, "dd/MM/yyyy",
   CultureInfo.InvariantCulture))
    cmd.Parameters.AddWithValue("@f4", dd_eventcategory.Text)
    oleDbConn.Open()
    cmd.ExecuteNonQuery()
    System.Threading.Thread.Sleep("2000")
    Response.Redirect("~/calendar.aspx")
End Sub

【问题讨论】:

    标签: asp.net vb.net ms-access calendarextender datetimeformatinfo


    【解决方案1】:

    我建议你使用DateTime.ParseExact 静态方法,尤其是这个超载:

    DateTime.ParseExact(textBox.Text, "dd/MM/yyyy",CultureInfo.InvariantCulture)

    这将按照您指定的具体格式解析您拥有的文本("dd/MM/yyyy" 目前,大小写很重要,因为mm 是分钟,而MM 是几个月)。使用CultureInfo.InvariantCulture 保证将从格式字符串(第二个参数)中检索日期分隔符。我注意到如果使用当前文化,它会覆盖您传递给ParseExact 的格式字符串的某些方面。


    关于 CultureInfo 的说明

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


    关于日期/时间格式的说明

    通过精确解析,日期时间格式应严格匹配输入格式。然后,您应该考虑以下示例:

    • 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 数据库提供程序,该提供程序告诉参数使用什么数据库类型。我在一些论坛上读到 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 数据库。

    【讨论】:

    • 谢谢你,我已经更新了我的代码以反映你的建议。但是我仍然收到“不被识别为有效的日期时间”错误。您能否发布一些工作代码,以便我理解 DateTime.ParseExact 方法的语法/格式?
    • @adaam,我重新审视了我的答案,以解决您可能遇到的一些其他格式问题。我仍然不确定您的代码有什么问题。你能告诉我你什么时候收到错误吗?对DateTime.ParseExact 的调用是失败,还是在到达数据库后失败?如果是后者,可能是该参数没有被数据库正确接受。
    • 调用成功 - 来自文本框的值被传递(见我调试过程的截图:wherelionsroam.co.uk/valuepassed.PNG)。到达 cmd.ExecuteNonQuery() 时抛出“条件表达式中的数据类型不匹配”错误
    • (P.s 上面的截图我使用了 Parse,但我也听从了你的建议并使用了 ParseExact 但仍然收到错误)
    • 谢谢你,我终于让它工作了。我在上面使用了您的方法(定义参数类型似乎可以解决问题!)
    【解决方案2】:

    我使用了以下短代码:

    //myDateValue is System.DateTime object.
    OleDbCommand commandObject = new OleDbCommand(); 
    ...   
    commandObject.Parameters.Add(new OleDbParameter("@ADDED_DATE_PARAM", OleDbType.Date).Value = myDateValue);
    

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2023-03-18
      • 2012-04-12
      • 2019-01-14
      • 1970-01-01
      相关资源
      最近更新 更多