在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的属性没有设置好呢,还是应为没有与其他控件一起使用的原因呢?
UserInformation.RecordSet.MoveFirst
Else
CommunicationOrder = Over
End If但是有错误提示"run-time'91':object variable or with block variable not set"
出现这种错误,是因为adodc的属性没有设置好呢,还是应为没有与其他控件一起使用的原因呢?
CommunicationOrder = Over //这是什么?另外错误代码出现在那一句?
If UserInformation.RecordSet.EOF = False Or UserInformation.RecordSet.BOF = False Then CommunicationOrder是一个字符串变量,over是一个定义了出值的常量我现在想从数据表里取数据发送出去,用adodc连接数据表,但提示上面一句有错误,我想错误可能出在ado上,我加了个datagrid就没错了,是不是一定要加datagrid给ado呢?
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
'显示接收表当前的记录集,接收状态=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 就成立了呢?
在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",为什么呢?
2.UserInformation.RecordSet.Fields("UserID")或者 UserInformation.RecordSet.Fields"UserPassword")为NULL,应该先用IsNull(UserInformation.RecordSet.Fields("UserID") )和IsNull(UserInformation.RecordSet.Fields("UserPassword") )进行判断。不过,建议这些字段在数据库中就设为不允许为NULL,一般来说,更为合理些。