原文:.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[];
if (dt.Rows.Count > )
{
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行
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 < )
{
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 = ; i < primaryKeys.Length; i++)
{
temp1[i] = tableName + "." + primaryKeys[i] + "=Inserted." + primaryKeys[i];
}
List<string> temp2 = new List<string>();
for (int i = ; i < columns.Count; i++)
{
temp2.Add(columns[i].ColumnName + "=Inserted." + columns[i].ColumnName);
}
List<string> temp3 = new List<string>();
for (int i = ; 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;
}

C#使用SqlBulkCopy将DataTable写入数据库的表中(表不存在则创建新表,数据存在则更新,不存在则插入)的更多相关文章

  1. dataTable写入数据库(大数据写入)

    例1: connectionStr,链接字符串dataTableName, 数据库中对应表名sourceDataTable DataTable 要写入数据库的DataTable字段要和表一致 publ ...

  2. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

  3. 用c#在Access数据库中创建新表

    生成表NewTable,该表有文本字段Field1和整型字段Field2 private void CreateNewTable()  {    OleDbConnection conn = new ...

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

    1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1.表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有同 ...

  5. Excel 导入到Datatable 中,再使用常规方法写入数据库

    首先呢?要看你的电脑的office版本,我的是office 2013 .为了使用oledb程序,需要安装一个引擎.名字为AccessDatabaseEngine.exe.这里不过多介绍了哦.它的数据库 ...

  6. 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

      先看一下我要实现的功能界面:   这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面 ...

  7. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  8. 如何将XML文件写入数据库

    将xml文件转成string public string XMLDocumentToString(XmlDocument doc) { MemoryStream stream = new Memory ...

  9. 【数据传输 2】批量导入的前奏:将Excel表中的数据转换为DataTable类型

    导读:我们知道,在数据库中,数据集DataSet是由多张DataTable表组成.所以,如果我们需要将数据从外部导入到数据库中,那么要做的很重要的一步是将这些数据转换为数据库可以接受的结构.今天在用S ...

随机推荐

  1. Android实战开发租赁管理软件(适配UI,数据的存储,多线程下载)课程分享

    亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系. 课程内容简单介绍 我们软件是基于移动设备的.所以我们必定的选择了安卓作为我们的开发工具.课 ...

  2. 2014辽宁省赛 Repeat Number

    问题 C: Repeat Number 时间限制: 1 Sec  内存限制: 128 MB [cid=1073&pid=2&langmask=0">提交][状态][论坛 ...

  3. Cordova/Phonegap 升级至 2.8.1

    相关链接 Apache Cordova 项目首页: http://cordova.apache.org/ Apache Cordova 历史版本列表: http://archive.apache.or ...

  4. tomcat各版本和jsp、jstl、servlet的依赖关系(转)

    Servlet / JSP / Tomcat  Version  Servlet/ JSP    Tomcat  2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.3 ...

  5. Android常用开源项目

    Android开源项目第一篇——个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Progre ...

  6. SimpleWiFi模块评估板

    SimpleWiFi评估套件,发货清单:        1.评估版一块. 2.专用WiFi天线一根. 3.配套电源一个. 单模块 是60元,链接如下: http://item.taobao.com/i ...

  7. 总结文件操作函数-文件夹(三)-C语言

    获取.改变当前文件夹: 原型为: #include <unistd.h>   //头文件 char *getcwd(char *buf, size_t size); //获取当前文件夹.相 ...

  8. hdu 2642 二维树状数组 单点更新区间查询 模板水题

    Stars Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/65536 K (Java/Others) Total Subm ...

  9. crm操作安全字段

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Xrm.Sdk.Messages; /// <summary> ...

  10. javascript它【蛇系列】第一弹:简单的蛇实现

    参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 上面的博客是一个参考,竟第一次做.真让自己盲人摸象做不出来. 只是我在其上做了 ...