Excel VBA: la query SQL gestisce l'errore


4

Ho SQL che posso usare in Excel 2013 per ottenere le informazioni dal database di Access e funziona usando l'SQL direttamente in una connessione, ma ora voglio eseguirlo da VBA invece di poter usare alcune variabili nell'SQL.

Ho trovato questo link, l'ho modificato e funziona su alcune semplici istruzioni SQL, ma non su altre.

Esegui query SQL con VBA e compila il foglio con i dati

Ottengo un errore:

Errore Run Time -2147217883 (80040e25) Le maniglie delle righe devono essere tutte rilasciate prima di poterne ottenere di nuove.

Ho cercato molto su questo errore e provato diverse cose, ma ovviamente non capisco. So che l'SQL è lungo / complesso, ma funziona direttamente in Access ed Excel.

Ecco il codice attuale:

Sub Get_SQLData()
'modified from from https://superuser.com/questions/813077/execute-sql-query-with-vba-and-fill-sheet-with-data
Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String

strFile = "C:\mydb.accdb"

strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon

'JAJ set my SQL RAW first
strSQL = "SELECT RAWDATA_Incidents.ID, RAWDATA_Incidents.[Incident Number], RAWDATA_Incidents.[Categorization Tier 1], RAWDATA_Incidents.[Categorization Tier 2], RAWDATA_Incidents.[Categorization Tier 3], RAWDATA_Incidents.Priority, RAWDATA_Incidents.Urgency, RAWDATA_Incidents.Impact, RAWDATA_Incidents.[Reported Date], RAWDATA_Incidents.[Service Type], RAWDATA_Incidents.[Closure Product Category Tier1], RAWDATA_Incidents.[Closure Product Category Tier2], RAWDATA_Incidents.[Closure Product Category Tier3], ClosureProductName.ClosureProductName, RAWDATA_Incidents.Status, RAWDATA_Incidents.[Closed Date], RAWDATA_Incidents.[Product Name], OpsCatTreeFaultMode.FaultMode, BusinessService.MMServiceID, ([RAWDATA_Incidents]![Closed Date]-[RAWDATA_Incidents]![Reported Date])*1440 AS Expr2, IIf([RAWDATA_Incidents]![Priority]='Critical' Or [RAWDATA_Incidents]![Priority]='High',788,394) AS Expr3, BusinessService.Name, BSDependsOnAC.MMServiceID, CI.CIName, AccessChannel.Name, BusinessService.ID " _
    & "FROM OpsCatTreeFaultMode INNER JOIN (RAWDATA_Incidents INNER JOIN (CI INNER JOIN ((ITSystemService INNER JOIN (BusinessService INNER JOIN ((AccessChannel INNER JOIN ACDependsOnITSS ON AccessChannel.ACID = ACDependsOnITSS.ACID.Value) INNER JOIN BSDependsOnAC ON AccessChannel.ACID = BSDependsOnAC.ACID.Value) ON BusinessService.ID = BSDependsOnAC.MMServiceID.Value) ON (ITSystemService.ITSSID = ACDependsOnITSS.ITSSID.Value) AND (ITSystemService.ITSSID = ACDependsOnITSS.ITSSID.Value)) INNER JOIN ClosureProductName ON ITSystemService.ITSSID = ClosureProductName.ITSS.Value) ON CI.CIID = ITSystemService.CIID) ON RAWDATA_Incidents.[Closure Product Name] = ClosureProductName.ClosureProductName) ON OpsCatTreeFaultMode.OpsCatTreeName = RAWDATA_Incidents.[Categorization Tier 3]"

Set rs = CreateObject("ADODB.RECORDSET")
rs.activeconnection = cn

rs.Open strSQL

Sheet1.Range("A1").CopyFromRecordset rs     ' fails here  - gives handles error.

rs.Close
cn.Close
Set cn = Nothing

End Sub

Qualsiasi aiuto sarebbe apprezzato.


1
Quanto tempo prima che il messaggio di errore venga generato? Potrebbe essere il timeout della query?
Dave,

1
Se si inserisce un punto di interruzione sulla linea in cui si guasta e si aggiunge un orologio a RS, RS è effettivamente popolato con i dati previsti in quel momento?
Ƭᴇcʜιᴇ007,

1
potresti rs.requerydopo rs.Open strSQLanche se non sono sicuro che aiuterà
Dave,

Quale versione di Excel e quanti dati potrebbero tornare indietro
datatoo

Per rispondere a tutti i punti finora. Utilizzo di Access ed Excel 2013. L'errore viene generato in 10 secondi (la stessa query richiede normalmente l'esecuzione durante un aggiornamento in Excel). La query in realtà richiede più tempo per essere eseguita in accesso (15 sec). Ho provato la richiesta - nessun cambiamento. La query come indicato restituisce 66040 righe, 26 colonne. Ho provato a ridurre con una clausola where in cui restituisce solo 93 righe, ma fallisce ancora. Ho aggiunto breakpont - vedo che sta restituendo i nomi dei campi, non so come vedere se sta restituendo valori. Grazie a tutti finora, altri pensieri o idee?
Jim J,

Risposte:


0

Penso che potresti avere dei licenziamenti:

Sub Get_SQLData()

Dim cn As Object
Dim rs As Object
Dim strFile As String
Dim strCon As String
Dim strSQL As String

strFile = "C:\mydb.accdb"
strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile
Set cn = CreateObject("ADODB.Connection")
cn.Open strCon  

'JAJ set my SQL RAW first 
strSQL = "..."

Set rs = CreateObject("ADODB.RECORDSET")
rs.activeconnection = cn
rs.Open strSQL

Sheet1.Range("A1").CopyFromRecordset rs     ' fails here  - gives handles error.
rs.Close
cn.Close

Set cn = Nothing
End Sub

Il tuo problema inizia qui:

rs.activeconnection = cn

Hai dichiarato

Set cn = CreateObject("ADODB.Connection")
cn.Open strCon 

Stai indicando con rs un oggetto già creato e aperto. Istituire invece una nuova connessione anziché tentare di clonarla. Stai indicando un oggetto qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.