将ASP.NET文本框控件.text内容转换为日期/时间格式

时间:2013-04-06 16:11:47

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

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

到目前为止我已尝试过这个:

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>

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

date time error

我的两个问题是:

  1. 上面的代码有什么问题,我如何成功使用DateTimeFormatInfo类将String转换为Date / Time?
  2. 在旁注中,Calendar Extender以美国时间格式(MM / DD / YYYY)将日期输入文本框,如何将其更改为英国(DD / MM / YYYY)格式(我看不到)在属性对话框中有一个明显的属性来执行此操作吗?)
  3. 提前感谢您的回答!

    亚当

    编辑:更新了以下代码:

    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
    

2 个答案:

答案 0 :(得分:5)

我建议你使用DateTime.ParseExact静态方法,特别是这个oveload:

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数据库。

答案 1 :(得分:0)

我使用下面的短代码:

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