2014-10-03 60 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