ado.net已经有了sqlBulkCopy, 但是那个用xml格式,网络传输数据量太大。
自己实现了一个,传输尽量少的字节。 性能没对比过,有需要的自己拿去测试。
 using System.Data.SqlClient;

 namespace RaywindStudio.DAL {

     /// <summary>
/// MSSQL批量插入表
/// </summary>
public static class SqlBulkInsert { private static bool initsql = false; /// <summary>
/// SQL批量插入表 过程
/// </summary>
/// <param name="tableName">表名</param>
/// <param name="fields">字段,逗号分隔</param>
/// <param name="Values">字段值,逗号分隔</param>
/// <param name="RowSplit">Values行间分隔符</param>
/// <param name="RowCount">Values行数</param>
/// <param name="conn">Sql Connection</param>
/// <returns></returns>
public static bool BulkInsert(string tableName, string fields, string Values, string RowSplit, int RowCount,
SqlConnection conn) {
initSql(conn);
string ret= SqlAdo.ExecuteScalar("EXEC [dbo].[pSqlBulkInsert]"
+ " @tableName=N'" + tableName
+ "',@fields=N'" + fields
+ "',@values=N'" + Values
+ "',@split=N'" + RowSplit
+ "',@rowCount=" + RowCount.ToString(), conn).ToString();
return ret == "";
}
private static void initSql(SqlConnection sqlconn) {
if (!initsql) {
SqlAdo.ExecuteNonQuery(
@"IF not EXISTS (SELECT * FROM dbo.SysObjects
WHERE ID = object_id(N'[fGetArrayStr]')
and OBJECTPROPERTY(ID,'IsScalarFunction')=1)
begin
exec(
'CREATE function fGetArrayStr
(
@str nvarchar(max), --字符串
@split nvarchar(10), --分隔符
@index int --取第几个元素
)
returns nvarchar(4000)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location<>0 and @index>@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 set @location =len(@str)+1
return substring(@str,@start,@location-@start)
end')
end", sqlconn); SqlAdo.ExecuteNonQuery(
@"IF not EXISTS (SELECT * FROM dbo.SysObjects
WHERE ID = object_id(N'[pSqlBulkInsert]')
and OBJECTPROPERTY(ID,'IsProcedure')=1)
begin
exec(
'Create proc pSqlBulkInsert
@tableName nvarchar(50),
@fields nvarchar(500),
@values nvarchar(max),
@split nvarchar(5),
@rowCount int
as
declare @next int =1
declare @sql nvarchar(500)=N' Insert Into '+@tableName +N'('+@fields +N') Values('
declare @sqlTmp nvarchar(4000)
Begin tran
while @next<=@rowCount
begin
set @sqlTmp=@sql+dbo.fGetArrayStr(@values,@split,@next)+N')'
Exec(@sqlTmp)
if(@@error<>0)
begin
rollback
return -1
end
set @next=@next+1
end
commit
return 0", sqlconn); initsql = true;
}
}
}
}

SQL批量插入表类 SqlBulkInsert的更多相关文章

  1. SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...

  2. SQL语句-批量插入表(表数据插表)

    批量插入表(表数据插表) ****1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,val ...

  3. C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据

    #region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// ...

  4. 利用sql批量删除表,存储过程

    利用sql批量删除表,存储过程. 最近用godaddy的空间,由于系统里面的表多,一个个的删除很麻烦,就网上搜集了一下解决方法. 给大家分享一下: 1.批量删除存储过程 declare @procNa ...

  5. insert into select 与select into from -- sql 批量插入

    参考资料:http://www.w3school.com.cn/sql/sql_union.asp   UNION:操作符用于合并两个或多个select语句的结果集.                 ...

  6. Delphi中SQL批量插入记录

    http://www.cnblogs.com/azhqiang/p/4050331.html 在进行数据库操作时, 我们经常会遇到批量向数据库中写入记录的情况. 在这里我提供3种操作方式:   1.  ...

  7. SqlBulkCopy与触发器,批量插入表(存在则更新,不存在则插入)

    临时表:Test /****** 对象: Table [dbo].[Test] 脚本日期: 05/10/2013 11:42:07 ******/ SET ANSI_NULLS ON GO SET Q ...

  8. 在pycharm中批量插入表数据、分页原理、cookie和session介绍、django操作cookie

    昨日内容回顾 ajax发送json格式数据 ''' 1. urlencoded 2. form-data 3. json ''' 1. ajax $.ajax({ data: JSON.stringi ...

  9. Sql批量插入方法

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

随机推荐

  1. Centos5.5+LAMP环境

    Note:如果网络正常,apache服务正常,仍然不能访问网页.需要检查linux 防火墙是否关闭. ( 先重新启动防火墙 service iptables start 然后输入配置防火墙的命令并查看 ...

  2. MQTT.js browser node 均支持

    npm - mqtt 官网手册 https://www.npmjs.com/package/mqtt#weapp 简书用户 使用笔记 https://www.jianshu.com/p/4fd95ca ...

  3. CF10D LCIS 最长公共上升子序列

    题目描述 This problem differs from one which was on the online contest. The sequence a1,a2,...,an a_{1}, ...

  4. thinkphp5.1注解插件

    前言: thinkphp5.1中用注解的方式实现: v0.1.0版本 数据验证器 请求过滤.格式化 属性对象注入 dev-master版本 额外支持 自动事务 数据缓存 如果您觉得好用,点个star哈 ...

  5. Update(Stage4):spark_rdd算子:第2节 RDD_action算子_分区_缓存:缓存、Checkpoint

    4. 缓存 概要 缓存的意义 缓存相关的 API 缓存级别以及最佳实践 4.1. 缓存的意义 使用缓存的原因 - 多次使用 RDD 需求: 在日志文件中找到访问次数最少的 IP 和访问次数最多的 IP ...

  6. jquery 判定checkbox是否选中

    CheckBox 判定是否选中 使用 attr('checked')来做判别是不行的,除非所有的选中取消都是使用这个属性来处理. 正确的做法是使用 .prop('checked') 来判定.

  7. GCC 升级

    1.下载源码 wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz 2.下载依赖包编译安装 GCC 需要依赖 mpc,mpfr,gmp包. ...

  8. 集成PHP应用和SOLR

    集成 PHP 应用和 Solr 搜索引擎 您的评价:          收藏该经验       你为什么需要搜索引擎?单纯数据库不够用?如果你只是创建小网站,数据库就够了.但当你创建中性或大型应用的时 ...

  9. 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ

    题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...

  10. Python学习第十九课——类的装饰器

    类的装饰器 # def deco(func): # print('==========') # return func # # # @deco #test=deco(test) # # def tes ...