我是让它循环执行的,在第一遍执行时是正确的,第二遍时出现的中断。
我修改过它的Set  params  =  .Parameters  语句,即直接用
parameters.Append cmd.CreateParameter(,,,)调用,但还是在第二遍时出错。
请高手帮帮忙,在线等候!!
一定给分。

解决方案 »

  1.   

    可以看看你的SP?
    我猜测有可能是ADO的连接缓存没清空。
      

  2.   

    Ado写法没有任何问题
    是不是你的存储过程Ist_SendInfo使用了Begin tran 
    而没有用commit导致事务没有执行完
      

  3.   

    初始化:
    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
      

  4.   

    调用的过程:
    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
      

  5.   

    建议1.把params,cmd声明为公共对象或模块变量对象
    2.在callsql(rnum, rtext)的末端改为
    With cmd
            Set .ActiveConnection = cnn
            set .Parameters=params 
            .CommandText = "Ist_SendInfo"
            .CommandType = adCmdStoredProc
            .Execute , , adExecuteNoRecords
        End With
      

  6.   

    因为.Parameters是cmd 中的一个对象属性,我可以称它为子对象。
    cmd并不会直接寻找它的子对象的复制,意味着 Set params = .Parameters 
    params 并不是Cmd的子对象。但是当你运行的时候,一般的对象的赋值会影响
    它的父对象,所以你会发现,params 的赋值也会对.Parameters 赋值,但这没有确定性。所以在提交的时候,尽可能地标准化。
    如果是我写,我会先把Set params=new ADODB.Parameter
    然后对params赋值,最后set .Parameters=params 
     我只是凭我写程序的经验来分析的,清晰的程序流程对开发是非常有利的
      

  7.   

    因为.Parameters是cmd 中的一个对象属性,我可以称它为子对象。
    cmd并不会直接寻找它的子对象的复制,意味着 Set params = .Parameters 
    params 并不是Cmd的子对象。但是当你运行的时候,一般的对象的赋值会影响
    它的父对象,所以你会发现,params 的赋值也会对.Parameters 赋值,但这没有确定性。所以在提交的时候,尽可能地标准化。
    如果是我写,我会先把Set params=new ADODB.Parameter
    然后对params赋值,最后set .Parameters=params 
     我只是凭我写程序的经验来分析的,清晰的程序流程对开发是非常有利的
      

  8.   

    up:
    但是如你所说的加上去以后就跳错,且在你加的set .Parameters=params
    上面。我现在把完整的调用加上去了。你帮我看看,谢谢!