C#中使用SqlBulkCopy的批量插入和OracleBulkCopy的批量插入

1、首先我们做一下准备工作,在sql server和oracle分别建立一个Student表

oracle中

  --创建Student表 --
  create table Student(
     stuId number not null primary key,
     stuName nvarchar2(20) not null,
     stuAddress nvarchar2(50) null
  )

sql server中

--创建Student表--
create table Student(
    stuId int not null  primary key,
    stuName varchar(20) not null,
    stuAddress varchar(50) null
)

2、创建一个模拟批量插入的demo

1)创建一个空的mvc项目

新建项目--> 模板-->Visual C# --> Web --> Asp.Net Web应用程序,创建一个StudyProject的空MVC项目

2)web.config 页面添加sqlserver 和oracle的数据库连接

在<configuration>节点下添加

 <connectionStrings>
    <add name="SqlConn" providerName="SqlServer" connectionString="Data Source=.;Initial Catalog=TestDB;User ID=sa;Password=sa" />
    <add name="OraConn" providerName="Oracle" connectionString="Data Source=ORCL;User Id=TMS21;Password=TMS21"/>
  </connectionStrings>

3)添加HomeController、HomeService及相应index页面

控制器代码

using StudyProject.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace StudyProject.Controllers
{
    public class HomeController : Controller
    {
        HomeService service = new HomeService();

        // GET: Home
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// SQLBulkCopy的批量插入
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get_MuliteAdd_SQL() {
            //调用Sql的批量新增
             string str = service.MuliteAdd_SQL();
            return str;
        }

        /// <summary>
        /// OracleBulkCopy的批量插入
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get_MuliteAdd_Oracle() {
            //调用Sql的批量新增
            string str = service.MuliteAdd_Oracle();
            return str;
        }
    }
}

Service代码

using Oracle.DataAccess.Client;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace StudyProject.Models
{
    public class HomeService
    {
        /// <summary>
        /// SqlBulkCopy的批量插入10000条数据
        /// </summary>
        /// <returns></returns>
        public string MuliteAdd_SQL() {

            //获取当前时间
            DateTime startTime = DateTime.Now;
            //获取sqlserver数据库连接字符串
            string connStr =  ConfigurationManager.ConnectionStrings["SqlConn"].ConnectionString;

            //创建DataTable表和列
            DataTable dt = new DataTable();
            dt.Columns.Add("stuId");
            dt.Columns.Add("stuName");
            dt.Columns.Add("stuAddress");

            //循环添加10000条数据
            for (int i = 0; i < 10000; i++) {
                //为datarow的行的列赋值
                DataRow row = dt.NewRow();
                row["stuId"] = (i+1);
                row["stuName"] = "学生"+ (i+1);
                row["stuAddress"] = "不详"+(i+1);
                //添加到datatable中
                dt.Rows.Add(row);
            }

            //使用sqlserver连接(默认引用了 System.Data.SQLClient)
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                //打开连接
                conn.Open();
                //使用SqlBulkCopy
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
                {
                    try
                    {
                        //插入到数据库的目标表 TbA:表名
                        bulkCopy.DestinationTableName = "Student";
                        //内存表的字段 对应数据库表的字段
                        bulkCopy.ColumnMappings.Add("stuId", "stuId");
                        bulkCopy.ColumnMappings.Add("stuName", "stuName");
                        bulkCopy.ColumnMappings.Add("stuAddress", "stuAddress");

                        bulkCopy.WriteToServer(dt);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }
                //关闭连接
                conn.Close();
            }

            //获取插入毫秒数
            TimeSpan ts = DateTime.Now.Subtract(startTime);
            //返回执行成功数量和时间数
            string msg = "一共插入" + dt.Rows.Count + "条数据,用时:" + ts.ToString();

            return msg;
        }

        /// <summary>
        /// OracleBulkCopy的批量插入10000条数据
        /// </summary>
        /// <returns></returns>
        public string MuliteAdd_Oracle() {
            //获取当前时间
            DateTime startTime = DateTime.Now;
            //获取oracle数据库连接字符串
            string connStr = ConfigurationManager.ConnectionStrings["OraConn"].ConnectionString;

            //创建DataTable表和列
            DataTable dt = new DataTable();
            dt.Columns.Add("STUID");
            dt.Columns.Add("STUNAME");
            dt.Columns.Add("STUADDRESS");

            //循环添加10000条数据
            for (int i = 0; i < 10000; i++)
            {
                //为datarow的行的列赋值
                DataRow row = dt.NewRow();
                row["STUID"] = (i + 1);
                row["STUNAME"] = "学生" + (i + 1);
                row["STUADDRESS"] = "不详" + (i + 1);
                //添加到datatable中
                dt.Rows.Add(row);
            }

            //使用oracle连接(引用orale的Oracle.DataAccess.Client)
            using (OracleConnection conn = new OracleConnection(connStr))
            {
                //打开连接
                conn.Open();
                //使用OracleBulkCopy
                using (OracleBulkCopy bulkCopy = new OracleBulkCopy(conn))
                {
                    try
                    {
                        //插入到数据库的目标表 TbA:表名
                        bulkCopy.DestinationTableName = "STUDENT";
                        //内存表的字段 对应数据库表的字段
                        bulkCopy.ColumnMappings.Add("STUID", "STUID");
                        bulkCopy.ColumnMappings.Add("STUNAME", "STUNAME");
                        bulkCopy.ColumnMappings.Add("STUADDRESS", "STUADDRESS");

                        bulkCopy.WriteToServer(dt);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }
                //关闭连接
                conn.Close();
            }

            //获取插入毫秒数
            TimeSpan ts = DateTime.Now.Subtract(startTime);
            //返回执行成功数量和时间数
            string msg = "一共插入" + dt.Rows.Count + "条数据,用时:" + ts.ToString();

            return msg;
        }
    }
}

index页面代码

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Sql和Oracle的BulkCopy 使用</title>

</head>
<script type="text/javascript" src="~/scripts/jquery-1.10.2.min.js"></script>
<script>
    var SQLBulkCopy = function () {
           //通过GET方式请求
            $.ajax({
                type: "GET",
                url: ‘Home/Get_MuliteAdd_SQL‘,
                success: function (str) {
                    console.log(str);
                    //返回信息显示
                    $(‘#SqlMessage‘).html(str);
                }
            });
        }

        var OracleBulkCopy = function () {
            //通过GET方式请求
            $.ajax({
                type: "GET",
                url: ‘Home/Get_MuliteAdd_Oracle‘,
                success: function (str) {
                    console.log(str);
                    //返回信息显示
                    $(‘#OracleMessage‘).html(str);
                }
            });
        }
</script>
<style type="text/css">

    .textarea {
        width: 300px;
        height: 100px;
        margin-top: 10px;
        font-size:18px;
    }
</style>
<body>
    <h2>Sql和Oracle的BulkCopy 使用</h2>
    <div id="sqlbulkCopy">
        <label>SQLBulkCopy的批量插入:</label>
        <input type="button" value="SQLBulkCopy批量插入" onclick="SQLBulkCopy()" /><br/>
        <textarea id="SqlMessage" class="textarea"></textarea>
    </div>
    <br />
    <div id="oraclebulkCopy">
        <label>OracleBulkCopy的批量插入:</label>
        <input type="button" value="OracleBulkCopy批量插入" onclick="OracleBulkCopy()" /><br />
        <textarea id="OracleMessage" class="textarea"></textarea>
    </div>
</body>
</html>

3、界面演示及效果

1)index页面效果

2)sql数据表效果

3)oracle数据表效果

4、demo源码下载地址:

https://pan.baidu.com/s/1lXEzHltvaGS2UKDX62ETeQ

注意:使用OracleBulkCopy需要引用Oracle.DataAccess.Client,否则找不到OracleConnect这些,而SqlBulkCopy已经默认System.Data.Client引用了。

原文地址:https://www.cnblogs.com/xielong/p/9123351.html

时间: 2024-09-30 04:56:50

C#中使用SqlBulkCopy的批量插入和OracleBulkCopy的批量插入的相关文章

C#中的SqlBulkCopy批量插入数据

在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// </summary> 4 /// <param name="connectionStr">链接字符串</param> 5 /// <param name="dataTableName">表名</param> 6 ///

在asp.net 2.0中使用SqlBulkCopy类迁移数据

在asp.net 2.0中使用SqlBulkCopy类迁移数据 (转) http://jackyrong.cnblogs.com/archive/2005/08/29/225521.html 我们经常要在一个表中将数据迁移到另一个表,当然,用的方法十分多了.在.net 2.0中,提供了一个sqlbulkcopy类,也可以实现如下的操作,下面简单介绍下.比如一个表如下CREATE TABLE Person3( PersonID int IDENTITY(1,1) PRIMARY KEY, Name

sas中的sql(6)创建表格、展现表格、插入行、删除行、规定限制条件(constriants)、处理输入错误(undo策略)、update表格、更改列

1:三种建表方式 建表只会在库中建立好表格并在日志中显示,并不会有输出. 1.1:自己定义列来建立一张空表 column-specification = column-define + column-constriants + MESSAGE=/MSGTYPE SAS中数据的存储方式只有两种,一种char(n)一种num.sas也支持sql原生的数据类型,但是最终都会统一转化为这两种 proc sql; create table work.departments (Dept varchar(20

php中对MYSQL操作之批量执行,与获取批量结果

<?php //批量执行,与获取结果 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名"); //执行批量操作---查询,链接各个sql语句要用;隔开,推荐不要使用*,查什么写什么: $sql = "select * from 表名;"; $sql.= "select * from 表名;"; $sql.

mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问题 [CSDN博客] mysql 主从复制 双主从复制原理 防止主键重复问题(必看) [CSDN博客] replace into导致mysql自增列导致主键重复问题分析 [CSDN博客] 一个循环更新某库所有表所有非主键列的值方法(sql 2005 & mysql) [CSDN博客] mysql i

客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案

最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. 最后经过多次测试,现把解决方案分享给大家. 第一步:打开mysql中的配置文件,my.ini,看一看配置文件中 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 看是不是这样配置的.因为utf8 是国际通用的,

使用asp.net 2.0中的SqlBulkCopy类批量复制数据

介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个SqlBulkCopy类,它可以帮助你从不同的数据源复制数据到SQL SERVER数据库. 本文中我将示范SqlBulkCopy类的不同应用. 数据库设计: 这个数据库的设计还是蛮简单的,它基于Northwind数据库的Products表.另外我还在Northwind数据库中创建了3个表. 详情可以看一

c#中对批量新增数据中使用SqlBulkCopy

private void AddBulkInsert(string tableName, DataTable dt) { string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["XzyConnstring"].ToString(); using (SqlConnection destinationConnection = new SqlConnection(connec

C# SqlBulkCopy 避免插入重复数据(不重复即插入)

之前写过一篇 C# SqlBulkCopy 大量数据导入到数据库 的文章介绍了大量数据导入到数据库的高效方法. 这篇文章与之有些关联,在这之前所想的是做全量插入,每次run这个job就会清空然后插入,但是面对大量的数据,每次产生的流量是很大的,尤其是数据来自一些付费的API时,无疑增大了很多开销.所以我们只获取7天内更新的数据然后再选择未插入的数据插入到表中,对表作增量操作,由此达到控制成本的目的. 在此之前看过多篇博客都介绍了解决这个问题的方法,用到了一些零时表和触发器的知识,本人对此不胜了解