Fantacy
calmzeal's code life
posts - 78,comments - 148,trackbacks - 14

向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"nullnull, DTS.DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection,
6    nullnullnull"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 = ?)
然后配置 输入和输出参数

还剩下第2条没搞定,希望这2天能搞定~

posted on 2006-05-28 21:05 calmzeal 阅读(2990) 评论(8)  编辑 收藏 网摘 所属分类: Sql,Oracle..dotNet

FeedBack:
2006-05-29 09:38 |       
现在一般使用SQL2005的SSIS功能了,DTS是SQL2000的功能,差别很大哦。如果不是使用SQL2005,建议使用SSIS功能,基本上不用编码的!
  回复  引用  查看    
2006-05-29 10:20 | TerryLee      
@悟
“现在一般使用SQL2005的SSIS功能了”

“如果不是使用SQL2005,建议使用SSIS功能”

这两句话实在看不懂!

  回复  引用  查看    
2006-05-29 16:04 | 思无邪      
遇到过类似的问题,是Excel把字符型自动转到了数字,或者数字当文本了
在Exce中选择单元各格式,自定义就好了

  回复  引用  查看    
#4楼 [楼主]
2006-05-30 00:12 | calmzeal      
@悟
暂时没有接触sql2005
不过我想要对数据源进行处理的话
应该还是要适当编码吧

  回复  引用  查看    
#5楼 [楼主]
2006-05-30 00:12 | calmzeal      
@TerryLee
呵呵 笔误吧

  回复  引用  查看    
#6楼 [楼主]
2006-05-30 00:16 | calmzeal      
@思无邪
在Excel中设置单元格格式 确实能正确处理
可是我的实际情况是
对收取到的邮件附件调用DTS包自动导入
不能对Excel文件进行设置的
而且Excel有的行中的空格也要去掉

而且在列转化时:
DTSDestination("Barring") = DTSSource("Barring");
不能使用javascript的函数对 列进行操作:
如 DTSSource("Barring").toString();

郁闷。。

  回复  引用  查看    
#7楼 [楼主]
2006-06-02 00:20 | calmzeal      
导出DTS包:
设计好包后 另存为:机构化存储文件(*。dts)

导入时 在本地包 --〉所有任务 --〉导入

  回复  引用  查看    
#8楼 [楼主]
2006-09-19 09:24 | calmzeal      
如何处理重复和空数据

在 DTS设计器中加入2个SQL执行任务:
删除空数据:Delete From t where Field IS NULL;

根据Field1删除重复数据:Delete From t where ID not in ( Select Max(ID) From t group By Field1);

  回复  引用  查看    

发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: