sql 2008的SSIS应用方法: 将多个一定格式的文本文件批量导入到数据库

        private bool ExecutePackage(string sSourceFileName)
        {
            bool bResult = false;
            string srcpath = System.Windows.Forms.Application.StartupPath.Replace(@"\bin\Debug", "") + @"\Resources\NewPackage_20110526_02.dtsx";

            string filepath = System.Windows.Forms.Application.StartupPath + "\\Resources\\NewPackage_20110526_02.dtsx";
            if (!System.IO.File.Exists(filepath))
            {
                if (!System.IO.Directory.Exists(System.Windows.Forms.Application.StartupPath + "\\Resources"))
                {
                    System.IO.Directory.CreateDirectory(System.Windows.Forms.Application.StartupPath + "\\Resources");
                }
                System.IO.File.Copy(srcpath, filepath);
            }

            Microsoft.SqlServer.Dts.Runtime.Application application = new Microsoft.SqlServer.Dts.Runtime.Application();
            Package package = application.LoadPackage(filepath, null, true);

            package.Connections["SourceConnectionFlatFile"].ConnectionString= sSourceFileName;
            string sTargetConnection = string.Format(@"Data Source={0};User ID={1};Password={2};Initial Catalog={3};Provider=SQLNCLI10;Auto Translate=false;", sqlHelper.ImportTargetDataSource,sqlHelper.ImportTargetDBUid,sqlHelper.ImportTargetDBPwd,sqlHelper.ImportTargetDBName);
            package.Connections["DestinationConnectionOLEDB"].ConnectionString = sTargetConnection; 
            DTSExecResult result = package.Execute();
            if (result.Equals(DTSExecResult.Success))
            {
                bResult = true;
                //Common.DisplayMsg(this.Text, "成功导入数据");
            }
            else
            {
                string sError = string.Empty;
                for (int i = 0; i < package.Errors.Count; i++)
                {
                    sError +="(" + (i+1).ToString() + ")." + package.Errors[i].Description + Convert.ToChar(Keys.Return);
                }

                if (sError.Length > 1) sError = sError.TrimEnd(Convert.ToChar(Keys.Return));
                Common.DisplayMsg(this.Text, "导入失败:\r\n" + sError);
            }

            Common.DeleteFilesFromDisk(sSourceFileName);
            return bResult;
        }

 提示:

1,   sqlHelper.ImportTargetDataSource,sqlHelper.ImportTargetDBUid,sqlHelper.ImportTargetDBPwd,sqlHelper.ImportTargetDBName:这些设置连接你数据库的相关信息就OK了

2, 需要引用这2个命名空间,具体需要的DLL可以从网上百度到

         using Microsoft.SqlServer.Dts.Runtime;
         using Microsoft.SqlServer.Dts.Tasks.ExecutePackageTask;

3, 这里的 NewPackage_20110526_02.dtsx 是sql 2008下的包文件

        选中数据库--> 右键--> 任务--> 导入数据-->选择数据源为:平面数据源

        选中文件-->指定分割符-->绑定 源数据与目标数据的列 --> 最终生成一个.dtsx的包文件

4, 若有多个文本文件,在for循环中调用

         ExecutePackage(txtFilePath) 就OK了

5, 这种解决方案 一般适用于数据库字段 和 文本文件格式已经定型的情况。

    如果数据库字段,文本文件的列发生改变,那么 这个 .dtsx 重新生成一下就OK了。

    按上述操作完成后,用户可以随心所欲的选择 1个或多个 内容具有同样格式的文本文件,进行批量导入。

    我操作过10多个平均每个约1.5MB的文本文件(有10个字段列), 导入到sql2008的表中,数据大约有200W条,用时45秒左右。

    这个效率, 用sql语句简单的 for循环 200W次,可能没法达到。

阅读更多
个人分类: Winform (C#) Sql Server
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭