2013-02-18 11 views
5

Po zakończeniu wielu czynności Google zakończono następujące makro, które, jak miałem nadzieję, połączyłoby się z bazą danych, upuszczenie istniejącej tabeli tymczasowej, a następnie utworzenie nowy (wypełnić go i wyświetlić wyniki).Tworzenie tabeli tymczasowej w programie SQL Server 2008 przy użyciu makra programu Excel (ADODB)

Dim adoCn As ADODB.Connection 
Dim adoRs As ADODB.Recordset 
Dim adoCm As ADODB.Command 
Dim strSQL As String 

Set adoCn = New ADODB.Connection 
With adoCn 
    .ConnectionString = "Provider=SQLOLEDB;" & _ 
         "Initial_Catalog=XXX;" & _ 
         "Integrated Security=SSPI;" & _ 
         "Persist Security Info=True;" & _ 
         "Data Source=XXX;" & _ 
         "Extended Properties='IMEX=1'" 
    .CursorLocation = adUseServer 
    .Open 
End With 

Set adoCm = New ADODB.Command 

With adoCm 
    Set .ActiveConnection = adoCn 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('tempdb..#AgedProducts') IS NOT NULL DROP TABLE #AgedProducts" 
    .Execute 
    .CommandText = "CREATE TABLE #AgedProducts " & _ 
        "(Source_Order_Number VARCHAR(255)) " & _ 
        "INSERT INTO #AgedProducts VALUES ('AB-123-456') " & _ 
        "SELECT * FROM #AgedProducts (NOLOCK) " 
    .Execute 
End With 

Set adoRs = New ADODB.Recordset 
With adoRs 
    Set .ActiveConnection = adoCn 
    .LockType = adLockBatchOptimistic 
    .CursorLocation = adUseServer 
    .CursorType = adOpenForwardOnly 
    .Open "SET NOCOUNT ON" 
End With 
adoRs.Open adoCm 

MsgBox "Recordset returned...", vbOKOnly 

While Not adoRs.EOF 
    Debug.Print adoRs.Fields(0).Value 
    adoRs.MoveNext 
Wend 

adoCn.Close 

Set adoCn = Nothing 
Set adoRs = Nothing 

Kiedy uruchomić kwerendę pojawia się następujący komunikat o błędzie:

Run-time error '-2147217887 (80040e21)':

The requested properties cannot be supported

Linia NOCOUNT pochodzi z http://support.microsoft.com/kb/235340 (podobnie jak wiele z powyższym kodzie). Dodałem IMEX=1, aby wziąć pod uwagę, że numer zamówienia może mieć wiele typów, ale wątpię, że tam właśnie pojawia się problem.

Każda pomoc jest bardzo doceniana!

Odpowiedz

5

Zmodyfikuj sposób otwierania rekwizytu, przenieś zaznaczenie z polecenia do wywołania metody recodset open.

With adoCm 
    Set .ActiveConnection = adoCn 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('tempdb..#AgedProducts') IS NOT NULL DROP TABLE #AgedProducts" 
    .Execute 
    .CommandText = "CREATE TABLE #AgedProducts " & _ 
        "(Source_Order_Number VARCHAR(255)) " & _ 
        "INSERT INTO #AgedProducts VALUES ('AB-123-456') " 
    .Execute 
End With 

Set adoRs = New ADODB.Recordset 
With adoRs 
    Set .ActiveConnection = adoCn 
    .LockType = adLockBatchOptimistic 
    .CursorLocation = adUseServer 
    .CursorType = adOpenForwardOnly 

End With 
adoRs.Open "SELECT * FROM #AgedProducts (NOLOCK)" 
+0

Dzięki za to - działa uczta. Czy wiesz, dlaczego to działa zamiast mojej pierwszej próby? –

+1

Recodset musi wiedzieć, co powinno w nim być, więc musisz podać kod SQL. Zobacz np. tutaj http://support.microsoft.com/kb/168336. Istnieją różne metody otwierania rekodsetu. Miłego dnia. – dee

0

Moje zrozumienie tabel tymczasowych jest takie, że są one dostępne tylko dla połączenia, które je utworzyło. W tym przypadku próba upuszczenia jednego z drugiego połączenia jest niemądra.

Komunikat o błędzie nie określa, który wiersz kodu spowodował. W tym przypadku sugeruję, abyś przetestował swój fragment fragmentarycznie. Zacznij od utworzenia połączenia. Następnie otwórz i zamknij. Następnie zacznij robić rzeczy, gdy połączenie jest otwarte, ale jedna rzecz na raz.

+0

Na serwerze SQL ## temp_table jest globalną tabelą tymczasową. Próba upuszczenia tabeli na początku wykonywania kodu zapewnia (poza warunkami wyścigu), że kod nie zniekształca się podczas próby utworzenia tabeli, która już istnieje. Najlepiej jest usunąć tabelę (prawdopodobnie nieistniejącą) przed jej utworzeniem. – Robino

Powiązane problemy