.net使用SqlBulkCopy导入数据(创建新表)

原文:.net使用SqlBulkCopy导入数据(创建新表)

.net2.0后ado.net提供了一个快速导入sqlserver的方法sqlbulkcopy.导入效率非常高.

包装了一个简单的sqlbulkcopy类,用于数据从datatable导入到sqlserver.代码如下:

    /// <summary>
        /// 将DataTable写入数据库的表中
        /// </summary>
        /// <param name="source">数据源DataTable</param>
        /// <param name="tableName">数据目标的表名</param>
        /// <param name="useTransaction">操作过程是否使用事务</param>
        /// <param name="databaseConnString">数据库连接字符串</param>
        /// <param name="dropTable">删除DB中已存在的表(并自动新建表)</param>
        /// <param name="primaryKeys">主键的列名</param>
        public void WriteToDataBase(DataTable source, string tableName, bool useTransaction, string databaseConnString, bool dropTable, string[] primaryKeys)
        {
            //判断表是否存在
            SqlHelper.ConnectionString = databaseConnString;
            //dataHelper.IsConnString = true; //使用数据库连接字符串创建sqlserver操作对象
            string sql = "select * from sys.objects where type=‘U‘ and name=‘" + tableName + "‘";
            DataTable dt = SqlHelper.ExecuteDataset(sql).Tables[0];
            if (dt.Rows.Count > 0)
            {
                if (dropTable == true)
                {
                    sql = "drop table " + tableName + "";   //清除已存在的表
                    SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionString, CommandType.Text, sql);
                }
                else
                {
                    SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(databaseConnString, SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.FireTriggers);
                    sqlbulkcopy.DestinationTableName = tableName;//数据库中的表名

                    sqlbulkcopy.WriteToServer(source);
                    return;
                }
            }
            this.CreateTable(source.Columns, tableName, primaryKeys);
            var sqlBulkCopy = new System.Data.SqlClient.SqlBulkCopy(databaseConnString, SqlBulkCopyOptions.FireTriggers);//启动触发器
            if (useTransaction == true)
            {
                sqlBulkCopy = new System.Data.SqlClient.SqlBulkCopy(databaseConnString, SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.FireTriggers); //导入的数据在一个事务中
            }
            sqlBulkCopy.DestinationTableName = tableName;
            foreach (DataColumn c in source.Columns)
            {
                sqlBulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
            }
            //SqlBulkCopy.BulkCopyTimeout = this.timeout;  //超时时间
            sqlBulkCopy.BatchSize = 3000;  //每次传输3000行
            sqlBulkCopy.WriteToServer(source);
        }
        /// <summary>
        /// 创建表以及触发器
        /// </summary>
        /// <param name="columns">列名</param>
        /// <param name="tableName">表名</param>
        /// <param name="primaryKeys">主键的列名</param>
        public void CreateTable(System.Data.DataColumnCollection columns, string tableName, string[] primaryKeys)
        {
            if (primaryKeys == null || primaryKeys.Length < 1)
            {
                MessageBox.Show("主键不允许为空!");
                return;
            }
            StringBuilder sb = new StringBuilder();
            // sb.Append("create table [" + tableName + "] (autoId  int identity(1,1),");
            sb.Append("create table [" + tableName + "] (");
            foreach (DataColumn column in columns)
            {
                sb.Append(" [" + column.ColumnName + "] " + this.GetTableColumnType(column.DataType) + ",");
            }

            string sql = sb.ToString();
            sql = sql.TrimEnd(‘,‘);
            sql += ")";

            sb.Clear();
            var temp1 = primaryKeys;
            for (int i = 0; i < primaryKeys.Length; i++)
            {
                temp1[i] = tableName + "." + primaryKeys[i] + "=Inserted." + primaryKeys[i];
            }
            List<string> temp2 = new List<string>();
            for (int i = 0; i < columns.Count; i++)
            {
                temp2.Add(columns[i].ColumnName + "=Inserted." + columns[i].ColumnName);
            }
            List<string> temp3 = new List<string>();
            for (int i = 0; i < columns.Count; i++)
            {
                temp3.Add(columns[i].ColumnName);
            }
            sb.Append("CREATE TRIGGER [tri_" + tableName + "_edit]  ON [" + tableName + "] instead of insert as");
            sb.Append("  IF EXISTS (");
            sb.Append("SELECT * FROM    " + tableName + ",Inserted WHERE " + String.Join(" AND ", temp1) + ")");
            sb.Append(" UPDATE [" + tableName + "] SET " + string.Join(",", temp2) + " FROM [" + tableName + "] JOIN inserted ON " + String.Join(" AND ", temp1) + " ");
            sb.Append(" ELSE ");

            sb.Append(" INSERT  [" + tableName + "](" + string.Join(",", temp3) + ") SELECT  " + string.Join(",", temp3) + " FROM inserted  ");
           // sql = sql + " ; " + sb.ToString();
            SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionString, CommandType.Text, sql);
            SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionString, CommandType.Text, sb.ToString());
        }
       private string GetTableColumnType(System.Type type)
        {
            string result = "varchar(255)";
            string sDbType = type.ToString();
            switch (sDbType)
            {
                case "System.String":
                    break;
                case "System.Int16":
                    result = "int";
                    break;
                case "System.Int32":
                    result = "int";
                    break;
                case "System.Int64":
                    result = "float";
                    break;
                case "System.Decimal":
                    result = "decimal(18,4)";
                    break;
                case "System.Double":
                    result = "decimal(18,4)";
                    break;
                case "System.DateTime":
                    result = "datetime";
                    break;
                default:
                    break;
            }
            return result;
        }
时间: 2025-01-31 04:09:40

.net使用SqlBulkCopy导入数据(创建新表)的相关文章

mysql 复制表结构 / 从结果中导入数据到新表

这只会复制结构: mysql> create table a like mysql1; Query OK, 0 rows affected (0.03 sec) mysql> desc a; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+----

使用SqlBulkCopy导入数据至MS SQL Server

原文:使用SqlBulkCopy导入数据至MS SQL Server Insus.NET一直使用表类型来数据入MS SQL Server.参考<存储过程参数为DataTable>http://www.cnblogs.com/insus/archive/2012/09/22/2698515.html .今天学习一个SqlBulkCopy来把数据导入MS SQL Server中去.就是这个<读取XML某一节点>http://www.cnblogs.com/insus/p/3778256

postgresql----根据现有表创建新表

除普通的建表语句"create table table_name(columns);"之外,还可以根据现有表快速的创建新表: 一.使用create table ... (like ...)创建一个和原表结构相同的新表,根据INCLUDING保留原表的约束,索引等. create table table_name (like parent_table {INCLUDING|EXCLUDING}{DEFAULTS|CONSTRAINTS|INDEXES|STORAGE|COMMENTS|A

数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接

1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1,表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有相同名字的字段,则使用时需带表名(别名). order  by  置于where 条件之后. 2)自连接:同一张表的连接查询,将一张表视为两张表或多张表. eg:显示公司每个员工名字和他的上级的名字.将emp表看做两张表worker和boss select  worker.ename  雇员,boss

Sql中根据旧表创建新表的SQL语句

今天在网上查了下,根据旧表创建新表的SQL语句,网上给了两个答案 create table tab_new like tab_old (使用旧表创建新表) create table tab_new as select col1,col2- from tab_old definition only 两个语句都试了一下,报错了. 正确的方法是 select * into newtable from oldtable; 如果不想导记录,只想生成表结构 :select * into newtable f

vertica从其他表迁移数据到新表(insert into 语句用法实例)

前面一篇开始学习solr的时候,做了个入门的示例http://blog.csdn.net/zjc/article/details/24414271 .虽然可以检索出内容,但总和想象的结果有差异--比如,检索"天龙"两个字,按常规理解,就应该只出来<天龙八部>才对,可是竟然也会把<倚天屠龙记>检出来.后来研究了一下,发现系统是这样处理的:无论是抽索引时还是分析检索词时,都把所有文字按单字拆开.这样,刚好<倚天屠龙记>里包含"天"和&

php大力力 [023节]CREATE TABLE创建新表sql写字段备注(2015-08-27)

2015-08-27 php大力力023.CREATE TABLE创建新表sql写字段备注 http://www.cnblogs.com/dalitongxue/p/4762182.html 参考: MySQL字段的说明和备注信息 http://blog.csdn.net/chelen_jak/article/details/45689139 DROP TABLE IF EXISTS test_table; CREATE TABLE test_table( Test_ID int NOT NUL

使用INTO子句创建新表

例子 USE StudentManagement GO SELECT Student_No,Student_Name,Student_Sex INTO #StudentTemp FROM Student GO SELECT *FROM #StudentTemp GO INTO子句可以自动创建一个新表并将查询结果集中的记录添加到该表中.新表的列由select子句中的目标列来决定.若新表名称已#开头,如上所示,则声成的新表为临时表,不带#的为永久表. 使用INTO子句创建新表

第3节 sqoop:4、sqoop的数据导入之导入数据到hdfs和导入数据到hive表

注意: (1)\001 是hive当中默认使用的分隔符,这个玩意儿是一个asc 码值,键盘上面打不出来 (2)linux中一行写不下,可以末尾加上 一些空格和 “ \ ”,换行继续写余下的命令: bin/sqoop import --connect jdbc:mysql://192.168.25.24:3306/userdb --username root --password admin --table \emp --fields-terminated-by '\001' \--hive-im