Преобразовать 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>

когда я пытаюсь заполнить форму, я получаю эту ошибку:

date time error

мои два вопроса:

  1. что не так с кодом выше, и как я могу успешно использовать класс DateTimeFormatInfo для преобразования строки в дату/время?
  2. на боковой ноте расширитель календаря вводит дату в текстовое поле в американском формате времени (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);