Registrations are now open. Join us today!
There is still a lot of work to do on the wiki yet! More information about editing can be found here.
Already have an account?

Microsoft KB Archive/246458

From BetaArchive Wiki
Knowledge Base


Article ID: 246458

Article Last Modified on 2/23/2007



APPLIES TO

  • Microsoft Message Queuing 2.0



This article was previously published under Q246458

SYMPTOMS

The IsFirstInTransaction property of a Microsoft Message Queuing MSMQMessage object returns an integer result rather than a Boolean. IsFirstInTransaction returns a 1 if the message is the first in the transaction and a 0 if it is not. This can cause logic errors in a Visual Basic (VB) program if the property is used in the expression portion of an If, While, or similar conditional statement.

When a numeric value is used in a condition statement in VB, 0 is evaluated as false and all non-zero values are evaluated as true. The Not operator in VB inverts the bits of a value when used on a numeric value. The expression "Not 1" produces the result "-2" which is considered a "true" value in a VB condition statement.

Since VB evaluates both "1" and "Not 1" as true statements, if a message is the first in a transaction both "message.IsFirstInTransaction" and "Not message.IsFirstInTransaction" will evaluate true. In the following example code, if the message is the first in a transaction both message boxes appear:

If message.IsFirstInTransaction Then
   MsgBox "The message was the first message sent in the transaction."
End If

If Not message.IsFirstInTransaction Then
   MsgBox "The message was not the first message sent in the transaction."
End If
                

RESOLUTION

There are two possible workarounds for the problem:

  1. Explicitly test the value of the IsFirstInTransaction property against 0 and 1. A value of 1 indicates that the message is the first in the transaction, a value of 0 indicates that the message is not the first in the transaction. An example of this test is shown in the following code:

    If MSMQMessageObject.IsFirstInTransaction = 1 Then
       MsgBox "The message was the first message sent in the transaction."
    End If
    
    If MSMQMessageObject.IsFirstInTransaction = 0 Then
       MsgBox "The message was not the first message sent in the transaction."
    End If
                            
  2. Avoid "negative" tests that use the Not operator with the IsFirstInTransaction property.


STATUS

It is safe to test explicitly for the 1 and 0 values. These values will not be changed in any future version of Message Queuing and will remain consistent. Future versions of the Message Queuing ActiveX components may add a property that may be evaluated as a true Boolean type for testing this characteristic.

MORE INFORMATION

The MSDN Online help describes the return values for the IsFirstInTransaction property as follows:

MSMQMessage.IsFirstInTransaction

Returned Value
   1 
      The message was the first message sent in the transaction. 
   0 
      The message was not the first message sent in the transaction. 
                

REFERENCES

MSDN Online Help for the MSMQMessage Object
Visual Basic Programmer's Guide

246218 MSMQMessage Object IsAuthenticated Property Returns an Integer



246222 MSMQQueueInfo Object IsTransactional Property Returns An Integer



246225 MSMQQueueInfo Object IsWorldReadable Property Returns and Integer


245753 MSMQQueue Object IsOpen Property Returns an Integer



246460 MSMQMessage Object IsLastInTransaction Property Returns An Integer



Additional query words: MSMQ MSMQMessage IsFirstInTransaction

Keywords: kbprb KB246458