建了一个ActiveX EXE来监控SQL中某个表的变化,引用ADO,类中有一个ActiveConnection属性用于获取应用程序传递来的Connection,然后在get_data方法中用ADO Command对象执行存储过程,问题就在,给类的ActiveConnection对象赋值时没问题,但在get_data中,把这个ActiveConnection赋值给执行存储过程的Command.ActiveConnection总是出错,传递过来的Connection对象是没问题的,然后我把这个ActiveX Exe修改一下成ActiveX DLL,执行起来却没问题,怎么回事?
下面是ActiveX EXE类中简化的代码(换成ActiveX DLL就没问题了)Option Explicit
Private CMD As New ADODB.Command
Private CONN As New ADODB.Connection
Public Property Get ActiveConnection() As ADODB.Connection
    Set ActiveConnection = CONN
End Property
Public Property Set ActiveConnection(vCONN As ADODB.Connection)
    Set CONN = vCONN
    Set CMD.ActiveConnection = CONN
End Property
Public Sub getData()
    Dim TEMPCMD As New ADODB.Command
    On Error GoTo ErrorHand
    With TEMPCMD
        Set .ActiveConnection = CONN '调试到这行出错
        MsgBox "设置连接成功"
        .CommandType = 4
        .CommandText = "test"
        .Execute
    End With
    Exit Sub
ErrorHand:
    MsgBox Err.Number, Err.Description
End Sub

解决方案 »

  1.   

    Option Explicit
    Private CMD As New ADODB.Command
    Private CONN As New ADODB.Connection
    Public Property Get ActiveConnection() As ADODB.Connection
        Set ActiveConnection = CONN
    End Property
    Public Property Set ActiveConnection(vCONN As ADODB.Connection)
        Set CONN = vCONN
        Set CMD.ActiveConnection = CONN                              本来是没有这行的,我特意加了一个CMD变量来调试,发现连这行都有问题,是不是command对象的bug?
    End Property
    Public Sub getData()
        Dim TEMPCMD As New ADODB.Command
        On Error GoTo ErrorHand
        With TEMPCMD
            Set .ActiveConnection = CONN '调试到这行出错
            MsgBox "设置连接成功"
            .CommandType = 4
            .CommandText = "test"
            .Execute
        End With
        Exit Sub
    ErrorHand:
        MsgBox Err.Number, Err.Description
    End Sub
      

  2.   

    多谢unsigned的回答,那你的意思是,Connection对象不能垮进程空间传递?我再次测试之后发现,传递给ActiveX EXE的ActiveConnection是有打开的,也是有效的,以下代码调用就没问题
    Option Explicit
    Private CONN As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Public Property Get ActiveConnection() As ADODB.Connection
        Set ActiveConnection = CONN
    End Property
    Public Property Set ActiveConnection(vCONN As ADODB.Connection)
        Set CONN = vCONN
        Set rs = CONN.Execute("Select * From td_m_staff")         '此处执行正确,输出了正确的结果,说明CONN是没问题的呀!
        MsgBox rs.RecordCount
        'CONN.Open
    End Property上面的代码没问题,实在不知道怎么回事
    但是换成以下的又就行了
    ..........Public Property Set ActiveConnection(vCONN As ADODB.Connection)
        Dim rs As New ADODB.Recordset
        Set CONN = vCONN
        rs.open Execute "Select * From td_m_staff",conn       '此处执错误,提示类型不匹配,怪哉!
        MsgBox rs.RecordCount
        'CONN.Open
    End Property我引用的ADO2.8,为什么Recordset和Command在ActiveX Exe里就不能用这个Conneciton呢?
    是不是这个Connection从应用程序传到ActiveX Exe时中间发生了交通事故?虽然现在可以用Connetion的Execute方法来执行存储过程达到想要的效果,现在我就想知道为啥Recordset和Command不能用这个Connection!我调一整天了!
      

  3.   

    在微软技术论坛得到的回复是Connection对象是个状态敏感对象,不能垮进程传递,直接传递是很有风险的,但可以把ConnectionString属性传过去,效果是一样的.上面的Execute方法这所以能够执行是因为在传递Connection对象时,状态信息无法传递,但ConnectionString没问题,所以能Execute方法,而因为其他一些信息无效所以无法给Command和Recordset使用