显示记录数量

时间:2016-09-15 20:36:43

标签: vbscript adodb

我有以下内容,但它没有将查询中的记录数放在MsgBox中。只有RR和TT。

On Error Resume Next
Dim recordCount2

Set con = CreateObject("ADODB.Connection")

Set objRecordset = CreateObject("ADODB.Recordset")
con.ConnectionString = "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Data Source=servername\logon;Initial Catalog=database_name"
con.Open
strQry = "SELECT * FROM smd..table_name (nolock) WHERE CAST(LastRunDate AS DATE) = CAST(GETDATE() AS DATE) AND TableNameKey in ('value1', 'value2')"
Set data = con.Open(strQry)

objRecordset.Open strQuery, adoConnection, adOpenDynamic, adLockOptimistic

recordCount2 = objRecordset.Count
MsgBox "TT " &  recordCount2 & "RR"

objRS.Close: Set objRS = Nothing 
con.Close: Set con = Nothing 

4 个答案:

答案 0 :(得分:2)

我的猜测是发生了一个由On error resume next隐藏的错误,而recordCount2 = objRecordset.Count实际上并没有成功。为什么你还有On error resume next?删除该行或将其注释掉,您的问题应该变得明显。

答案 1 :(得分:1)

使用On Error Resume Next不是magic bullet。特别喜欢@ansgar-wiechers

的引用
  

“与流行的看法相反,它并没有神奇地让错误消失。”

On Error Resume Next非常有用,但需要在正确的上下文中使用。当它处于活动状态时,任何引发错误的语句都会以静默方式处理,但会跳过引发错误的语句,并使用错误捕获的错误详细信息填充内置Err object

正如其他人建议你在调试这些类型的问题时应该做的第一件事就是注释掉On Error Resume Next然后我想要突出你的问题可能已经找到了。

在上面的示例中,有几行可能会引发错误并被跳过,这些是;

Set data = con.Open(strQry)

此语句似乎要在strQry中执行查询,但con.Open()是错误的方法,ADODB.Connection已经打开,不需要再次打开。你可能意味着(但这是一个纯粹的猜测);

Set data = con.Execute(strQry)

尝试运行后,您似乎没有使用data,所以在这种情况下,我暂时将其注释掉。

接下来是;

objRecordset.Open strQuery, adoConnection, adOpenDynamic, adLockOptimistic

尝试使用似乎未定义的ADO.Recordset打开strQueryadoConnection您可能意味着(再次猜测工作);

objRecordset.Open strQry, con, adOpenDynamic, adLockOptimistic

如果此语句引发错误并跳过语句

recordCount2 = objRecordset.Count

本身会出错,因为objRecordset .State将设置为adStateClosed

在提出这些建议后,您应该有类似的内容;

'On Error Resume Next
Dim recordCount2, constr

Set con = CreateObject("ADODB.Connection")

Set objRecordset = CreateObject("ADODB.Recordset")
constr = "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Data Source=servername\logon;Initial Catalog=database_name"
con.Open constr
strQry = "SELECT * FROM smd..table_name (nolock) WHERE CAST(LastRunDate AS DATE) = CAST(GETDATE() AS DATE) AND TableNameKey in ('value1', 'value2')"
'Set data = con.Open(strQry)

objRecordset.Open strQry, con, adOpenDynamic, adLockOptimistic

recordCount2 = objRecordset.Count
MsgBox "TT " &  recordCount2 & "RR"

objRecordset.Close: Set objRecordset = Nothing 
con.Close: Set con = Nothing

答案 2 :(得分:0)

尽量避免编写代码,只写入您绝对肯定的那些行/语句。如果您还没有看到一些文档解释为什么声明x是解决问题所必需的,请将x关闭。

在编写代码之前,请阅读文档:RecordCount property

  

... Recordset对象的游标类型会影响数字   记录可以确定。 RecordCount属性将返回-1   用于仅向前游标;静态或键集的实际计数   光标;和-1或动态光标的实际计数,   取决于数据源。 ...

所以你的计划是:

  1. 打开连接
  2. 获取记录集
  3. 访问其.RecordCount
  4. VBScript的一般框架包含:

    Option Explicit
    

    包含邪恶的全球OERN。

    数据库工作特定骨架包含:

    Dim oCn : Set oCN = CreateObject("ADODB.Connection")
    oCn.Open "DSN=???"
    ...
    oCn.Close
    

    not包含令人分心的Set x = Nothing尾巴。

    对于连接问题的生产脚本或测试代码,您需要编写长/复杂/定制的连接字符串;对于实验性代码而言,小型特定数据库特性/问题/意外之处(一劳永逸地与GUI支持一起使用)ODBC / DSN连接更高效且不易出错。

    Recordset应为.Opened以使用光标类型:

    oRs.Open "SELECT AddressId FROM Person.Address", oCn, adOpenDynamic
    

    可选锁定关闭(直到您有纪录或实验证据表明锁定类型影响.RecordCount)。

    如果您尝试运行

    Option Explicit
    
    Dim oCn : Set oCN = CreateObject("ADODB.Connection")
    oCn.Open "DSN=AdvWork"
    Dim oRs : Set oRS = CreateObject("ADODB.Recordset")
    oRs.Open "SELECT AddressId FROM Person.Address", oCn, adOpenDynamic
    WScript.Echo ".RecordCount:", oRs.RecordCount
    oCn.Close
    

    你会被告知:变量未定义:'adOpenDynamic'。进一步(重新)阅读,你的代码看起来像

    Option Explicit
    Const adOpenKeyset = 1
    
    Dim oCn : Set oCN = CreateObject("ADODB.Connection")
    oCn.Open "DSN=AdvWork"
    Dim oRs : Set oRS = CreateObject("ADODB.Recordset")
    oRs.Open "SELECT AddressId FROM Person.Address", oCn, adOpenKeyset
    WScript.Echo ".RecordCount:", oRs.RecordCount
    oCn.Close
    

    输出:

    cscript 39519953.vbs
    .RecordCount: 19614
    

    世界是一个(一点点)更好的地方。

答案 3 :(得分:0)

@Brad Larson和@ Ekkehard.Horner ....感谢您的指导,我也很努力地使用VBS从记录集获取记录计数,并从Windows SYSTEMINDEX获取一些信息(它一直返回-1)。
设置Const adOpenKeyset = 1,然后将该词添加到[recordset.oen "SELECT....", oCn, adOpenKeyset]行中即可!

  

您将被告知:变量未定义:“ adOpenDynamic”。一点   进一步(重新)阅读,您的代码将如下所示

Option Explicit
Const adOpenKeyset = 1

Dim oCn : Set oCN = CreateObject("ADODB.Connection")
oCn.Open "DSN=AdvWork"
Dim oRs : Set oRS = CreateObject("ADODB.Recordset")
oRs.Open "SELECT AddressId FROM Person.Address", oCn, adOpenKeyset
WScript.Echo ".RecordCount:", oRs.RecordCount
oCn.Close
     

输出:cscript 39519953.vbs .RecordCount:19614,世界是一个   (一点点)更好的地方。