6

イベントに関するさまざまな詳細をデータベースに挿入しようとしています。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>

フォームに入力しようとすると、次のエラーが表示されます。

日時エラー

私の2つの質問は次のとおりです。

  1. 上記のコードの問題点と、DateTimeFormatInfo クラスを使用して String を Date/Time に変換する方法を教えてください。
  2. 余談ですが、Calendar Extender は日付をアメリカ時間形式 (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
4

2 に答える 2

5

DateTime.ParseExact静的メソッド、特にこのオーバーロードを使用することをお勧めします。

DateTime.ParseExact(textBox.Text, "dd/MM/yyyy",CultureInfo.InvariantCulture)

これにより、指定した具体的な形式でテキストが解析されます ("dd/MM/yyyy"現在、月ではなく分であるため、大文字と小文字が区別されます)。を使用すると、日付区切り文字が書式文字列 (2 番目のパラメーター) から取得されることが保証されます。現在のカルチャが使用されている場合、に渡すフォーマット文字列のいくつかの側面がオーバーライドされることに気付きました。mmMMCultureInfo.InvariantCultureParseExact


CultureInfo に関する注意事項

インバリアント カルチャは、ローカルの開発環境が展開環境とは異なる地域情報を設定している可能性があるという理由からも優れています。通常、.NET はすべての呼び出しと暗黙的な書式設定または解析で現在のカルチャを使用します。.ToStringフォーマットとカルチャの不変性を明示的に強制すると、ローカルでは再現できないが本番アプリケーションには存在する問題が発生する可能性が低くなります。


日付/時刻形式に関する注意

正確な解析では、日時形式は入力の形式と厳密に一致することが期待されます。次に、次の例を考慮する必要があります。

  • dd2 桁の日のみに一致します。したがって"dd/MM/yyyy"、 には一致しますが、日の部分の正確な桁数が必要なため、"01/01/2013"for は失敗します。"1/1/2013"先行ゼロを使用したくない場合は、d/M/yyyy代わりに: を使用してください。1 文字は、それよりも少ない日は 1 桁、それ以外は102 桁を意味します。
  • MMは 2 桁の月に一致するため、ddvs . に適用されることdは月についても同じです。
  • yyyy年は 4 桁である必要があります。2 桁の年を使用する場合は、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 データベースに正しく渡すことができるようになりました。

于 2013-04-06T16:15:20.873 に答える
0

以下のショートコードを使用しました:

//myDateValue is System.DateTime object.
OleDbCommand commandObject = new OleDbCommand(); 
...   
commandObject.Parameters.Add(new OleDbParameter("@ADDED_DATE_PARAM", OleDbType.Date).Value = myDateValue);
于 2016-02-09T14:34:11.007 に答える