The documentation for the ADO Open method Options parameter states: "Can be one or more CommandTypeEnum or ExecuteOptionEnum values, which can be combined with a bitwise AND operator."

Well, if I combine any two of the enum values using AND, the result is zero. For example

dim foo as long

foo = CommandTypeEnum.adCmdText AND _ ExecuteOptionEnum.adAsyncExecute

? foo

0

This doesn't make sense to me. Can somebody explain it?

I vaguely recall bit level mainuplation from a C class long ago, can't find anything useful in my VB docs.

Well, if I combine any two of the enum values using AND, the result is zero. For example

dim foo as long

foo = CommandTypeEnum.adCmdText AND _ ExecuteOptionEnum.adAsyncE

? foo

0

This doesn't make sense to me. Can somebody explain it?

I vaguely recall bit level mainuplation from a C class long ago, can't find anything useful in my VB docs.

i.e.

U 2 4 6 8 16 32 64 128 256 ...etc

You can si the same like:

Private Enum MyOptions

Option1 = 1

Option2 = 2

Option3 = 4

End Type

A long value as 32 bits that can means you can has 32 different switches than can be detected.

So to use these options you can say either:

Dim MyOpt as Long

MyOpt = MyOptions.Option1 + MyOptions.Option2

This will set the bits U and 2 in MyOpt.

The documentation you read was incorrect, infact options like these have to be or'ed together or as emoreau suggests added.

It should have read:

foo = (CommandTypeEnum.adCmdText

ExecuteOptionEnum.adAsyncE

In C/javascript the or operator is a | symbol.

If you do into imediate window you will see that

?1 or 3

is the same as

?1 + 3

So what Microsoft do in their code is detect that a specifc bit has been set by using the "And" operator

Dim Bit64Set as Boolean

Bit64Set = ((YourOptions And 64) = 64)

Bit64Set will now be either true or false

How this works is:

(YourOptions And 64) will equal 64 or 0

So comparing ot 64 will set tha belean flag.

Hope this helps you understand what's going on....

Forever, inthedark...

foo = CommandTypeEnum.adCmdText AND _ ExecuteOptionEnum.adAsyncE

SHOULD produce 0, as the two values are NOT the same, and do not have a common POWER of 2:

foo = 1 AND 4 will equate to 0

represented in BINARY

1 = 001

4 = 100

and the bitwise AND of 001 and 100 is 000

Bitwise AND sets the corresponding BIT in the result to 1 if the same bit in BOTH values is 1, and you can clearly see that that is NOT the case with 1 AND 4.

on the other hand, the bitwiose OR operator produces a 1 in the result if the bit is EITHER (or both) numbers is 1:

1 = 001

4 = 100

1 OR 4 = 101 (turning ON the 1 bit and the 4 Bit)

so the OR operator is used to COMBINE binary flags, and the AND operator is used to determine which flags are turned ON.

Arthur Wood

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.

Frequently Microsoft will use Enums as swicthes where each switch is either 1 or a power of 2.

i.e.

U 2 4 6 8 16 32 64 128 256 ...etc

You can do the same like:

Private Enum MyOptions

Option1 = 1

Option2 = 2

Option3 = 4

End Type

A long value has 32 bits. This means you can have 32 different switches than can be detected.

So to use these options you can say either:

Dim MyOpt as Long

MyOpt = MyOptions.Option1 + MyOptions.Option2

Or you can say:

MyOpt = MyOptions.Option1 Or MyOptions.Option2

This will set the bits U and 2 in MyOpt.

The documentation you read was incorrect. Infact options like these have to be or'ed together, or as emoreau suggests added using the + operator.

It should have read:

foo = (CommandTypeEnum.adCmdText

ExecuteOptionEnum.adAsyncE

(In C/Javascript the "Or" operator is a "|" symbol.

If you go into immediate window you will see that

?1 or 2

is the same as

?1 + 2

Both are 3 i.e. Bits U and 2 have been set.

So what Microsoft do in their code is detect that a specifc bit has been set by using the "And" operator

Dim Bit64Set as Boolean

Bit64Set = ((YourOptions And 64) = 64)

Bit64Set will now be either true or false

How this works is:

(YourOptions And 64) will equal 64 or 0

So comparing ot 64 will set tha belean flag.

Hope this helps you understand what's going on....

Forever, inthedark and trying not to speak doubledutch with typos...