我想维护一个使用ADO方法将数据通过Excel上传到SQL Server的系统。该过程包括两个步骤:
dbo.TableTemp
dbo.GoodTable
delete from dbo.TableTemp
有什么方法可以确保两个用户的活动不重叠?例如,delete from dbo.TableTemp在user2插入数据之后和处理数据之前,将不会执行user1的?
更新。 不幸的是,我在#temp表格方面还没有成功。它们似乎太临时了,当我尝试将数据插入其中时#temps已经不存在。对于上传数据,我使用Sergey Vaselenko的各种代码,这些代码是从此处下载的:http : //www.excel-sql-server.com/excel-sql-server-import-export-using- vba.htm#Excel数据导出至使用ADO的SQL Server
#temp
在Sergey的解决方案中,可以在步骤1中插入数据之前按存储过程创建表。但是,当我#temp用存储过程创建表时,它在过程末尾消失了,因此无法向其中插入数据。有什么帮助吗?
使用临时表 #TableTemp。这些特定于每个会话,因此不会重叠。
#TableTemp
有两种类型的临时表:本地和全局。它们的名称,可见性和可用性彼此不同。本地临时表的名称的第一个字符带有一个数字符号(#)。它们仅对用户的当前连接可见,并且当用户与SQL Server实例断开连接时,它们将被删除。全局临时表具有两个数字符号(##)作为其名称的首字符;它们在创建后对任何用户都是可见的,并且当所有引用该表的用户与SQL Server实例断开连接时,它们将被删除。
更新。 看起来这个特定的Excel-SQL Server Import-Export使用VBA使用单独的函数来创建表并在每次打开和关闭自己的连接时上载数据。从SQL Server的角度来看,这些功能在不同的会话中运行,因此临时表不会持久存在。我认为该解决方案可以重写为使用单个连接创建临时表,填充,处理数据并将结果输出到永久表中。
您可能还会发现以下问题有用:如何在Excel中的VBA中使ADODB.Connection持久化?特别是 -Kevin Pope 的答案建议使用通过工作簿本身打开和关闭的全局连接变量:
Global dbConnPublic As ADODB.Connection 在“ ThisWorkbook”对象中: Private Sub Workbook_Open() Set dbConnPublic = openDBConn() 'Or whatever your DB connection function is called End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) dbConnPublic.Close End Sub
Global dbConnPublic As ADODB.Connection
在“ ThisWorkbook”对象中:
Private Sub Workbook_Open() Set dbConnPublic = openDBConn() 'Or whatever your DB connection
function is called End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) dbConnPublic.Close End Sub