连接无法用于执行此操作。在vb6中出现此上下文错误时,它可能已关闭或无效

连接无法用于执行此操作。在vb6中出现此上下文错误时,它可能已关闭或无效,vb6,adodb,Vb6,Adodb,我正在尝试执行将记录集值存储在sql db中的查询。当我试图执行时,我得到的错误如下 连接无法用于执行此操作。在vb6中出现此上下文错误时,它可能已关闭或无效。请帮我解决这个问题 ' Write records to Database frmDNELoad.lblStatus.Caption = "Loading data into database......" Call FindServerConnection_NoMsg Dim lngRecCount As L

我正在尝试执行将记录集值存储在sql db中的查询。当我试图执行时,我得到的错误如下

连接无法用于执行此操作。在vb6中出现此上下文错误时,它可能已关闭或无效。请帮我解决这个问题

' Write records to Database

    frmDNELoad.lblStatus.Caption = "Loading data into database......"
    Call FindServerConnection_NoMsg

    Dim lngRecCount As Long
    lngRecCount = 0
    rcdDNE.MoveFirst

    Set rcdReclamation = New ADODB.Recordset
    With rcdReclamation
        .ActiveConnection = objConn
        .Source = "insert into t_DATA_DneFrc (RTN, AccountNbr, FirstName, MiddleName, LastName, Amount) values ('" & rcdDNE("RTN") & "', '" & rcdDNE("AccountNbr") & "', '" & rcdDNE("FirstName") & "', '" & rcdDNE("MiddleName") & "', '" & rcdDNE("LastName") & "', '" & rcdDNE("Amount") & "')"
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open cmdCommand
    End With

    Do Until rcdDNE.EOF
        lngRecCount = lngRecCount + 1
        frmDNELoad.lblStatus.Caption = "Adding record " & lngRecCount & " of " & rcdDNE.RecordCount & " to database."
        frmDNELoad.Refresh
        DoEvents
        Call CommitNew
        rcdDNE.MoveNext
    Loop

    frmDNELoad.lblStatus.Caption = "DNE Processing Complete."
    frmDNELoad.Refresh

End Function

Sub CommitNew()
   ' Add records to DneFrc table
    With rcdReclamation
        .Requery
        .AddNew
        .Fields![RTN] = rcdDNE.Fields![RTN]
        .Fields![AccountNbr] = rcdDNE.Fields![AccountNbr]
        .Fields![FirstName] = rcdDNE.Fields![FirstName]
        .Fields![MiddleName] = rcdDNE.Fields![MiddleName]
        .Fields![LastName] = rcdDNE.Fields![LastName]
        .Fields![Amount] = rcdDNE.Fields![Amount]
        .Update

    End With

End Sub
连接码

Sub InstantiateCommand_SQLText() ' Creates a command object to be used when executing SQL statements. Set objCommSQLText = New ADODB.Command objCommSQLText.ActiveConnection = objConn objCommSQLText.CommandType = adCmdText End Sub Function FindServerConnection_NoMsg() As String Dim rcdClientPaths As ADODB.Recordset Dim strDBTemp As String Const CLIENT_UPDATE_DIR = "\\PSGSPHX02\NORS\Rs\ClientUpdate\" On Error Resume Next ' If persisted recordset is not there, try and copy one down from ' CLIENT_UPDATE_DIR. If that can't be found, create a blank one ' and ask the user for the server name. Set rcdClientPaths = New ADODB.Recordset ' Does it already exist locally? If FileExists_FullPath(App.Path & "\" & "t_PCD_ServerConnectionList.xml") = False Then ' Can it be retrieved from CLIENT_UPDATE_DIR If Dir(CLIENT_UPDATE_DIR & "t_PCD_ServerConnectionList.xml") "" Then FileCopy CLIENT_UPDATE_DIR & "t_PCD_ServerConnectionList.xml", App.Path & "\" & "t_PCD_ServerConnectionList.xml" Else ' Creat a blank one. With rcdClientPaths .Fields.Append "ServerConnection", adVarChar, 250 .Fields.Append "Description", adVarChar, 50 .CursorType = adOpenDynamic .LockType = adLockOptimistic .CursorLocation = adUseClient .Open .Save App.Path & "\" & "t_PCD_ServerConnectionList.xml", adPersistXML .Close End With End If End If ' Open the recordset With rcdClientPaths .CursorType = adOpenDynamic .LockType = adLockOptimistic .CursorLocation = adUseClient .Open App.Path & "\" & "t_PCD_ServerConnectionList.xml", , , , adCmdFile End With If rcdClientPaths.RecordCount 0 Then ' try each one listed rcdClientPaths.MoveFirst Do Until rcdClientPaths.EOF strDBTemp = TryConnection_NoMsg(rcdClientPaths.Fields![serverconnection]) If strDBTemp "" Then FindServerConnection_NoMsg = strDBTemp Exit Function End If rcdClientPaths.MoveNext Loop strDBTemp = "" End If Do While strDBTemp = "" If strDBTemp "" Then strDBTemp = TryConnection_NoMsg(strDBTemp) If strDBTemp "" Then With rcdClientPaths .AddNew .Fields![serverconnection] = strDBTemp .Update .Save End With FindServerConnection_NoMsg = strDBTemp Exit Function End If Else Exit Function End If Loop End Function Function TryConnection_NoMsg(ByVal SvName As String) As String On Error GoTo ErrHandle ' If a server was provided, try to open a connection to it. Screen.MousePointer = vbHourglass Set objConn = New ADODB.Connection With objConn .CommandTimeout = 30 .ConnectionTimeout = 30 .ConnectionString = "Provider=SQLOLEDB.1; Server=" & SvName & "; User ID=RS_Auth; Password=weLcomers_auth; Initial Catalog=NORS" ' Test .Open .Close End With Set objConn = Nothing TryConnection_NoMsg = SvName Screen.MousePointer = vbNormal Exit Function ErrHandle: TryConnection_NoMsg = "" Set objConn = Nothing Screen.MousePointer = vbNormal Exit Function End Function 子实例化命令_SQLText() '创建要在执行SQL语句时使用的命令对象。 Set objCommSQLText=New ADODB.Command objCommSQLText.ActiveConnection=objConn objCommSQLText.CommandType=adCmdText 端接头 函数FindServerConnection_NoMsg()作为字符串 将RCDClientPath设置为ADODB.Recordset 作为字符串的Dim strDBTemp Const CLIENT_UPDATE_DIR=“\\PSGSPHX02\NORS\Rs\ClientUpdate” 出错时继续下一步 '如果持久化记录集不存在,请尝试从中复制一个 '客户端\更新\目录。如果找不到,请创建一个空白 '并询问用户服务器名称。 Set rcdclientpath=New ADODB.Recordset “它在本地已经存在吗? 如果FileExists\u FullPath(App.Path&“\”&“t\u PCD\u ServerConnectionList.xml”)=False,则 '是否可以从客户端\u更新\u目录中检索 如果Dir(CLIENT\u UPDATE\u Dir&“t\u PCD\u ServerConnectionList.xml”)“”那么 FileCopy客户端\u更新\u目录和“t\u PCD\u ServerConnectionList.xml”,App.Path和“t\u PCD\u ServerConnectionList.xml” 其他的 “创建一个空白的。 使用rcdclientpath .Fields.Append“服务器连接”,adVarChar,250 .Fields.Append“Description”,adVarChar,50 .CursorType=adOpenDynamic .LockType=adlockType .CursorLocation=adUseClient 打开 .Save App.Path&“\”和“t\u PCD\u ServerConnectionList.xml”,adPersistXML .结束 以 如果结束 如果结束 '打开记录集 使用rcdclientpath .CursorType=adOpenDynamic .LockType=adlockType .CursorLocation=adUseClient .Open App.Path&“\”和“t\u PCD\u ServerConnectionList.xml” 以 如果rcdclientPath.RecordCount为0,则 '请尝试列出的每一个 rcdclientpath.MoveFirst 直到rcdclientpath.EOF strDBTemp=TryConnection_NoMsg(rcdclientpath.Fields![serverconnection]) 如果strDBTemp“”则 FindServerConnection_NoMsg=strDBTemp 退出功能 如果结束 rcdclientPath.MoveNext 环 strDBTemp=“” 如果结束 当strDBTemp=“”时执行 如果strDBTemp“”则 strDBTemp=TryConnection_NoMsg(strDBTemp) 如果strDBTemp“”则 使用rcdclientpath .AddNew .菲尔兹![serverconnection]=strDBTemp .更新 拯救 以 FindServerConnection_NoMsg=strDBTemp 退出功能 如果结束 其他的 退出功能 如果结束 环 端函数 函数TryConnection_NoMsg(ByVal SvName作为字符串)作为字符串 关于错误转到错误句柄 '如果提供了服务器,请尝试打开与该服务器的连接。 Screen.MousePointer=vbHourglass Set objConn=New ADODB.Connection 用objConn .CommandTimeout=30 .ConnectionTimeout=30 .ConnectionString=“Provider=SQLOLEDB.1;Server=“&SvName&”用户ID=RS\u Auth;密码=weLcomers\u Auth;初始目录=NORS”测试 打开 .结束 以 Set objConn=Nothing TryConnection_NoMsg=SvName Screen.MousePointer=vbNormal 退出功能 错误句柄: TryConnection_NoMsg=“” Set objConn=Nothing Screen.MousePointer=vbNormal 退出功能 端函数
我怀疑
FindServerConnection\u NoMsg
没有打开连接,因为它以
NoMsg
结尾,所以您没有看到连接未打开的错误。然后,在不知道打开失败的情况下继续使用连接

发布
FindServerConnection\u NoMsg
的代码


顺便说一句,你的问题本身应该给你一个线索。它特别指出连接无法使用,并且可能未打开。这应该告诉你从哪里开始查找,至少告诉你应该在你的问题中发布打开连接的代码。

你已经在
TryConnection\u NoMsg
函数(?)中关闭了连接


谢谢大家。我解决了我的问题。这就是我在代码中看到的

暗淡的长帐 lngRecCount=0 rcdDNE.MoveFirst

 With cmdCommand
    .ActiveConnection = objConn
    .CommandText = "insert into t_DATA_DneFrc (RTN, AccountNbr, FirstName, MiddleName, LastName, Amount) values ('" & rcdDNE("RTN") & "', '" & rcdDNE("AccountNbr") & "', '" & rcdDNE("FirstName") & "', '" & rcdDNE("MiddleName") & "', '" & rcdDNE("LastName") & "', '" & rcdDNE("Amount") & "')"
    .CommandType = adCmdText

End With

Set rcddnefrc = New ADODB.Recordset
With rcddnefrc
    .ActiveConnection = objConn
    .Source = "SELECT * FROM T_DATA_DNEFRC"
    .CursorType = adOpenDynamic
    .CursorLocation = adUseClient
    .LockType = adLockOptimistic
    .Open
End With

Do Until rcdDNE.EOF
    lngRecCount = lngRecCount + 1
    frmDNELoad.lblStatus.Caption = "Adding record " & lngRecCount & " of " & rcdDNE.RecordCount & " to database."
    frmDNELoad.Refresh
    DoEvents
    Call CommitNew
    rcdDNE.MoveNext
Loop

frmDNELoad.lblStatus.Caption = "DNE Processing Complete."
frmDNELoad.Refresh

两件事:你能把剩下的代码格式化,让它看起来和第一部分一样好吗?另外,代码中的错误发生在哪里?@pbrp:我回滚了您上次的编辑,因为您删除了一些相关的代码(并且完全弄乱了所有代码的格式)。如果你要编辑文章,请学会设置代码格式;“编辑”页面上有可用的帮助。您何时收到此错误?在哪一个动作上?faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。将这一点减少到再现错误所需的最小代码量。我相信我在这里遇到了问题。命令未打开。这是我的错误。我认为.commandType=adCmdtext与cmdCommand.ActiveConnection=objConn.CommandText=“query here”之间存在问题.CommandType=adCmdText End With Set rcdReclamation=New ADODB.Recordset With rcdReclamation.ActiveConnection=objConn.CursorType=adOpenDynamic.CursorLocation=adUseClient.LockType=adLockOptimious.Open cmdCommand End With Remove
 With cmdCommand
    .ActiveConnection = objConn
    .CommandText = "insert into t_DATA_DneFrc (RTN, AccountNbr, FirstName, MiddleName, LastName, Amount) values ('" & rcdDNE("RTN") & "', '" & rcdDNE("AccountNbr") & "', '" & rcdDNE("FirstName") & "', '" & rcdDNE("MiddleName") & "', '" & rcdDNE("LastName") & "', '" & rcdDNE("Amount") & "')"
    .CommandType = adCmdText

End With

Set rcddnefrc = New ADODB.Recordset
With rcddnefrc
    .ActiveConnection = objConn
    .Source = "SELECT * FROM T_DATA_DNEFRC"
    .CursorType = adOpenDynamic
    .CursorLocation = adUseClient
    .LockType = adLockOptimistic
    .Open
End With

Do Until rcdDNE.EOF
    lngRecCount = lngRecCount + 1
    frmDNELoad.lblStatus.Caption = "Adding record " & lngRecCount & " of " & rcdDNE.RecordCount & " to database."
    frmDNELoad.Refresh
    DoEvents
    Call CommitNew
    rcdDNE.MoveNext
Loop

frmDNELoad.lblStatus.Caption = "DNE Processing Complete."
frmDNELoad.Refresh