2016-10-05 93 views
2

似乎每個人都恨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) 

代碼本身沒有問題。問題在於DataSet只有0行,因爲datFrom.Value(它是DateTimePicker控件)的DateTime格式爲'MM/dd/yyyy',但在數據庫中它存儲爲'dd/MM/yyyy'。

什麼是使用它作爲一個參數之前轉換其正確的數據庫格式的最簡單的方法?

編輯

使用下面的意見/答案,我已經適應我的代碼如下:

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只接受非空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

的問題是,該數據集永遠只能有0行,因爲datFrom.Value的DateTime格式(這是一個DateTimePicker控件)是「MM/DD/YYYY」,但在數據庫中它是存儲爲「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}) 

另一個可能的問題是邏輯,爲什麼不做一個介於或範圍檢查instea d的平等檢查DateFromDateTo

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

理想情況下,你會在這裏使用相同的值兩個@datfrom@datto。上面的查詢將是任何具有跨越傳入的日期參數的開始/結束日期的項目。

+0

謝謝!當執行此代碼的{Value = datFrom ...'部分時,Value有一個錯誤-Value沒有聲明 - 在它下面;它表示操作符不是有效..這是在C#中嗎? – David

+0

@David - 可能是控件'datFrom'沒有選擇的值,在這種情況下,試圖用'datFrom.Value.Date'從'DateTime'中檢索日期部分將失敗,並返回NRE(NullReferenceException)。你是否檢查過日期選擇器有一個選擇的日期,並且'.Value'的類型是'DateTime'? – Igor

+0

好的,我已經做了一些編輯......現在上面的問題可能會使問題更容易診斷 – David