我在这里有c#代码。
using Microsoft.SqlServer.Dts.Runtime;
string filedts = "C:\\SSIS\\SQLtoFLAT\\PQFormTEST2.dtsx";
Application app = new Application();
Package package = app.LoadPackage(filedts, null);
DTSExecResult result = package.Execute();
我看到所有网站代码都是这样的,但是当我运行它时,我在ASP.NET中, 没有任何错误,但结果“失败”。
为什么呢?如何解决?
感谢您的帮助, 朱莉娅
答案 0 :(得分:4)
我从.Net应用程序运行SSIS包时看到的最常见问题是误解了它们的运行位置。 SSIS包不是基于服务器的执行单元,它们在它们所驻留的服务器的上下文中运行,如T-SQL命令或存储过程。 SSIS包被加载到您正在调用它的进程中,并在本地执行。 这意味着:
答案 1 :(得分:2)
我怀疑的第一件事是安全问题 - ASP.Net进程是否可以访问.dtsx文件?
这是一个简单的检查方法:下载ProcessExplorer:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx并在您尝试执行此代码时运行它
Process Explorer将监控每个文件访问,它会告诉您它是否失败或成功。有可能,您将看到打开dtsx文件失败。
(当然你可以直接向dtsx文件授予权限,但是值得花时间学习进程监控 - 这是诊断此类事情的绝佳工具。)
答案 2 :(得分:1)
我宁愿在SQL Server上部署dtsx并创建一个将从WebSite异步运行的Job(使用SMO)。
创建一个Job很容易,如果你有sSIS包,我想你有一个SQL Server。您只需创建一个RUN SSIS包的步骤。然后,您可以选择服务器上部署的其中一个软件包,并根据需要执行任何其他步骤。
从ASP.NEt运行作业需要Server Management Objects API。 通常,您获取对服务器的引用。枚举要运行的作业。然后单击运行。
当然如果您的包使用xml配置您将需要创建一个文件(来自ASP.NET或其他层)。 希望能帮助到你。我稍后会尝试发布代码示例。
答案 3 :(得分:1)
您可以创建运行包的作业,创建运行该作业的存储过程,然后像平常一样调用SP。这是pretty simple ...
ALTER PROCEDURE [dbo].[ExecJob]
-- Add the parameters for the stored procedure here
@spName varchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @r INT
--BEGIN TRY
EXEC @r = msdb.dbo.sp_start_job @spName
--END TRY
--BEGIN CATCH
--END CATCH
SELECT @r
END
请注意,返回的@r是作业状态代码