你的位置:首页 > ASP.net教程

[ASP.net教程]C#调用SSIS包及读取DataReader目标


C#调用SSIS包需要引用两个DLL 。(具体位置在C盘搜索,MSDN和百度提供的路径都不太正确)

Microsoft.SQLServer.ManagedDTS.dll

Microsoft.SqlServer.Dts.DtsClient.dll   

这是MSDN上的例子 https://msdn.microsoft.com/zh-cn/library/ms136025%28v=sql.120%29.aspx

MSDN上的例子只有读取一个DataReader的做法,并且该方法不能加事件。

下面是读取多个DataReader的代码

     string pkgLocation = @"Package1.dtsx"; //包路径      DtsConnection dtsConnection;     DtsCommand dtsCommand;     IDataReader dtsDataReader = null;     Package pkg;     Application app;     DataSet ds = new DataSet();     app = new Application();     pkg = app.LoadPackage(pkgLocation, null);     string dataReaderName = "DataReaderDest";     dtsConnection = new DtsConnection();     {       dtsConnection.m_pkg = pkg;//       dtsConnection.ConnectionString = string.Format(@"/FILE ""{0}""",pkgLocation); //另一种连接方式。如果用Package则可以加事件//       dtsConnection.Open();     }     dtsCommand = new DtsCommand(dtsConnection);     dtsCommand.CommandText = dataReaderName;     List<string> reader = new List<string>() {"DataReaderDest", "DataReaderDest2"}; //DataReader输出名称 集合           List<IDataReader> readers = new List<IDataReader>();     foreach (var cmdtext in reader)     {       dtsCommand.CommandText = cmdtext;       dtsDataReader = dtsCommand.ExecuteReader(CommandBehavior.SingleResult);       readers.Add(dtsDataReader);       Console.WriteLine("读取{0}", cmdtext);     }     foreach (var dataReader in readers)     {       try       {         DataTable dt = new DataTable();         dt.Load(dataReader);         Console.WriteLine("数据行{0}", dt.Rows.Count);         ds.Tables.Add(dt);       }       catch (Exception ex)       {         Console.WriteLine(ex.Message);       }       finally       {         dataReader.Close();       }     }     dtsCommand.Dispose();     return ds;

上面的代码能读取1个以上DataReader但是读取第一个后需要等待30秒才能读取第二个,会在下面的代码卡着

dtsDataReader = dtsCommand.ExecuteReader(CommandBehavior.SingleResult);

原因是包中DataReader的ReadTimeout默认为30000毫秒 设为100毫秒就好了。每一个DataReader都要设置。