如何将Access tabledef链接到SQLServer中的临时表

时间:2011-04-27 22:02:38

标签: sql-server ms-access

我正在将MS Access前端/后端应用程序移植到MS Access前端/ sql server后端。

此应用程序的一部分(以原始格式)使用VB将CSV文件导入前端的表中,然后运行各种SQL语句以将此表的内容合并到一些后端表中。

我认为在新环境中,因为在存储过程中执行合并过程效率更高,我的策略应该是

  1. 打开与后端的连接
  2. 在此连接上创建临时表
  3. 在VB中创建一个tabledef并尝试将其连接到此临时表
  4. 使用DoCmd.TransferText(就像我在原文中一样)将CSV文件导入到表def
  5. 链接的表中
  6. 在打开的连接上执行存储过程,该存储过程将临时表数据合并到后端的永久表中。
  7. 我认为我成功地执行了第1步和第2步,但我不确定。我可以在SQL Server Management Studio中看到临时表,但是尝试打开列失败并显示错误(当我使用Management Studio创建临时表时,它也会失败并出现相同的错误,所以我认为这是一个Management Studio问题)

    我正在使用相同的代码执行第3步,因为我在启动应用程序时用于链接所有永久表,但它的这一点不起作用。最后,我已经通过对非临时表运行它来证明第5步有效。

    我用于此的代码如下

        Set conn = New ADODB.Connection
        conn.Open getStrConn
    
        'First create a temporary table on the server for the web site leads
        SQL = "CREATE TABLE [dbo].[#WebSiteLeads]("
        SQL = SQL & "[leadID] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED,[Title] [nvarchar](255) NULL,[Firstname] [nvarchar](50) NULL,"
        SQL = SQL & "[Lastname] [nvarchar](50) NULL,[Sex] [nvarchar](10) NULL,[House] [nvarchar](50) NULL,"
        SQL = SQL & "[Address1] [nvarchar](50) NULL,[Address2] [nvarchar](50) NULL,[Street] [nvarchar](50) NULL,"
        SQL = SQL & "[Town_City] [nvarchar](50) NULL,[County] [nvarchar](50) NULL,[Postcode] [nvarchar](10) NULL,"
        SQL = SQL & "[Email] [nvarchar](50) NULL,[Allow_email] [nvarchar](5) NULL,[Telephone] [nvarchar](20) NULL,"
        SQL = SQL & "[Allow_tel] [nvarchar](5) NULL,[Cons_period] [nvarchar](20) NULL,[When] [nvarchar](20) NULL,"
        SQL = SQL & "[Procedure] [nvarchar](20) NULL,[Consultation] [nvarchar](10) NULL,[Info_pack] [nvarchar](10) NULL,"
        SQL = SQL & "[Source] [nvarchar](20) NULL,[Further_info] [nvarchar](255) NULL,[Callback] [nvarchar](50) NULL,"
        SQL = SQL & "[Date_added] [nvarchar](30) NULL,[Date_added_dt] [datetime] NULL,[Callback_range] [tinyint] NULL,"
        SQL = SQL & "[UcFname] [nvarchar](1) NULL,[UcLname] [nvarchar](50) NULL,[UcPcode] [nvarchar](10) NULL);"
    
        conn.Execute SQL
    
        For Each td In CurrentDb.TableDefs
            If td.name = "WebsiteLeads" Then
                CurrentDb.TableDefs.Delete "WebsiteLeads"
            End If
        Next
        'link to the table just created
        Set td = CurrentDb.CreateTableDef("WebsiteLeads",dbAttachSavePWD , "[dbo].[#WebSiteLeads]", getStrConn)
    
        CurrentDb.TableDefs.Append td
        importProgress = 0.1    'Update Progress bar
        DoEvents
    
        'Import our text file
        DoCmd.TransferText acImportDelim, "Leads Import v2", "WebsiteLeads", txtFileName
        importProgress = 0.3    'Update Progress bar
        DoEvents
    
        'We are going to do the rest as Access stored procedure
    
        Set leadsRS = conn.Execute("EXEC dbo.LeadsImport;")
        importProgress = 0.9    'Update Progress bar
        DoEvents
    

    但它在

    失败了
            CurrentDb.TableDefs.Append td
    

    错误消息“无法找到可安装的ISAM”。

    这是什么错误消息,为什么我得到它

1 个答案:

答案 0 :(得分:1)

另一种选择是根本不使用链接表,而是使用返回临时表的直通查询。您可能需要动态编写它,但一旦它返回正确的临时表,它就可以用作表单或报告的记录源。

我不经常创建替换链接表的已保存查询,但我从未使用连接到临时表的直通来完成它。