需要帮助从VBA使用ADO创建临时表

时间:2014-10-03 18:13:07

标签: sql sql-server excel vba

我已经进行了相当广泛的搜索,发现了很多关于此的主题,这些主题帮助我将代码变为现实,但我陷入了僵局,因为我不确定我在这里做错了什么。 我正在尝试创建一个临时表,以便我可以从其他几个表中提取信息,将其放入,然后将其推出为excel。 现在我只是试图从临时表创建一个记录集来检查它是否正在创建,并且我在select * from临时表行中出现错误。
我得到的错误是:错误-2147217865(800040e37)无效的对象名称'#TempGetBOM'

数据库平台是MS SQL Server。

编辑: 我更新了代码,将一些数据插入表中,看看是否会给我对象不存在的错误。它执行时没有错误,因此表明它存在。然后,在逐步执行代码时,我尝试再次执行“create table”语句,并且它确实错误地告诉我该对象已经存在。

我还发现一件事是在我创建表之后,如果我退回代码并运行该行来检查表是否存在并删除它,当我到达create table line之后,它仍然说表退出。很明显,如果存在语句的检查和删除没有按照我的意图工作。

更新的代码:

'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

3 个答案:

答案 0 :(得分:0)

所以,我通过将表名从#TempBom更改为MyTempBom来实现它。 不知道#是什么,我看到它在我试图模仿的一些代码中使用。

显然,我对SQL的经验很少。

答案 1 :(得分:0)

好的,所以经过一些阅读和搜索之后,我决定尝试使用我创建的命令对象设置记录集的不同方法。这很有用。

我想我不太了解MS SQL对象模型,但我认为临时表将绑定到连接对象,所以只要我使用相同的连接就可以访问它。但在我看来,它实际上与命令对象有关。是吗?

无论如何,这里是更新的代码,主要是工作(如果对象非null语句仍然没有做我所期望的删除表)。我确信它可以用更好/更简单/更有效的方式完成,但这是我到目前为止所处的位置。

    '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

答案 2 :(得分:0)

您的问题是在完成过程后,将在其中创建临时表的SQL Server会话终止。