2016-10-05 70 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