ada*_*aam 6 vb.net asp.net ms-access calendarextender datetimeformatinfo
我正在尝试插入数据库 - 有关事件的各种详细信息.asp.net文本框正在使用Calendar Extender(因此弹出一个小日历并使用正确格式化的日期填充文本框).Access数据库中的EventDate字段的类型为Date/Time.我需要将文本/字符串转换为日期/时间格式
到目前为止我试过这个:
VB:
Run Code Online (Sandbox Code Playgroud)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
这是我的客户端代码仅供参考:
Run Code Online (Sandbox Code Playgroud)<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>
当我尝试填写表单时,收到此错误:

我的两个问题是:
提前感谢您的回答!
亚当
编辑:更新的代码如下:
Run Code Online (Sandbox Code Playgroud)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静态方法,特别是这个oveload:
DateTime.ParseExact(textBox.Text, "dd/MM/yyyy",CultureInfo.InvariantCulture)
这将按您指定的具体格式解析您拥有的文本("dd/MM/yyyy"目前,案例很重要,因为mm是分钟而不是MM几个月).将使用CultureInfo.InvariantCulture格式字符串(第二个参数)检索日期分隔符的保证.我注意到如果使用当前文化,它将覆盖您传递给的格式字符串的某些方面ParseExact.
不变文化也是好的,因为您的本地开发环境可能具有与部署环境不同的区域信息设置.通常,.NET 在所有调用和隐式格式化或解析中使用当前区域性.ToString.在明确强制格式和文化不变性时,您不太容易出现无法在本地重现但在生产应用程序中存在的问题.
通过精确解析,日期时间格式应严格匹配输入的格式.然后,您应该考虑以下示例:
dd只匹配两位数的天数.所以"dd/MM/yyyy"它会匹配"01/01/2013",但会失败,"1/1/2013"因为它需要日期部分的确切位数.如果你不想使用前导零:d/M/yyyy相反.单个字母表示小于一天的一位数字,另一位数字表示10两位数字.MM匹配两位数的月份,因此适用于ddvs.的所有d内容在几个月内都是相同的.yyyy预计年份为4位数.如果您使用两位数年份,请yy改用.事实证明是MS Access的情况,正确解析的日期时间对象不足以使查询工作.目前,以下代码
cmd.Parameters.AddWithValue(...)
Run Code Online (Sandbox Code Playgroud)
用于向查询添加参数.但是,此方法省略了将信息传递给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)
Run Code Online (Sandbox Code Playgroud)
上面的代码允许显式指定参数数据库类型,因此OleDb驱动程序现在能够正确地将DateTime对象传递给MS Access数据库.
| 归档时间: |
|
| 查看次数: |
17686 次 |
| 最近记录: |