1. 程式人生 > >C#中使用SqlBulkCopy的批量插入和OracleBulkCopy的批量插入

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

strings 技術 ava ext service() catch service 目標表 num

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

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