您的位置:首页 > 数据库

从FTP下载文件后把数据放在数据库里.

2009-12-04 16:03 232 查看
相关需求是:

1.从FTP上下载文件(此FTP不知因为什么原因.下载东东时二次连接才会连上一次.FTP软件是,在.NET程序下一样如此).

2.下载文件时先要看这个文件的控制文件在不在,在才下载,不在不下载.

3.解析文件每行数据.客户会给出这个字段在这行数据中的位置.如Name(0,8),Status(8,5),T1(13,7),T2(20,30),T3(50,50).......

4.因相关要求.可以要加上一些数据库字段,字段名固定.Updatename表示文件批次.可能有的文件需要一个Ldata字段表示插入时间.

5.把数据解析后放在相应的数据表.

6.删除原文件和相关控件文件.

7.Mail报告当前情况

很简单的一个需求.开始只有二份文件,我想那好,我就用SSIS好了.也做好了.

但是后有六份文件,可能不至,吐血的是,都是上面的要求.只是在第三步会不同,字段名不同,位置不同........用SSIS我就要做六份差不多的.

然后一个有问题.可能另个五个就有相同的问题.可能就要改六次.

算了.我还是用我比较擅长的C#写吧.用什么模式也要对六个文件来生成对应的情况.还是用LinqToSQL生成的类.再加上反射与泛形解决吧.(^_^说的有的大,就是些相关小应用).

首先分析三,如Name(0,8),Status(8,5),T1(13,7),T2(20,30),T3(50,50).......

数据行分割是有规则的.就是一个接一个的分割,那么(这就要求数据库字段要和文件顺序一样,并且长度要正确.).先看一下LinqToSql为我们生成的类吧.

代码

BomDataDataContext db = new BomDataDataContext();
FtpClass ftp = new FtpClass("----------", "-----------", "---------", null);

//关于A51Bom的处理
FtpFile file1 = new FtpFile { Name = "----------", Path = "test/----", ControlFileName = "----_ENDFILE", SavePath = @"-----------" };
//取得数据
List<A51BOM> datas1 = ftp.DownData<A51BOM>(file1);
//入数据库
if (datas1 != null)
{
db.A51BOM.InsertAllOnSubmit(datas1);
Insert_Message(file1.Name,datas1.Count);
}

总的来说,是取了个巧,其实一样有六个类,只是因为那六个类是用LinqToSql上直接拉表就行了.其中表要建好是关建.

不过总的来说,能很好解决相关问题.比如修改文件出错的异常,在SSIS上,我可能要修改六次(可能SSIS也能做到.不过我现在做不到).而用我上面程序,只要修改一个地方.那六份文件便都能应用到.

至于其中说用到了反射会不会有性能问题.就我调试而言.反射部分我是感觉不到任何执行时间长的.时间长的只有从FTP下载文件时才会有感觉.一份6000行的文件.把每行全用上面方法转换为对象时就我调试时而言我都感觉要不到1S,更不要说发布后.至于前面分析类的属性.我放在静态函数里了这样声明N个对象时都只有一份对应地址.保证多个对象不会重复构造这一部分.像单例模式那样.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐