gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:12:55 25 4
gpt4 key购买 nike

我正在尝试插入数据库 - 有关事件的各种详细信息。 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>


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

date time error

我的两个问题是:
  • 上面的代码有什么问题,我如何成功使用 DateTimeFormatInfo 类将字符串转换为日期/时间?
  • 附带说明一下,日历扩展器以美国时间格式 (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

    最佳答案

    我建议您使用 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匹配两位数的月份,所以所有这些都适用于 dd对比 d几个月都是一样的。
  • 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 数据库。

    关于asp.net - 将 ASP.NET 文本框控件 .text 内容转换为日期/时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15853054/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com