问题:
在存储过程中,首先打开ACCESS数据库,将其中的数据导入到SQL SERVER数据库对应的表中(我已经实现),导入完数据后紧接着我要删除ACCESS数据库文件(在系统对应的文件夹目录中(我也实现,是单独测试的,可以实现)),但是问题是当在一起执行,也就是导人存储过程执行完,紧接着执行删除ACCESS文件时,系统提示另一个进程正在使用中,不能删除.我想是不是要用到异步事务处理(小弟我不会),但是我想要是导入过程执行完,我写个杀当前进程(ACCESS),然后再执行删除ACCESS数据库文件.
存储过程是触发器触发的
代码如下:
CREATE trigger data_insert
on dbo.AccToSql_data
for insert
as
declare @ghid varchar(50)
declare @dbpath varchar(200)
declare @dbname varchar(200)
declare @nowyear varchar (10)
set @nowyear=year(getdate())
select @ghid=CorNum,@dbpath=dbasepath,@dbname=dbasename from
inserted WHERE ID=(SELECT TOP 1 ID FROM AccToSql_data order by ID DESC) AND [email protected]
EXECUTE master..XP_cmdshell 'net start msdtc '
EXECUTE xlghdata..AccToSql_Memorabilia @dbname,@ghid,@dbpath
EXECUTE xlghdata..DelAccess_Pro @dbname,@dbpath
导入数据存储过程:
declare @mess varchar(2000)
if @@error <> 0 or @@rowcount=0
begin
select @mess=@@error
end
end
if @returnflag=0
begin
EXECUTE @returnflag=AccToSql_Photo @databasename,@danweibh,@dbasepath,@success output
if @@error <> 0 or @@rowcount =0
begin
select @mess=@@error
end
end
if @returnflag=0
begin
EXECUTE @returnflag=AccToSql_Video @databasename,@danweibh,@dbasepath,@success output
if @@error <> 0 or @@rowcount =0
begin
select @mess=@@error
end
end
if @@error=0
begin
commit tran
end
else
begin
rollback tran
raiserror( '你的Access数据表结构和SQLserver数据表的结构互相不符合,请到相关网站查看! ',16,1)
end
end
/*
if @@error=0
begin
WAITFOR DELAY '00:00:20 '
EXECUTE MASTER..XP_cmdshell 'net stop msdtc '
end*/
return
GO
杀ACCESS文件存储过程
create procedure DelAccess_Pro
@databasename varchar(200),@dbasepath varchar(200)
as
declare @dels varchar(10)
declare @sql varchar(2000)
set @dels= 'del '
set @sql=rtrim(ltrim(@dels))+ ' '+rtrim(ltrim(@dbasepath))+ltrim(rtrim(@databasename ))
exec master..xp_cmdshell @sql
GO
------解决方案--------------------
找个pskill,配合xp_cmdshell使用。
------解决方案--------------------
master..xp_cmdshell 'taskkill /F /IM msaccess.exe '