Поймите тестирование, если набор записей ADO открыт - PullRequest
0 голосов
/ 12 сентября 2018

Я искал способ узнать, открыт ли набор записей ADO.Я нахожу это , где я встретил синтаксис:

If Not (rs Is Nothing) Then
  If (rs.State And 1) = 1 Then rs.Close
  Set rs = Nothing
End If

Я прочитал объяснение, опубликованное @Raybarg, однако у меня есть следующий вопрос: Синтаксис:

If Not (rs Is Nothing) Then
  If rs.State > 0 Then rs.Close
  Set rs = Nothing
End If

isне эквивалентно?Может быть случай, когда Recordset существует, но свойство .State возвращает что-то отличное от ObjectStateEnum value?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Обычно каждый бит может быть установлен индивидуально, поэтому проверка первого способа гарантирует, что установлен флаг открытия.Возможно, вы думаете, что нет случая, когда состояние не будет открытым, потому что другие состояния являются модификаторами открытого состояния.Давайте посмотрим на ссылку MS API для RecordSet.State.Он содержит нечто под названием ObjectStateEnum.Мы можем видеть, что есть одно состояние, которое не открыто и не закрыто и называется «Соединение».Ваш второй метод будет пытаться закрыть соединение, которое находится в состоянии Соединение, где первый метод не будет.Это единственное функциональное отличие, которое я вижу.

ObjectStateEnum

Constant            Value   Description
--------            -----   -----------
adStateClosed       0       Indicates that the object is closed.
adStateOpen         1       Indicates that the object is open.
adStateConnecting   2       Indicates that the object is connecting.
adStateExecuting    4       Indicates that the object is executing a command.
adStateFetching     8       Indicates that the rows of the object are being retrieved.

ИСТОЧНИК: https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/objectstateenum?view=sql-server-2017

0 голосов
/ 13 сентября 2018

На самом деле вы ответили на свой вопрос: эти два не эквивалентны, поскольку существует пять различных состояний, из которых adStateOpen (= 1) является единственным, который 1-й синтаксис позволяет закрыть Объекту.Возможно, вы не захотите закрывать объект во время выполнения или выборки и т. Д. (Как в разделе «Открыть и выполнение»: adStateOpen + adStateExecuting = 1 + 4 = 5)

x AND 1 = 1 только если x = 1, в противном случае x AND 1 = 0 для любого другого значения х.Тем не менее, в первом примере синтаксиса было бы достаточно просто проверить If rs.State = 1 Then rs.Close.

...