zoukankan      html  css  js  c++  java
  • C#中调用DTS

     c#中调用DTS    ----原文出自老汉的专栏
    DTS是sql server里很好用的一样东西,用它来做信息系统的数据导入,是再合适不过了。但是sql server中的DTS毕竟只有数据库开发人员才会调用,运营人员不懂数据库知识,只能写个调DTS的程序给他们用。
    网上也有一些文章讲调用DTS的,不过大多是用DTSRun.exe,那么如何在代码里调呢?
    首先引用Microsoft DTSPackage Object Library
    代码是很简单的:
    1private void RunDTS()
    2  {
    3   DTS.Package2Class package = new Package2Class();
    4   object p = null;
    5   package.LoadFromSQLServer("ws-victor-03"nullnull, DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection,
    6    nullnullnull"TestDTS"ref p);
    7   package.Connections.Item(1).DataSource = "dts.XLS";
    8   package.Execute();
    9  }
     

    /**
        接上文
     */

    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 = ?)
    然后配置 输入和输出参数

  • 相关阅读:
    uoj110
    11.28模拟赛D题解
    AT1219 歴史の研究
    P5906 【模板】回滚莫队&不删除莫队
    P4175 [CTSC2008]网络管理
    SP32952 ADAFTBLL
    CF1479D Odd Mineral Resource
    SP10707 COT2
    P4074 [WC2013] 糖果公园
    P6134 [JSOI2015]最小表示
  • 原文地址:https://www.cnblogs.com/Koy/p/458299.html
Copyright © 2011-2022 走看看