C#中调用DTS
2006-07-24 14:42 Koy 阅读(1641) 评论(0) 编辑 收藏 举报网上也有一些文章讲调用DTS的,不过大多是用DTSRun.exe,那么如何在代码里调呢?
首先引用Microsoft DTSPackage Object Library
代码是很简单的:
![](https://darzui.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://darzui.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://darzui.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://darzui.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://darzui.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://darzui.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://darzui.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://darzui.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://darzui.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
/**
接上文
*/
1、新建一个项目,添加SQLServer DSTS的COM引用,常用路径为c:\program files\microsoft sql server\80\tools\binn\dtspkg.dll
2、操作DTS的代码如下
A、列出所有数据库的包
ApplicationClass app = new ApplicationClass();
PackageSQLServer pkgSS = app.GetPackageSQLServer("localhost","","",DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection);
PackageInfos pkgInfos = pkgSS.EnumPackageInfos("",false,"");
PackageInfo pkgInfo = pkgInfos.Next();
txtLayOut.Text = "";
while(!pkgInfos.EOF)
{
txtLayOut.Text += pkgInfo.Name + "\r\n";
pkgInfo = pkgInfos.Next();
}
app = null;
B、执行一个指定的包
Package2Class pkg2 = new Package2Class();
object pVarPersistStgOfHost = null;
pkg2.LoadFromSQLServer("localhost", null, null,
DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection, null,
null, null, "dtsTest2", ref pVarPersistStgOfHost);
pkg2.Execute();
pkg2.UnInitialize();
pkg2 = null;
C、新增一个包
Package2Class pkg2 = new Package2Class();
pkg2.Name = "dtsTest3";
object pVarPersistStgOfHost = null;
pkg2.SaveToSQLServer("localhost", null, null,
DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection, null, null, null,
ref pVarPersistStgOfHost, true);
pkg2 = null;
/**
接 上文
*/
向Sql 中导入Excel数据时,使用MS SQL的DTS功能
可以很方便的导入,同时引用Dll文件,可以在程序中对导入过程进行控制。
创建DTS包的过程如下:
1。在SQL企业管理器中,工具菜单选数据转换服务,导入数据
按照它的图形化向导提示,可以一步步创建一个DTS包,可以选择保存在数据库。
2。在SQL企业管理器中,左边树形结构中选择 数据转化服务,本地包中
可以新建一个包,同样有图形化的界面建立包:拖一个Excel数据源,拖一个Sql数据源
然后在任务里选 数据转化任务,原数据选Excel源,目的选SQL,然后在转化的肩头上选属性
里面可以配置转化过程。注意带有主键的数据表,要把选项中 启用标示插入去掉
在C#里调用过程如下:
private void RunDTS()
2 {
3 DTS.Package2Class package = new Package2Class();
4 object p = null;
5 package.LoadFromSQLServer("ws-victor-03", null, null, DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection,
6 null, null, null, "TestDTS", ref p);
7 package.Connections.Item(1).DataSource = "dts.XLS";
8 package.Execute();
9 }
现在项目中遇到问题:
1。插入数据时需要插入时间等Excel数据源中不存在的数据
2。Excel数据源中数据有的需要转化,像数值形,导入后变成了1。23131E12等形式
3。插入数据时需要从Sql中查询数据再插入
现在解决了第一条和第三条的一步分:
在上述配置 数据转化任务 时,
DTSDestination("ICC") = DTSSource("SIM Number");
DTSDestination("IMSI") = DTSSource("IMSI");
DTSDestination("PIN1") = DTSSource("PIN1");
DTSDestination("PUK1") = DTSSource("PUK1");
DTSDestination("PIN2") = DTSSource("PIN2");
DTSDestination("PUK2") = DTSSource("PUK2");
DTSDestination("MSISDN") = DTSSource("MSISDN");
DTSDestination("Fax") = DTSSource("Fax");
DTSDestination("Data") = DTSSource("Data");
DTSDestination("Barring") = DTSSource("Barring");
DTSDestination("MailFormID") = DTSGlobalVariables("MailFromID").Value;
DTSDestination("ReceiveDate") = new Date().getYear() + "-" + new Date().getMonth() + "-" + new Date().getDate();
return(DTSTransformStat_OK);
其中,MailFromID为全局变量,添加方法为包 菜单 属性里面选择全局变量,可在C#中对其进行赋值:
foreach(GlobalVariable global in package.GlobalVariables)
{
if (global.Name == "MailFromID") {
package.GlobalVariables.Remove(global.Name);
}
}
package.GlobalVariables.AddGlobalVariable("MailFromID",MailFromID);
插入时间:
DTSDestination("ReceiveDate") = new Date().getYear() + "-" + new Date().getMonth() + "-" + new Date().getDate();
用javascript拼出来的 哈哈
插入数据时需要从Sql中查询数据再插入:
在包里添加新的任务:
执行Sql任务
SELECT AddressList.*
FROM AddressList
WHERE (ID = ?)
然后配置 输入和输出参数