详解C#把DataTable中数据一次插入数据库的方法
作者:zhaotianff 发布时间:2024-01-17 20:23:51
标签:C#,DataTable
现在实际的情况是这样的:
客户有一台打卡机,员工打卡的信息全部储存在打卡机的Access数据库里面,现在客户引入了一种新的管理系统,需要将Access数据库中的打卡数据同步到SQL Server数据库中,由于时间比较久,数据积累了有40多万条。
软件功能:
选择Access数据库文件,填入目标SQL Server数据库的IP地址,然后开始进行同步。
实现方法:
1、先把Access数据库中要导入的数据存入DataTable中
配置文件中的数据库连接字符串
<connectionStrings>
<add name="oleConStr" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="/>
<add name="sqlConStr" connectionString ="server=tiantiankaixing;database=新建数据库;trusted_connection=sspi"/>
</connectionStrings>
封装读取Access数据库数据到DataTable中的方法
public static string OleConStr = ConfigurationManager.ConnectionStrings["oleConStr"].ConnectionString ;
public static DataTable OleGetDataTable(string sql, string filePath)
{
string a = OleConStr + filePath;
using (OleDbConnection conn = new OleDbConnection(a))
{
using (OleDbDataAdapter da = new OleDbDataAdapter(sql, conn))
{
try
{
conn.Open();
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
}
}
}
}
读取目标Access数据库到Datatable
string sql = "select Id,Time from checkinout";
DataTable dt = AcHelper.OleGetDataTable(sql, @"F:\project\tiantiankaixing\admin.mdb");
2、封装批量插入数据SQL Server数据的方法
public static void DataTableToSQLServer(DataTable dt,string connectString)
{
string connectionString = connectString;
using (SqlConnection destinationConnection = new SqlConnection(connectionString))
{
destinationConnection.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
{
try
{
bulkCopy.DestinationTableName = "checkinout";//要插入的表的表名
bulkCopy.BatchSize = dt.Rows.Count;
bulkCopy.ColumnMappings.Add("ID", "ID");//映射字段名 DataTable列名 ,数据库 对应的列名
bulkCopy.ColumnMappings.Add("TIME", "TIME");
bulkCopy.WriteToServer(dt);
System.Windows.Forms.MessageBox.Show("插入成功");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
}
}
}
}
3、调用DataTableToSQlServer()方法
string localCon = "server=tiantiankaixing;database=Test;trusted_connection=sspi";
Entity.DataTableToSQLServer(dt, localCon);
即可将DataTable中的全部数据插入数据库
附:SqlBulkCopy的简单使用方法
public void Test()
{
string connectionString = "server=tiantiankaixing;database=新建数据库;trusted_connection=sspi";
using (SqlConnection sourceConnection =
new SqlConnection(connectionString))
{
sourceConnection.Open();
//获取读取的表总行数
SqlCommand commandRowCount = new SqlCommand("select count(*) from student",sourceConnection);
long countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar());
//使用SqlDataReader读取源数据
SqlCommand commandSourceData = new SqlCommand("select * from student", sourceConnection);
SqlDataReader reader =commandSourceData.ExecuteReader();
//测试用,把数据从一个表批量插入到另一个表
//现实生活中肯定不会
using (SqlConnection destinationConnection =new SqlConnection(connectionString))
{
destinationConnection.Open();
//创建一个SQlBulkCopy对象
//指定目标表名
//指定要插入的行数
//指定对应的映射
using (SqlBulkCopy bulkCopy =new SqlBulkCopy(destinationConnection))
{
bulkCopy.DestinationTableName ="test";
bulkCopy.BatchSize = 1;
bulkCopy.ColumnMappings.Add("数据源列名","目标列名");
try
{
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
reader.Close();
}
}
}
}
}
来源:http://www.cnblogs.com/zhaotianff/p/5759260.html


猜你喜欢
- pandas列转换为字典,但将相同第一列(键)的所有值合并为一个键形式一:import pandas as pd # datadata =
- 这几天在落伍上转转,发现有朋友不太明白一些网站在会员注册时,当输入用户名后没按“确定”提交数据,系统也能马上检测该用户名是否已经存在。在此我
- 本文实例讲述了Python tkinter模块弹出窗口及传值回到主窗口操作。分享给大家供大家参考,具体如下:有些时候,我们需要使用弹出窗口,
- 在SQL Server中,提供了通过Exchange或Outlook收发邮件的扩展存储过程。下面简单地介绍一下:一、启动SQL Mail:x
- 总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对
- 问:SQL Server应该怎样访问Sybase数据库的表?答:具体方法如下:1: 安装Sybase客户端版本的要求:Sybase Clie
- 前言在pytorch中, 想删除tensor中的指定行列,原本以为有个函数或者直接把某一行赋值为[]就可以,结果发现没这么简单,因此用了一个
- python中函数定义参数有四种形式:def fun1(a,b,c): passdef fun2(a=1,b=2,c=3): &
- PyTorch最近几年可谓大火。相比于TensorFlow,PyTorch对于Python初学者更为友好,更易上手。
- pytorch 中的 state_dict 是一个简单的python的字典对象,将每一层与它的对应参数建立映射关系.(如model的每一层的
- http请求介绍HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTT
- 天猫将商品加入购物车会有一个抛物线动画,告诉用户操作成功以及购物车的位置,业务中需要用到类似的效果,记录一下实现过程备忘,先上demo&nb
- 有一道算法题题目的意思是在二维数组里找到一个峰值。要求复杂度为n。解题思路是找田字(四边和中间横竖两行)中最大值,用分治法递归下一个象限的田
- MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入
- 问题描述:在使用Vue框架开发时,在函数中改变了页面中的某个值,在函数中查看是修改成功了,但在页面中没有及时刷新改变后的值;解决:运用 th
- 1、如果同时从同一个客户端插入很多行,使用含多个 VALUE的INSERT语句同时插入几行。这比使用单行INSERT语句快(在某些情况下快几
- 你是不是觉得每次新建项目都要写一次# coding:utf-8,感觉特烦人呐!懒(fu)人(li)教程来啦,先看效果图吧中文版如图进入设置然
- 在自然语言处理过程中,全角、半角的的不一致会导致信息抽取不一致,因此需要统一。有规律(不含空格):全角字符unicode编码从65281~6
- 一:使用layer.open打开的子页面window.parent.location.reload()//刷新父页面var index =
- 当你想快速共享一个目录的时候,这是特别有用的,只需要1行代码即可实现。FTP 服务器,在此之前我都是使用Linux的vsftpd软件包来搭建