首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用日期时“数据标准与SQL不匹配”

使用日期时“数据标准与SQL不匹配”
EN

Stack Overflow用户
提问于 2015-04-02 07:38:40
回答 3查看 242关注 0票数 1

我正在尝试使用这个查询,但是我得到了一个错误

标准中的数据不匹配

Dat是MS Access数据库中的Date列。我试图为每个名为Total的行在从数据筛选器中选择的日期之间选择名为Pro的列之和。

有很多关于这方面的帖子,但我的查询与那些不同

代码语言:javascript
复制
Dim DTST As String
DTST = DateTimePicker1.Value.ToString

Dim DTEn As String
DTEn = DateTimePicker2.Value.ToString

Dim Query1 As String = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN'" + DTST + "' AND '" + DTEn + "'"

Dim cmd2 As OleDb.OleDbCommand = New OleDbCommand(Query1, dbCon)
cmd2.Parameters.AddWithValue("@Pro", ComboBoxBP.SelectedItem.ToString)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-02 09:05:42

我的编辑似乎被取消了,下面是:

代码语言:javascript
复制
Dim DTST As String
DTST = DateTimePicker1.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim DTEn As String
DTEn = DateTimePicker2.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim Query1 As String = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN " + DTST + " AND " + DTEn + ""
票数 2
EN

Stack Overflow用户

发布于 2015-04-02 12:37:03

日期只是额外的参数。您的方法(以及其他答案)的一个问题是,您正在将非常好的DateTime变量转换为string。MSAccess/OleDb通常对事情有意义,但这是不必要的,允许其他东西来解释您的意图通常是不可取的。

DB列必须实现为Date类型,才能将数据视为Dates (介于之间),但不需要“格式化”日期变量(任何时候)。

另一个问题是在处理命令和连接对象时处理它们:

代码语言:javascript
复制
Dim SQL = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN @dt1 AND @dt2"


Using dbCon As OleDbCOnnection(GetConnection()),
     cmd As New OleDbCommand(SQL, dbCon)

    dbCon.Open

    ' ToDO be sure SelectedItems.COunt >0 earlier
    cmd2.Parameters.AddWithValue("@Pro", ComboBoxBP.SelectedItem.ToString)
    cmd2.Parameters.AddWithValue("@dt1",  DateTimePicker1.Value)   
    cmd2.Parameters.AddWithValue("@dt2",  DateTimePicker2.Value)  

    Dim Total = cmd.ExecuteScalar()
    ...
End Using     ' close and dispose of Command and Connection objects

如您所见,您将DateTime值作为任何其他参数传递给它,并且DTP的.Value属性将完全正常工作,无需任何按摩或处理。

这是一个关于 method和dbConnections信息的链接。

请注意,OleDB实际上没有使用命名参数(@Pro,@dt1 1)。它们只是占位符,您必须按照它们在SQL语句中出现的相同顺序进行AddWithValue。比较常见的情况是将params指定为"?",但是有意义的params有助于将右var映射到代码中的右param。

最后,这在DateTimePicker中是不可能发生的,但是将UI控件中的字符串粘合在一起会导致SQL注入攻击,因此应该始终避免。使用参数的SQL通常更容易编写、生成、读取和处理。

票数 4
EN

Stack Overflow用户

发布于 2015-04-02 08:12:42

Access中的参数化日期需要包装在引号之外的#(如果是文字日期,例如#10/10/2015# )

代码语言:javascript
复制
Dim DTST As String
DTST = DateTimePicker1.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim DTEn As String
DTEn = DateTimePicker2.Value.ToString("'#'yyyy'/'MM'/'dd'#'")

Dim Query1 As String = "SELECT SUM(Total) FROM [T500] WHERE Pro =@Pro AND Dat BETWEEN " + DTST + " AND " + DTEn + ""

Dim cmd2 As OleDb.OleDbCommand = New OleDbCommand(Query1, dbCon)
cmd2.Parameters.AddWithValue("@Pro", ComboBoxBP.SelectedItem.ToString)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29407520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档