Преобразовать ASP.NET элемент управления textbox.текстовое содержимое в формате Дата / Время
Я пытаюсь вставить в базу данных - различные детали о событии. В asp.net textbox использует расширитель календаря (поэтому появляется маленький календарь и заполняет текстовое поле правильно отформатированной датой). Поле EventDate в моей базе данных Access имеет тип Дата / Время. Мне нужно преобразовать текст/строку в формат даты/времени
Я пробовал это до сих пор:
В. Б.:
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>
когда я пытаюсь заполнить форму, я получаю эту ошибку:
мои два вопроса:
- что не так с кодом выше, и как я могу успешно использовать класс DateTimeFormatInfo для преобразования строки в дату/время?
- на боковой ноте расширитель календаря вводит дату в текстовое поле в американском формате времени (MM/DD/YYYY), как изменить это на британский (Dd/MM / YYYY) формат (я не видел очевидного свойства в диалоговом окне свойств, чтобы сделать это?)
заранее спасибо за ваши ответы!
Адам
EDIT: обновленный код ниже:
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 ответов
я бы рекомендовал вам использовать DateTime.ParseExact
статический метод, особенно этот oveload:
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
вместо. Одна буква означает одну цифру на дней меньше!--17--> и две цифры для других. -
MM
соответствует двузначному месяцу, поэтому все, что относится кdd
иd
то же самое в течение нескольких месяцев. -
yyyy
ожидает год в 4 цифры. Если вы используете двузначный год, используйте .
заметка о некоторых ADO.NET поставщики
как оказалось в случае с MS Access, правильно проанализированный объект date-time недостаточно для работы запроса. В настоящее время, следующий код
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.
я использовал ниже код:
//myDateValue is System.DateTime object.
OleDbCommand commandObject = new OleDbCommand();
...
commandObject.Parameters.Add(new OleDbParameter("@ADDED_DATE_PARAM", OleDbType.Date).Value = myDateValue);