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

时间:2024-04-15 19:03:52

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项目

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

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 = ; i < ; i++) {
//为datarow的行的列赋值
DataRow row = dt.NewRow();
row["stuId"] = (i+);
row["stuName"] = "学生"+ (i+);
row["stuAddress"] = "不详"+(i+);
//添加到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 = ; i < ; i++)
{
//为datarow的行的列赋值
DataRow row = dt.NewRow();
row["STUID"] = (i + );
row["STUNAME"] = "学生" + (i + );
row["STUADDRESS"] = "不详" + (i + );
//添加到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页面效果

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

2)sql数据表效果

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

3)oracle数据表效果

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

4、demo源码下载地址:

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

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