2016-09-15 2 views
0

У меня есть следующее, но оно не помещает количество записей из запроса в MsgBox. Только RR и TT.display recordcount

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 
+2

*** НИКОГДА *** не используйте глобальный 'On Error Resume Next', особенно если вы не выполняете обработку ошибок. Вопреки распространенному мнению, магические ошибки не исчезают. Это просто делает их невозможными для отладки. Также удалите строку 'Set data = con.Open (strQry)' (что это должно делать в любом случае?) И на самом деле проверьте [состояние подключения] (https://msdn.microsoft.com/en-us/library/ окна/настольные/ms675068% 2 = vs.85% 29.aspx). –

ответ

2

Я думаю, что есть ошибка, которая происходит, которая прячась от On error resume next и recordCount2 = objRecordset.Count не на самом деле успех. Почему у вас есть On error resume next? Удалите эту строку или прокомментируйте ее, и ваша проблема станет очевидной.

+0

Полностью согласен с тем, что эта строка не имеет смысла - 'objRecordset.Open strQuery, adoConnection, adOpenDynamic, adLockOptimistic', то, что' strQuery' и 'adoConnection' оба не определены в коде. – Lankymart

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 
+0

привет. я попробовал предыдущее предложение. но теперь я получаю сообщение об ошибке SQL Server не существует или доступ запрещен. Я удостоверился, что имя моего сервера существует и написано правильно. Что может вызвать эту ошибку? Это может быть установка безопасности на работе? – user2811136

+0

@ user2811136 Тот факт, что вы так далеко продвигаетесь вперед, теперь просто нужно убедиться, что вы используете правильную строку соединения. На данный момент он ожидает [надежного подключения к SQL Server] (http://www.connectionstrings.com/microsoft-ole-db-provider-for-sql-server-sqloledb/trusted-connection/), который, скорее всего, не работая в этом сценарии. Опубликуйте немного больше информации о том, какую версию SQL Server вы используете, и мы можем помочь. – Lankymart

0

Избегайте писать код как можно больше, написав только те строки/заявления, которые вы абсолютно уверены. Если вы не видели документацию, которая объясняет, почему утверждение x необходимо для решения вашей проблемы, оставьте x выключенным.

Прежде чем писать код, читать документы: RecordCount property:

... Тип курсора объекта Recordset влияет, можно ли определить число записей. Свойство RecordCount вернет -1 для курсора только вперед; фактический счетчик для статического или набора ключей курсор; и либо -1, либо фактическое количество для динамического курсора, в зависимости от источника данных. ...

Так ваш план:

  1. Открыть соединение
  2. Получить RecordSet
  3. Доступ его .RecordCount

Общий скелет для VBScript содержит:

Option Explicit 

Это не содержит злой глобальный ОРЕАН.

Работа базы данных конкретный скелет содержит:

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

Он not содержит отвлекающие Set x = Nothing хвостов.

Для сценариев производства или проблем с тестовым кодом, связанным с подключением, вам необходимо написать длинные/сложные/индивидуальные строки подключения; для экспериментального кода по небольшим специфическим функциям базы данных/проблемам/неожиданностям a (один раз для всех - puzzled-together-with-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 

и мир есть (немного) лучше.

+0

привет. У меня есть пользователь, у которого есть пароль, например testthis01 !. Но я думаю, что! отбрасывает его. Я получаю сообщение об ошибке «Логин не удался ...» – user2811136

+0

Нет ничего плохого в том, что «В случае ошибки в следующем», если оно используется в правильном контексте и отладки, это не проблема, когда все, что вам нужно сделать, это прокомментировать строку. Рекомендация использования DSN - все хорошо и хорошо, но не у всех есть прямой доступ к их веб-серверу * (совместный хостинг, над защитными сетевыми администраторами и т. Д.) *, Не говоря уже о поле разума для размещения DSN в правильном месте на 32/64 разрядных систем. Также, поощряя людей не выпускать ссылки на объекты, просто глупо, нет ничего отвлекающего от них преимущества от лишнего веса неудобства * (если бы вы даже могли это назвать) * – Lankymart

Смежные вопросы