我是让它循环执行的,在第一遍执行时是正确的,第二遍时出现的中断。
我修改过它的Set params = .Parameters 语句,即直接用
parameters.Append cmd.CreateParameter(,,,)调用,但还是在第二遍时出错。
请高手帮帮忙,在线等候!!
一定给分。
我修改过它的Set params = .Parameters 语句,即直接用
parameters.Append cmd.CreateParameter(,,,)调用,但还是在第二遍时出错。
请高手帮帮忙,在线等候!!
一定给分。
我猜测有可能是ADO的连接缓存没清空。
是不是你的存储过程Ist_SendInfo使用了Begin tran
而没有用commit导致事务没有执行完
Public Sub Initializedatabase()
Dim strA, strS As String
strA = App.Path
If Right(str, 1) <> "\" Then
strA = strA + "\"
End If
Data1.DatabaseName = strA & "suju.mdb"
Set cnn = New ADODB.Connection
cnn.CursorLocation = adUseClient
strS = "Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;" _
& "User ID=fasterweb;Initial Catalog=dataCar;Data Source=jiangh"
cnn.Open strSEnd SubTimer事件:
Private Sub TimerAtoS_Timer()
Dim realnum, realtime, realtext As StringData1.RecordSource = "recors"
Data1.RefreshIf Data1.Recordset.RecordCount > 0 Then
Set cmd = New ADODB.Command
Set params = cmd.Parameters
params.Append cmd.CreateParameter("@InfoStr", adChar, adParamInput, 1)
params.Append cmd.CreateParameter("@Phone", adChar, adParamInput, 11)
params.Append cmd.CreateParameter("@SendInfo", adVarChar, adParamInput, 32)
params.Append cmd.CreateParameter("@CarbrandId", adChar, adParamInput, 6)
params.Append cmd.CreateParameter("@Dtime", adDBTimeStamp, adParamInput, 4)
params.Append cmd.CreateParameter("@Dlong", adSingle, adParamInput)
params.Append cmd.CreateParameter("@Dlat", adSingle, adParamInput)
params.Append cmd.CreateParameter("@Dcareer", adSingle, adParamInput)
params.Append cmd.CreateParameter("@Dtrend", adVarChar, adParamInput, 8)
params.Append cmd.CreateParameter("@Dguide", adVarChar, adParamInput, 10)
params.Append cmd.CreateParameter("@Dabnomity", adChar, adParamInput, 4)
Data1.Recordset.MoveFirst
Do While Not Data1.Recordset.EOF
realnum = Data1.Recordset.Fields("realnum")
realtime = Data1.Recordset.Fields("realtime")
realtext = Data1.Recordset.Fields("realtext")
Call callsql(realnum, realtext)
Data1.Recordset.Delete
DoEvents
If Data1.Recordset.RecordCount > 0 Then
Data1.Recordset.MoveNext
Else
Set cmd = Nothing
End If
Loop
End If
End Sub
Public Sub callsql(rnum, rtext)
Dim Infostr, Phone, SendInfo, CarbrandId, Dtrend, Dguide, Dabnomity As String
Dim Dtime As String
Dim Dlong, Dlat, Dcareer As Single
Dim m As String
Dim k, g, n, x As Integer
Dim i, j As String
Dim s(8) As String
Dim gpsangle As StringInfostr = Phone = SendInfo = Dtrend = CarbrandId = Dguide = Dabnomity = Null
Dlong = Dlat = Dcareer = Null
m = Len(rtext)
Select Case m
Case 5
Infostr = "1"
Case 9
Infostr = "2"
Case 14
Infostr = "3"
Case 19
Infostr = "4"
Case 26 Or 27
Infostr = "5"
Case 52
Infostr = "6"
Case Else
Infostr = "0"
End Select
SendInfo = rtext
Phone = rnum
Dtime = Date & " " & Time 'Format(Time, "hh:mm")Debug.Print DtimeIf (Infostr = "3") Or (Infostr = "4") Or (Infostr = "5") Then
If Right(Left(rtext, 7), 1) = "," Then
CarbrandId = Left(rtext, 6)
Else
'出错处理
End If
End If
If (Infostr = "6") Then
i = ","
x = Len(rtext)
j = rtext
g = -1
k = 1
Do While k <> 0
For n = 1 To x
k = InStr(j, i)
Next n
Debug.Print k
g = g + 1
s(g) = Left(j, k - 1)
If Len(j) - k <> 0 Then
j = Right(j, Len(j) - k)
Else
k = 0
End If
Debug.Print j
Loop
If Len(s(0)) = 10 And Len(s(1)) = 1 And s(3) = "N"
And s(5) = "E" And Len(s(6)) <> 0 And Len(s(7)) <> 0 Then
gpsangle = CSng(s(7))
Select Case gpsangle
Case ((gpsangle >= 0) And (gpsangle < 10)) Or ((gpsangle >= 350) And (gpsangle <= 360))
Dtrend = "正北方向"
Case (gpsangle >= 10) And (gpsangle < 80)
Dtrend = "东北方向"
Case (gpsangle >= 80) And (gpsangle < 100)
Dtrend = "正东方向"
Case (gpsangle >= 100) And (gpsangle < 170)
Dtrend = "东南方向"
Case (gpsangle >= 170) And (gpsangle < 190)
Dtrend = "正南方向"
Case (gpsangle >= 190) And (gpsangle < 260)
Dtrend = "西南方向"
Case (gpsangle >= 260) And (gpsangle < 280)
Dtrend = "正西方向"
Case (gpsangle >= 280) And (gpsangle < 350)
Dtrend = "西北方向"
End Select
Dlong = Format(s(4), "###.###")
Dlat = Format(s(3), "##.####")
Dcareer = CStr(CSng(s(6)) * 1.09) & "公里/小时"
Dguide = Null
If s(1) = "A" Then
Dabnomity = "正常"
Else
Dabnomity = "异常"
End If
Else
'出错处理
End If
End If
If (Infostr = "0") Then
'gps数据错误
End If params("@Infostr") = Infostr
params("@Phone") = Phone
params("@SendInfo") = SendInfo
params("@CarbrandId") = CarbrandId
params("@Dtime") = Dtime
params("@Dlong") = Dlong
params("@Dlat") = Dlat
params("@Dcareer") = Dcareer
params("@Dtrend") = Dtrend
params("@Dguide") = Dguide
params("@Dabnomity") = Dabnomity
With cmd
Set .ActiveConnection = cnn
.CommandText = "Ist_SendInfo"
.CommandType = adCmdStoredProc
.Execute , , adExecuteNoRecords
End With
End Sub
2.在callsql(rnum, rtext)的末端改为
With cmd
Set .ActiveConnection = cnn
set .Parameters=params
.CommandText = "Ist_SendInfo"
.CommandType = adCmdStoredProc
.Execute , , adExecuteNoRecords
End With
cmd并不会直接寻找它的子对象的复制,意味着 Set params = .Parameters
params 并不是Cmd的子对象。但是当你运行的时候,一般的对象的赋值会影响
它的父对象,所以你会发现,params 的赋值也会对.Parameters 赋值,但这没有确定性。所以在提交的时候,尽可能地标准化。
如果是我写,我会先把Set params=new ADODB.Parameter
然后对params赋值,最后set .Parameters=params
我只是凭我写程序的经验来分析的,清晰的程序流程对开发是非常有利的
cmd并不会直接寻找它的子对象的复制,意味着 Set params = .Parameters
params 并不是Cmd的子对象。但是当你运行的时候,一般的对象的赋值会影响
它的父对象,所以你会发现,params 的赋值也会对.Parameters 赋值,但这没有确定性。所以在提交的时候,尽可能地标准化。
如果是我写,我会先把Set params=new ADODB.Parameter
然后对params赋值,最后set .Parameters=params
我只是凭我写程序的经验来分析的,清晰的程序流程对开发是非常有利的
但是如你所说的加上去以后就跳错,且在你加的set .Parameters=params
上面。我现在把完整的调用加上去了。你帮我看看,谢谢!