【问题标题】:How can I link an Access tabledef to temporary table in SQLServer如何将 Access tabledef 链接到 SQL Server 中的临时表
【发布时间】:2011-04-29 11:03:56
【问题描述】:

我正在将一个 MS Access 前端/后端应用程序移植为 MS Access 前端/sql 服务器后端。

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

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

  1. 打开到后端的连接
  2. 在此连接上创建一个临时表
  3. 在 VB 中创建一个 tabledef 并尝试将其连接到这个临时表
  4. 使用 DoCmd.TransferText(就像我在原始文件中所做的那样)将 CSV 文件导入到由表 def 链接的表中
  5. 在打开的连接上执行存储过程,将临时表数据合并到后端的永久表中。

我认为我已成功执行第 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”。

此错误消息是什么,为什么会收到此消息

【问题讨论】:

  • 它必须是 SQL Server 上的临时表吗?在我看来,您每次都在创建一个具有相同结构的临时文件。每次 sp 运行时,您都可以将其清空。你可以链接到一个普通的 SQL Server 表就好了,对吧?
  • 我认为你被卡住了。我不知道有什么方法可以链接到临时表。但是,HansUp 在前面的评论中有一个很好的解决方法——在 SQL Server 中创建一个永久表(结构),并通过在导入之前让 SP 截断它来将其内容视为临时的(如果您的 DBA 不会给您权限需要截断,你必须满足于删除)。
  • 我已经找到了解决这个问题的方法——我想。我使用临时表的主要原因是,如果两个人同时导入,他们可能会互相绊倒。临时表有效地为每个用户提供了单独的命名空间。但是,如果我将全部内容包装在开始事务中 .. 提交事务,我可以通过事务进程实现这种分离
  • 我忘了在上面说我正在使用的表格可以像 HansUp 建议的那样是永久性的。
  • 您是否考虑过在本地、在工作站上创建临时表,并为临时表使用存储在工作站上的 Jet/ACE MDB/ACCDB?在这种情况下,表的名称将始终相同,但始终特定于每个用户。

标签: sql-server ms-access


【解决方案1】:

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

我并不经常创建替换链接表的已保存查询,尽管我从未通过连接到临时表的直通来完成此操作。

【讨论】:

  • 有趣 - 虽然我不确定它是否会起作用 - 绊脚石是 DoCmd.TransferText,它需要表的名称。来自参考“一个字符串表达式,它是您要将文本数据导入到、从中导出文本数据或将文本数据链接到的 Microsoft Access 表的名称,或者是您要将其结果导出到文本文件的 Microsoft Access 查询。 "仅允许在导出时进行查询。我找到了一种解决方法(见上面的评论),所以我正在使用它。我将在今天晚些时候通过动态创建一个调用存储过程的 querydef 来探索通过查询
  • 如果您正在编写保存的查询,则根本不使用 DoCmd.TransferText。这就是我的全部观点——你完全避免了这个问题。简而言之,您似乎错过了我回答的全部要点。
  • 我要么遗漏了一些东西,要么你可能不太欣赏我在做什么。 DoCmd.TransferText 使用前端中的规范将运行前端的机器上本地加载的 CSV 文件传输到我们正在讨论的表中。除非我尝试以编程方式解析此文件,否则 TransferText 似乎是将其加载到表中的唯一方法。
  • 我的意思是你不需要一个表——一个查询可以完成这项工作(一个视图)。您可以根据需要即时编写 QueryDef,而无需担心拥有持久链接表。您需要保存 QueryDef(而不是将 SQL SELECT 作为 Recordsource/Rowsource 分配给 Access 对象)的唯一原因是您需要使用 passthrough 才能完全访问临时表。跨度>
  • !灯亮了——我明白你现在在说什么了!对不起,我太厚了。我刚刚为应用程序的另一部分创建了一个传递查询,该部分调用存储过程以用作报表的数据源。不得不做一些关于从 ADO 连接到 DAO.queryDef 的操作(请参阅chandlerfamily.org.uk/2011/05/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多