2016-10-05 29 views
2

誰もがDateTimeという値を嫌うようです。DateTime値の形式を変更する

私のプロジェクトでは、SQL SELECTクエリを使用して、パラメータ値と一致するデータベース内の結果を検索しています。

私が持っているコードは次のとおりです。

Dim where As String = "WHERE [Supp_Code] = @scode " & _ 
    "AND [DateFrom] = @datfrom " & _ 
    "AND [DateTo] = @datto " & _ 
    "AND [Comm_Code] = @ccode " & _ 
    "AND [Customer_Code] = @custcode " 

Dim sql As String = "SELECT [Comm_Code], [AqYear] FROM [Acquisition Commission] " 

sql &= where & " ORDER BY [AqYear] ASC" 

Dim cmd As New OleDb.OleDbCommand(sql, con) 
cmd.Parameters.AddWithValue("@scode", cmbSupp.Text.Trim) 
cmd.Parameters.AddWithValue("@datfrom", datFrom.Value) 
cmd.Parameters.AddWithValue("@datto", datTo.Value) 
cmd.Parameters.AddWithValue("@ccode", txtCommCode.Text) 
cmd.Parameters.AddWithValue("@custcode", cmbCustomerCode.Text) 

Dim daYear As New OleDb.OleDbDataAdapter(cmd) 
Dim dsYear As New DataSet 
daYear.Fill(dsYear) 

コード自体は全く問題がありません。問題は、DateTimeの形式がDateTimePickerDateTimePicker)のDateTime(これはDateTimePicker)ですが、データベースには 'dd/MM/yyyy'という名前で格納されているため、DataSetには0行しか格納されません。

パラメータとして使用する前に、正しいデータベース形式に変換する最も簡単な方法は何ですか?以下のコメント/解答を使用して

EDIT

、私は次のように私のコードを適応してきました:

Dim test As DateTime 
Dim test2 As DateTime 
    test = ugDates.ActiveRow.Cells("DateFrom").Value 
    test = ugDates.ActiveRow.Cells("DateTo").Value 

Try 
    Dim where As String = "WHERE [Supp_Code] = @scode " & _ 
     "AND [DateFrom] = @datfrom " & _ 
     "AND [DateTo] = @datto " & _ 
     "AND [Comm_Code] = @ccode " & _ 
     "AND [Customer_Code] = @custcode " 

Dim sql As String = "SELECT DISTINCT [Comm_Code], [AqYear] FROM [Acquisition Commission] " 

    sql &= where & " ORDER BY [AqYear] ASC" 

    Dim cmd As New OleDb.OleDbCommand(sql, con) 
    cmd.Parameters.Add("@scode", OleDbType.VarChar).Value = cmbSupp.Text 
    cmd.Parameters.Add(New OleDbParameter("@datfrom", OleDbType.Date).Value = test) 
    cmd.Parameters.Add(New OleDbParameter("@datto", OleDbType.Date).Value = test2) 
    cmd.Parameters.Add("@ccode", OleDbType.VarChar).Value = txtCommCode.Text 
    cmd.Parameters.Add("@custcode", OleDbType.VarChar).Value = cmbCustomerCode.Text 

しかし、それは私の二番目のパラメータに次のエラーを与える:

OleDbParameterCollectionは、Booleanオブジェクトではなく、null以外のOleDbParameter型オブジェクトのみを受け入れます。

+0

datFrom.ToString( "dd/MM/yyyy")で十分でしょうか? –

+0

[AddWithValue()の使用を中止できますか?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) –

+0

日付列は日付列型を使用します(varchar/stringは使用しません)。 –

答えて

5

(DateTimePickerコントロールである)datFrom.ValueのDateTime書式が「MM/DD/YYYY」であるが、データベースにそれがあるため問題は、データセットはしか0行を有することです'dd/MM/yyyy'として保存されます。

日付を文字列として保存しない限り、これはおそらく問題ではありません。日付は文字列ではなく構造体であり、本来は書式設定をしていません。書式設定は、文字列に適用されるものです。 intやdecimalのような数字に似ています。このフィールドが実際に文字列の場合は、スキーマを再訪し、それに応じて型を更新する必要があります。

ほとんどの場合、日付と時刻の比較は、パラメータORの値とクエリの値のどちらかで行います。

  • 使用DateValue機能のみ値の日付を比較

コードに日付値に格納されているデータベース

  • 利用.Dateの時間をトリミングする:

    Dim where As String = "WHERE [Supp_Code] = @scode " & _ 
         "AND DateValue([DateFrom]) = @datfrom " & _ 
         "AND DateValue([DateTo]) = @datto " & _ 
         "AND [Comm_Code] = @ccode " & _ 
         "AND [Customer_Code] = @custcode " 
    
    
    // select either OleDbType.Date or OleDbType.DBDate 
    
    cmd.Parameters.Add(new OleDbParameter("@datfrom", OleDbType.Date) With {.Value = datFrom.Value.Date}) 
    cmd.Parameters.Add(new OleDbParameter("@datto", OleDbType.Date) With {.Value = datTo.Value.Date}) 
    

    考えられるもう一つの問題は論理です。なぜなら、レンジチェックとレンジチェックのどちらをしないのでしょうか? dはDateFromDateToの等価性チェック?

    "AND DateValue([DateFrom]) >= @datfrom " & _ 
    "AND DateValue([DateTo]) <= @datto " & _ 
    

    理想的には@datfrom@dattoの両方のために、ここで同じ値を使用します。上記のクエリは、渡された日付パラメータにまたがる開始日/終了日を持つ項目です。

  • +0

    ありがとうございます。このコードの '{Value = datFrom ...'エラーがあります。-Valueは宣言されていません。これはC#でですか? – David

    +0

    @David - 'datFrom'コントロールに選択された値がないため、' datFrom.Value.Date'で 'DateTime'から日付部分を取得しようとすると、NRE(NullReferenceException)で失敗します。日付ピッカーに日付が選択されていて、 '.Value'の型が' DateTime'であることを確認しましたか? – Igor

    +0

    さて、私はいくつかの編集をしました...上記の質問は、今問題を診断しやすくするかもしれません – David