【发布时间】:2011-04-29 11:03:56
【问题描述】:
我正在将一个 MS Access 前端/后端应用程序移植为 MS Access 前端/sql 服务器后端。
这个应用程序的一部分(原始形式)使用VB将一个CSV文件导入到前端的一个表中,然后运行各种SQL语句将这个表的内容合并到一些后端表中。
我认为在新环境中,因为在存储过程中执行合并过程效率更高,所以我的策略应该是
- 打开到后端的连接
- 在此连接上创建一个临时表
- 在 VB 中创建一个 tabledef 并尝试将其连接到这个临时表
- 使用 DoCmd.TransferText(就像我在原始文件中所做的那样)将 CSV 文件导入到由表 def 链接的表中
- 在打开的连接上执行存储过程,将临时表数据合并到后端的永久表中。
我认为我已成功执行第 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