我有以下内容,但它没有将查询中的记录数放在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
答案 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
打开strQuery
,adoConnection
您可能意味着(再次猜测工作);
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或动态光标的实际计数, 取决于数据源。 ...
所以你的计划是:
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,世界是一个 (一点点)更好的地方。