首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索用于OleDBCommand的查询

检索用于OleDBCommand的查询
EN

Stack Overflow用户
提问于 2016-06-25 17:50:23
回答 3查看 1.6K关注 0票数 0

我目前正在使用下面的VB代码对Access数据库进行查询,我想知道是否有可能获得正在运行的SELECT语句并将输出发送到控制台。

代码语言:javascript
复制
    Dim QuestionConnectionQuery = New OleDb.OleDbCommand("SELECT Questions.QuestionID FROM Questions WHERE Questions.QuestionDifficulty=[X] AND ( Questions.LastDateRevealed Is Null OR Questions.LastDateRevealed < DateAdd('d',-2,Date() ) AND Questions.LastUsedKey NOT LIKE ""[Y]"" );", QuestionConnection)
    QuestionConnectionQuery.Parameters.AddWithValue("X", questionDifficulty.ToString)
    QuestionConnectionQuery.Parameters.AddWithValue("Y", strDatabaseKey)

现在,当我尝试使用:Console.WriteLine("Query: " & QuestionConnectionQuery.ToString)

我只知道这个:

代码语言:javascript
复制
Loop Question #1
Query: System.Data.OleDb.OleDbCommand
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-25 18:28:52

简短的版本可以归结为:

代码语言:javascript
复制
QuestionConnectionQuery.ToString

QuestionConnectionQuery对象不仅仅是命令的文本。它还包括参数、执行类型、超时和许多其他内容。如果您想要命令文本,请请求它:

代码语言:javascript
复制
QuestionConnectionQuery.CommandText

但这只是第一个问题。

现在,您的参数没有被正确定义,所以这个查询永远不会成功。OleDb使用?作为参数占位符。然后,将参数添加到集合的顺序必须与占位符在查询中显示的顺序相匹配。您问题中的代码只是直接用于参数占位符的XY。你想这么做:

代码语言:javascript
复制
Dim QuestionConnectionQuery AS New OleDb.OleDbCommand("SELECT Questions.QuestionID FROM Questions WHERE Questions.QuestionDifficulty= ? AND ( Questions.LastDateRevealed Is Null OR Questions.LastDateRevealed < DateAdd('d',-2, Date() ) AND Questions.LastUsedKey NOT LIKE ? );", QuestionConnection)
QuestionConnectionQuery.Parameters.Add("?", OleDbType.Integer).Value  = questionDifficulty
QuestionConnectionQuery.Parameters.Add("?", OleDbType.VarChar, 20).Value =  strDatabaseKey

我得猜你参数的类型和长度。调整它以匹配数据库中列的实际类型和长度。

一旦您完成了这些修复,接下来要了解的是,完成的查询永远不存在。参数化查询的全部要点是参数数据是从不直接替换到sql命令文本中,甚至不是由数据库引擎代替。这使用户数据与命令分离,并防止sql注入攻击的任何可能性。

当我在这里时,您可能还想检查查询中的WHERE条件。WHERE子句当前如下所示:

代码语言:javascript
复制
WHERE A AND ( B OR C AND D )

每当您看到类似于ANDOR旁边时,在相同的括号部分中,我必须停下来询问这是否是真正的意图,或者是否应该在最终的AND条件之前关闭括号:

代码语言:javascript
复制
WHERE A AND (B OR C) AND D
票数 1
EN

Stack Overflow用户

发布于 2016-06-25 17:54:56

若要获取或设置将运行的命令的文本,请使用CommandText属性。

要打印结果,需要实际执行查询。调用其ExecuteReader方法以获得OleDbDataReader。您可以使用它来迭代行。

代码语言:javascript
复制
Dim reader = QuestionConnectionQuery.ExecuteReader()
While reader.Read
    Console.WriteLine(reader.GetValue(0))
End While
reader.Close()

如果提前知道列的数据类型,可以使用类型特定的方法,如GetInt32。如果有多个列,请将本例中的0更改为所需列的基于零的索引。

票数 0
EN

Stack Overflow用户

发布于 2016-06-25 18:25:28

这将获取命令文本并在参数值中交换。它不一定是有效的SQL,NET对象还没有转义,但是您可以看到值是什么,调试的顺序是什么:

代码语言:javascript
复制
Function GetFullCommandSQL(cmd As Data.Common.DbCommand) As String

    Dim sql = cmd.CommandText

    For Each p As Data.Common.DbParameter In cmd.Parameters
        If sql.Contains(p.ParameterName) AndAlso p.Value IsNot Nothing Then
            If p.Value.GetType Is GetType(String) Then
                sql = sql.Replace(p.ParameterName,
                                  String.Format("'{0}'", p.Value.ToString))
            Else
                sql = sql.Replace(p.ParameterName, p.Value.ToString)
            End If
        End If
    Next

    Return sql
End Function

给定以下SQL:

代码语言:javascript
复制
Dim sql = "INSERT INTO Demo (`Name`, StartDate, HP, Active) VALUES (@name, @start, @hp, @act)"

在提供了参数之后,您可以获得以下内容:

代码语言:javascript
复制
INSERT INTO Demo (`Name`, StartDate, HP, Active) VALUES ('johnny', 2/11/2010 12:00:00 AM, 6, True)

需要对其进行修改,以便与OleDB‘?键入参数占位符。但是,如果DbCommand对象是由OleDBCOmmandBuilder创建的,那么它就可以工作,因为它在内部使用"@pN“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38031311

复制
相关文章

相似问题

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