在form里添加了一个adodc控件,指向数据库里的表,但adodc没有与像datagrid这样的控件一起使用,就是adodc指向的数据不显示出来。程序如下:               If UserInformation.RecordSet.EOF = False Or UserInformation.RecordSet.BOF = False Then
             
                UserInformation.RecordSet.MoveFirst
             
             Else
             
                CommunicationOrder = Over
        
             End If但是有错误提示"run-time'91':object variable or with block variable not set"
 
     出现这种错误,是因为adodc的属性没有设置好呢,还是应为没有与其他控件一起使用的原因呢?
  
    

解决方案 »

  1.   

    不用 用ado就可以,最好不要用控件.你这个代码写得真乱,完全不明UserInformation是你的ADODC控件名字? 晕 命名规范学习一西
    CommunicationOrder = Over //这是什么?另外错误代码出现在那一句?
      

  2.   

    出错一句
    If UserInformation.RecordSet.EOF = False Or UserInformation.RecordSet.BOF = False Then CommunicationOrder是一个字符串变量,over是一个定义了出值的常量我现在想从数据表里取数据发送出去,用adodc连接数据表,但提示上面一句有错误,我想错误可能出在ado上,我加了个datagrid就没错了,是不是一定要加datagrid给ado呢? 
      

  3.   

    Private Decode(1 To 64) As String   
    Private BufferCount As Integer     
    Private OperationBuffer As String
    Private ReadOperation As String       
    Private ReturnOperationCode As String          
    Private OfflinePermit As String                
    Private Over As String                         
    Public ReceiveBuffer As StringPrivate Sub Form_Load()CommunicationOrder = ""ReturnOperationCode = 1SendOperation = 2
    ReadOperation = 3UserQuit = 4                       
    SendOfflinePermit = 5              Over = "10"                                   '循环连接编码Case条件变量    '设置串口属性, 打开串口
        'Module1.BuadRate = 19200
        MSComm1.CommPort = 1                        '设置或返回端口号,值为1到16的整数,PC通常可以有16个串口
        MSComm1.InBufferSize = 1024                 '设置接收缓冲区的大小
        MSComm1.Settings = "115200,n,8,1"           '设置并返回通讯参数,值为字符串String行
        'MSComm1.Settings = BaudRate & ",n,8,1"
        MSComm1.InputLen = 0                        '设置或返回,从接收缓冲区读取的字符数,0时(默认),读取缓冲区全部字符
        MSComm1.RThreshold = 1                      '接收区的“门阀值”,0时(默认),不产生OnComm事件;1时,接收缓冲区每接收到一个字符,都会产生OnComm事件
        MSComm1.SThreshold = 1                      '发送区的“门阀值”,0时(默认),不产生OnComm事件;1时,发送缓冲区每接收到一个字符,都会产生OnComm事件
        MSComm1.InBufferCount = 0
        'MSComm1.PortOpen = True                     '通讯时,必须打开串口,应用程序完成时,MSComm控件自动关闭串口
        MSComm1.InputMode = comInputModeText        '以文本方式取回传入的数据,既comInputModeText = 0
        'Shape3.BackColor = &HEF00&    '建立本地数据库的连接,显示记录集
        LinkReceiveOperationAdodc.ConnectionString = Module1.ConnectString
        LinkReceiveOperationAdodc.CommandType = adCmdText
        LinkReceiveOperationAdodc.RecordSource = "select * from ReceiveOperationList where Status = 1 "
        LinkReceiveOperationAdodc.Mode = adModeReadWrite
        
    '强制打开串口
        If MSComm1.PortOpen = False Then
           MSComm1.PortOpen = True
        End If
        
        '设置接收计时器Timer2的参数,先关闭计时器,在发送时,再启动计时器扫描
        ScanTimer.Interval = 50
        ScanTimer.Enabled = False
        
    End Sub
    Private Sub ScanTimer_Timer()ReceiveBuffer = MSComm1.Input
    Sleep (10)CommunicationOrder = Mid(ReceiveBuffer, 3, 1)Select Case CommunicationOrder:    Case ReturnOperationCode             
            If LinkFinishOperationAdodc.RecordSet.EOF = False Or LinkFinishOperationAdodc.RecordSet.BOF = False Then
                 
                 LinkFinishOperationAdodc.RecordSet.MoveFirst
                 
            Else
                 Exit Sub         
            End If
                       
        Case ReadOperation    
            If LinkReceiveOperationAdodc.RecordSet.EOF = False Or LinkReceiveOperationAdodc.RecordSet.BOF = False Then
                 
                 LinkReceiveOperationAdodc.RecordSet.MoveLast
                 
            Else
                 
                 LinkReceiveOperationAdodc.RecordSet.AddNew
                 
                 End If
                    
            Call ReceiveDecode
           
        Case UserQuit      
                If UserInformation.RecordSet.EOF = False Or UserInformation.RecordSet.BOF = False Then             
                    Call OfflineOperation                
                Else           
                 Exit Sub            
                End If         
         Case Over                    
                CommunicationOrder = ""                                
        End Select
        DoEvents    
        CommunicationOrder = ""
        ReceiveBuffer = ""
    End SubPrivate Sub StartCircleCommand_Click()
        ScanTimer.Enabled = True
    End Sub
      

  4.   

    Private Sub ReceiveDecode()
    '显示接收表当前的记录集,接收状态=1的记录'从ReceiveBuffer拆字符,然后放入对应的变量和数组    CodeLength = Left(ReceiveBuffer, 1)
        TerminalID = Mid(ReceiveBuffer, 2, 1)    CommunicationCode = Mid(ReceiveBuffer, 3, 1)
        LocalStationID = Mid(ReceiveBuffer, 4, 1)
        
        ContainerIDArray(0) = Mid(ReceiveBuffer, 5, 1)
        ContainerIDArray(1) = Mid(ReceiveBuffer, 6, 1)
        ContainerIDArray(2) = Mid(ReceiveBuffer, 7, 1)
        ContainerIDArray(3) = Mid(ReceiveBuffer, 8, 1)
        ContainerIDArray(4) = Mid(ReceiveBuffer, 9, 1)
        ContainerIDArray(5) = Mid(ReceiveBuffer, 10, 1)
        ContainerIDArray(6) = Mid(ReceiveBuffer, 11, 1)
        ContainerIDArray(7) = Mid(ReceiveBuffer, 12, 1)
        ContainerIDArray(8) = Mid(ReceiveBuffer, 13, 1)
        ContainerIDArray(9) = Mid(ReceiveBuffer, 14, 1)
        ContainerIDArray(10) = Mid(ReceiveBuffer, 15, 1)
        
        SourceAddressArray(0) = Mid(ReceiveBuffer, 16, 1)
        SourceAddressArray(1) = Mid(ReceiveBuffer, 17, 1)
        SourceAddressArray(2) = Mid(ReceiveBuffer, 18, 1)
        SourceAddressArray(3) = Mid(ReceiveBuffer, 19, 1)
        SourceAddressArray(4) = Mid(ReceiveBuffer, 20, 1)
        SourceAddressArray(5) = Mid(ReceiveBuffer, 21, 1)
        SourceAddressArray(6) = Mid(ReceiveBuffer, 22, 1)
        SourceAddressArray(7) = Mid(ReceiveBuffer, 23, 1)
       
        TargetAddressArray(0) = Mid(ReceiveBuffer, 24, 1)
        TargetAddressArray(1) = Mid(ReceiveBuffer, 25, 1)
        TargetAddressArray(2) = Mid(ReceiveBuffer, 26, 1)
        TargetAddressArray(3) = Mid(ReceiveBuffer, 27, 1)
        TargetAddressArray(4) = Mid(ReceiveBuffer, 28, 1)
        TargetAddressArray(5) = Mid(ReceiveBuffer, 29, 1)
        TargetAddressArray(6) = Mid(ReceiveBuffer, 30, 1)
        TargetAddressArray(7) = Mid(ReceiveBuffer, 31, 1)
        
        TruckNumberArray(0) = Mid(ReceiveBuffer, 32, 1)
        TruckNumberArray(1) = Mid(ReceiveBuffer, 33, 1)
        TruckNumberArray(2) = Mid(ReceiveBuffer, 34, 1)
        TruckNumberArray(3) = Mid(ReceiveBuffer, 35, 1)
        TruckNumberArray(4) = Mid(ReceiveBuffer, 36, 1)
        TruckNumberArray(5) = Mid(ReceiveBuffer, 37, 1)
        TruckNumberArray(6) = Mid(ReceiveBuffer, 38, 1)
        TruckNumberArray(7) = Mid(ReceiveBuffer, 39, 1)
        
        ContainerWeight = Mid(ReceiveBuffer, 40, 1)
        ContainerSize = Mid(ReceiveBuffer, 41, 1)        
    '将数组转成字符,再合并成字符串
        
        ContainerID = ContainerIDArray(0) & ContainerIDArray(1) & ContainerIDArray(2) & ContainerIDArray(3) & ContainerIDArray(4) & ContainerIDArray(5) & ContainerIDArray(6) & ContainerIDArray(7) & ContainerIDArray(8) & ContainerIDArray(9) & ContainerIDArray(10)
        SourceAddress = SourceAddressArray(0) & SourceAddressArray(1) & SourceAddressArray(2) & SourceAddressArray(3) & SourceAddressArray(4) & SourceAddressArray(5) & SourceAddressArray(6) & SourceAddressArray(7)
        TargetAddress = TargetAddressArray(0) & TargetAddressArray(1) & TargetAddressArray(2) & TargetAddressArray(3) & TargetAddressArray(4) & TargetAddressArray(5) & TargetAddressArray(6) & TargetAddressArray(7)
        TruckNumber = TruckNumberArray(0) & TruckNumberArray(1) & TruckNumberArray(2) & TruckNumberArray(3) & TruckNumberArray(4) & TruckNumberArray(5) & TruckNumberArray(6) & TruckNumberArray(7)
        '对记录集进行填加新的记录
        '将合并的字符串,分别放入记录集所对应的字段,同时补加日期和时间值
        'LinkReceiveOperationAdodc.RecordSet.AddNew
        LinkReceiveOperationAdodc.RecordSet.Fields("CodeLength") = CodeLength
        LinkReceiveOperationAdodc.RecordSet.Fields("TerminalID") = TerminalID
        LinkReceiveOperationAdodc.RecordSet.Fields("CommunicationCode") = CommunicationCode
        LinkReceiveOperationAdodc.RecordSet.Fields("LocalStationID") = LocalStationID
        
        LinkReceiveOperationAdodc.RecordSet.Fields("ContainerID") = ContainerID
        LinkReceiveOperationAdodc.RecordSet.Fields("SourceAddress") = SourceAddress
        LinkReceiveOperationAdodc.RecordSet.Fields("TargetAddress") = TargetAddress
        LinkReceiveOperationAdodc.RecordSet.Fields("TruckNumber") = TruckNumber
        LinkReceiveOperationAdodc.RecordSet.Fields("ContainerWeight") = ContainerWeight
        LinkReceiveOperationAdodc.RecordSet.Fields("ContainerSize") = ContainerSize
        LinkReceiveOperationAdodc.RecordSet.Fields("ReceiveDate") = Date
        LinkReceiveOperationAdodc.RecordSet.Fields("ReceiveTime") = Time()
        LinkReceiveOperationAdodc.RecordSet.Fields("Status") = "1"
        LinkReceiveOperationAdodc.RecordSet.AddNew
        End SubPrivate Sub ReturnOperation()'在完成操作的记录集中,定位第一条记录,开始编码,组成字符串,送到串口发送
    LinkFinishOperationAdodc.RecordSet.MoveNext'将合并的字符串,分别放入记录集所对应的字段,同时补加日期和时间值
        
        CodeLength = LinkFinishOperationAdodc.RecordSet.Fields("CodeLength")
        TerminalID = LinkFinishOperationAdodc.RecordSet.Fields("TerminalID")
        CommunicationCode = 3 ' LinkFinishOperationAdodc.RecordSet.Fields("CommunicationCode")
        LocalStationID = LinkFinishOperationAdodc.RecordSet.Fields("LocalStationID")
        
        ContainerID = LinkFinishOperationAdodc.RecordSet.Fields("ContainerID")
        SourceAddress = LinkFinishOperationAdodc.RecordSet.Fields("SourceAddress")
        TargetAddress = LinkFinishOperationAdodc.RecordSet.Fields("TargetAddress")
        TruckNumber = LinkFinishOperationAdodc.RecordSet.Fields("TruckNumber")
        ContainerWeight = LinkFinishOperationAdodc.RecordSet.Fields("ContainerWeight")
        ContainerSize = LinkFinishOperationAdodc.RecordSet.Fields("ContainerSize")
       
        LinkFinishOperationAdodc.RecordSet.Fields("Status") = "0"
        
        '合并成串口字符串
        OperationBuffer = CodeLength & LocalStationID & CommunicationCode & TerminalID & ContainerID & SourceAddress & TargetAddress & TruckNumber & ContainerWeight & ContainerSize & "1"
               
        '调用发送字符串子程序
           MSComm1.Output = OperationBuffer  
    End SubPrivate Sub OfflineOperation()
    Dim UserID As String
    Dim UserPassword As String
    If UserInformation.RecordSet.Fields("UserID") = "" Or UserInformation.RecordSet.Fields("UserPassword") = "" Then        Exit Sub
        Else
        UserID = UserInformation.RecordSet.Fields("UserID")
        UserPassword = UserInformation.RecordSet.Fields("UserPassword")End If      OperationBuffer = Chr(Len("e5" & UserID & UserPassword)) & "e5" & UserID & UserPassword
        
        '调用发送字符串子程序   
           MSComm1.Output = OperationBuffer      
    End Sub
    整理了一下,但是代码还是有点乱,主要是边调,边改。还有个问题,在Select Case CommunicationOrder:语句中,CommunicationOrder是用来存从串口接受的数据的第三个字节数据的,之后对其判断。但是在串口没有接受数据时,却执行了执行下面这段,
        Case UserQuit      
                If UserInformation.RecordSet.EOF = False Or UserInformation.RecordSet.BOF = False Then             
                    Call OfflineOperation                
                Else           
                 Exit Sub            
                End If         
         Case Over                    
                CommunicationOrder = ""                                
        End Select
     此时我加了datagrid,上面的错误"run-time'91':object variable or with block variable not set" 没有了。但是CommunicationOrder 为“”空啊,怎么执行到case UserQuit  就成立了呢?
      

  5.   

    在开始要加一句:adodc1.refresh
      

  6.   

    你的代码比较长,没有时间仔细看,你可以在form_load中在使用adodc1之前加上adodc1.refresh
      

  7.   

    在使用前加adodc1.refresh,问题解决。但是另一个问题
    在Select Case CommunicationOrder:语句中,CommunicationOrder是用来存从串口接受的数据的第三个字节数据的,之后对其判断。但是在串口没有接受数据时,却执行了执行下面这段, 
        Case UserQuit      
                If UserInformation.RecordSet.EOF = False Or UserInformation.RecordSet.BOF = False Then            
                    Call OfflineOperation                
                Else          
                Exit Sub            
                End If        
        Case Over                    
                CommunicationOrder = ""                                
        End Select 
    此时我加了datagrid,上面的错误"run-time'91':object variable or with block variable not set" 没有了。但是CommunicationOrder 为“”空啊,怎么执行到case UserQuit  就成立了呢?
    是不是因为UserQuit 没有定义的原因呢?我在程序最顶端加了Private UserQuit As String之后,case语句就正常了,不会在没有接受到“UserQuit”的情况下运行Case UserQuit了。   是不是没有定义UserQuit引起了select case出错呢? 
    还有If UserInformation.RecordSet.Fields("UserID") = "" Or UserInformation.RecordSet.Fields ("UserPassword") = "" 这句总是提示“invalied use of null",为什么呢?
      

  8.   

    1.是没有定义UserQuit引起了select case出错
    2.UserInformation.RecordSet.Fields("UserID")或者 UserInformation.RecordSet.Fields"UserPassword")为NULL,应该先用IsNull(UserInformation.RecordSet.Fields("UserID") )和IsNull(UserInformation.RecordSet.Fields("UserPassword") )进行判断。不过,建议这些字段在数据库中就设为不允许为NULL,一般来说,更为合理些。