2014-10-03 283 views
0

我已經非常廣泛地搜索,發現了很多關於此的主題,這幫助我獲得了我的代碼,但是我處於僵局,因爲我不是確定我在這裏做錯了什麼。 我正在嘗試創建一個臨時表,以便我可以從其他幾個表中提取信息,放入其中,然後將其推送至Excel。 現在我只是試圖從臨時表創建一個記錄集來檢查它是否正在創建,並且我在臨時錶行中發現了select *錯誤。
我得到的錯誤是:錯誤-2147217865(800040e37)無效的對象名'#TempGetBOM'需要幫助使用VBA創建臨時表使用ADO

數據庫平臺是MS SQL Server。

編輯: 我更新了代碼插入一些數據到表中,看看是否會給我的對象不存在的錯誤。它執行沒有錯誤,所以這將表明它存在。然後,在遍歷代碼的同時,我嘗試再次執行「create table」語句,並且它錯誤地告訴我該對象已經存在。

我還發現的一件事是我創建表後,如果我退回到代碼中並運行該行來檢查表是否存在並將其刪除,那麼當我到達create table行後,它仍然說表退出。很顯然,如果存在語句沒有按照我的意圖工作,則檢查並放棄。

更新代碼:

'Declare variables 
    Dim strSQL      As String 
    Dim strConBase     As String 
    Dim ADOcon      As ADODB.Connection 
    Dim ADOrsetA     As ADODB.Recordset 
    Dim ADOcmA      As ADODB.Command 
'Initialize objects 
    Set ADOcon = New ADODB.Connection 
    Set ADOrsetA = New ADODB.Recordset 
    Set ADOcmA = New ADODB.Command 
'Ensure clean exit if there is an error 
    'On Error GoTo CleanExit 

'Open Connections 
    strConBase = strConDriver & strConServer & strConApp & "WSID=" & Environ$("COMPUTERNAME") & ";" & strConDbTest & strConNetwork & strConTConn 
    ADOcon.ConnectionString = strConBase 
    ADOcon.Open 
'Open Recordsets for item 
    strSQL = "SELECT '" & strItem & "'," & strTblItem & ".Item_desc_1," & strTblItem & ".Item_desc_2 FROM " & strTblItem & " WHERE Item_no ='" & strItem & "'" 
    Set ADOrsetA.ActiveConnection = ADOcon 
    ADOrsetA.Open strSQL 

'Create a temporary table to handle the intermediary work between item and BOM recordsets 
    With ADOcmA 
     Set .ActiveConnection = ADOcon 
     .CommandType = adCmdText 
     .CommandText = "IF OBJECT_ID('#MyTempGetBOM') IS NOT NULL DROP TABLE #MyTempGetBOM" 
     .Execute 
     .CommandText = "CREATE TABLE #MyTempGetBOM (ITEM VARCHAR(255),DESCRIP1 CHAR(255),DESCRIP2 CHAR(255), LEV INT, SEQ INT, FLAG1 CHAR(255), PRIMARYKEY INT IDENTITY(1,1) PRIMARY KEY,QTY_PER NUMERIC)" 
     .Execute 
     .CommandText = "Insert Into #MyTempGetBOM (ITEM,DESCRIP1,DESCRIP2,LEV,SEQ,FLAG1,QTY_PER) select '" & strItem & "',Item_desc_1,Item_desc_2,1,'1','o',1 FROM " & strTblItem 
     .Execute 
    End With 

    Dim ADOrsetB As ADODB.Recordset 
    Set ADOrsetB = New ADODB.Recordset 
    strSQL = "SELECT * FROM #MyTempGetBOM" 
    Set ADOrsetB.ActiveConnection = ADOcon 
    ADOrsetB.Open strSQL 
+0

「SQL」不是數據庫平臺,因此指定您希望使用哪種實際平臺來執行此操作將很有用。 – 2014-10-03 18:16:48

+0

數據庫平臺是MS SQL Server。 – CBRF23 2014-10-06 12:10:20

回答

0

所以,我把它通過改變表名從#TempBom到MyTempBom工作。 不知道#是什麼,我看到它在我試圖效仿的一些代碼中使用。

顯然,我在SQL方面的經驗很少。

+0

這可能會導致您的問題。 「#」表示臨時表,如果沒有它,則不是臨時表。臨時表在執行後自動清理。真正的表不是。如果您有多個用戶同時創建此非臨時表的功能,則會發生意外的行爲。 – Kritner 2014-10-03 18:20:15

+0

這很有道理。現在我只是運行一些測試來試圖弄清楚這一點。我不明白爲什麼臨時表不起作用,但它與常規表格有關。我創建臨時表,我甚至可以從另一個表插入它(這意味着它應該存在,否則會出錯),但是當我嘗試從臨時表創建一個recrodset時,它告訴我它不會'不存在。 – CBRF23 2014-10-06 12:29:30

0

好的,所以經過一些更多的閱讀和搜索之後,我決定嘗試使用我創建的命令對象來設置記錄集的另一種方法。這工作。

我想我不太瞭解MS SQL對象模型,但我認爲臨時表將綁定到連接對象,所以只要我使用相同的連接,我就可以訪問它。但在我看來,它實際上與命令對象有關。是對的嗎?

無論如何,這裏是更新的代碼,主要是工作(丟棄表,如果對象不爲空聲明仍然沒有做我所期望的)。我相信它可以以更好/更簡單/更有效的方式完成,但這是迄今爲止我所得到的。

'Declare variables 
    Dim strSQL      As String 
    Dim strConBase     As String 
    Dim ADOcon      As ADODB.Connection 
    Dim ADOrsetA     As ADODB.Recordset 
    Dim ADOcmA      As ADODB.Command 
    Dim ADOrsetB     As ADODB.Recordset 
'Initialize objects 
    Set ADOcon = New ADODB.Connection 
    Set ADOrsetA = New ADODB.Recordset 
    Set ADOcmA = New ADODB.Command 
    Set ADOrsetB = New ADODB.Recordset 
'Ensure clean exit if there is an error 
    'On Error GoTo CleanExit 

'Open Connections 
    strConBase = strConDriver & strConServer & strConApp & "WSID=" & Environ$("COMPUTERNAME") & ";" & strConDbTest & strConNetwork & strConTConn 
    ADOcon.ConnectionString = strConBase 
    ADOcon.Open 
'Open Recordsets for item 
    strSQL = "SELECT '" & strItem & "'," & strTblItem & ".Item_desc_1," & strTblItem & ".Item_desc_2 FROM " & strTblItem & " WHERE Item_no ='" & strItem & "'" 
    Set ADOrsetA.ActiveConnection = ADOcon 
    ADOrsetA.Open strSQL 

'Create a temporary table to handle the intermediary work between item and BOM recordsets 
    Set ADOrsetB.ActiveConnection = ADOcon 
    With ADOcmA 
     Set .ActiveConnection = ADOcon 
     .CommandType = adCmdText 
     .CommandText = "IF OBJECT_ID('#MyTempGetBOM') IS NOT NULL DROP TABLE #MyTempGetBOM" 
     .Execute 
     .CommandText = "CREATE TABLE #MyTempGetBOM (ITEM VARCHAR(255),DESCRIP1 CHAR(255),DESCRIP2 CHAR(255), LEV INT, SEQ INT, FLAG1 CHAR(255), PRIMARYKEY INT IDENTITY(1,1) PRIMARY KEY,QTY_PER NUMERIC)" 
     .Execute 
     .CommandText = "Insert Into #MyTempGetBOM (ITEM,DESCRIP1,DESCRIP2,LEV,SEQ,FLAG1,QTY_PER) select '" & strItem & "',Item_desc_1,Item_desc_2,1,'1','o',1 FROM " & strTblItem 
     .Execute 
     .CommandText = "SELECT * FROM #MyTempGetBOM" 
     Set ADOrsetB = .Execute 
    End With 
+0

我不知道這裏有什麼問題,但我只能訪問臨時表一次,然後它似乎消失。 I.E.在下面的代碼中,設置第一個記錄集合,但第二個引發#MyTempGetBOM的「無效對象名稱」錯誤。但是,如果我跳過設置第一個記錄集的行,那麼第二個記錄集起作用。看起來臨時表在第一次調用之後就消失了。 '.CommandText =「SELECT * FROM #MyTempGetBOM」 Set ADOrsetA = .Execute .CommandText =「SELECT * FROM #MyTempGetBOM」 Set ADOrsetB = .Execute' – CBRF23 2014-10-06 14:28:47