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引用了。

 

posted @ 2018-06-01 20:41  小小邪  阅读(2190)  评论(0编辑  收藏  举报