C#使用SqlBulkCopy快速导入Excel文件(xls/xlsx)-C/S开发框架

一、导入数据界面


二、扩展【导入关键词】按钮

按钮事件:
C# 全选
public virtual void DoImport(IButtonInfo sender)
{
var count = new frmKeywordImporter().Execute();
Msg.ShowInformation($"成功导入{count}条记录!");
}
三、ImportExcel.cs
C# 全选
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CSFrameworkV5.Library.CommonClass
{
public class ImportExcel
{
protected DbConnection _DbConnection = null;
private string _FileName = "";
private bool _IsConnected = false;
public string FileName { get { return _FileName; } }
public ImportExcel(string fileName)
{
_FileName = fileName;
if (File.Exists(fileName))
{
_DbConnection = CreateConnection();
TestConnection();
}
else
throw new Exception("文件不存在!" + fileName);
}
public int Import(string tableName, Action<DataRow> row)
{
var dt = GetData(tableName);
foreach (DataRow R in dt.Rows) row(R);
return dt.Rows.Count;
}
public bool TestConnection()
{
try
{
_IsConnected = this.GetTables().Count > 0;
//excel 格式
return _IsConnected;
}
catch
{
return false;
}
}
public DbConnection CreateConnection()
{
string conn = "";
string fileExt = Path.GetExtension(_FileName);
if (fileExt == ".xls")
{
// IMEX=1 可把混合型作为文本型读取,避免null值
//xls
conn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + _FileName + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
}
if (fileExt == ".xlsx")
{
//xlsx格式的OLEDB链接
conn = "Provider = Microsoft.ACE.OLEDB.12.0 ; Data Source =" + _FileName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
}
if (String.IsNullOrWhiteSpace(conn)) throw new Exception("不能识别的文件格式!");
return new OleDbConnection(conn);
}
/// <summary>
/// 获取Sheet数据
/// </summary>
/// <returns></returns>
public virtual DataTable GetData(string tableName)
{
string sql = "SELECT * FROM [" + tableName + "] ";
return this.GetDataBySQL(sql);
}
public DataTable GetDataBySQL(string sql)
{
DataTable dt = null;
try
{
if (_DbConnection.State == ConnectionState.Closed) _DbConnection.Open();
OleDbCommand cmd = _DbConnection.CreateCommand() as OleDbCommand;
cmd.CommandText = sql;
dt = new DataTable();
DbDataAdapter adp = new OleDbDataAdapter(cmd);
adp.Fill(dt);
}
finally
{
if (_DbConnection.State != ConnectionState.Closed) _DbConnection.Close();
}
return dt;
}
public void CloseConnection()
{
//
}
/// <summary>
/// 取XLS文件所有表名(SHEET)
/// </summary>
/// <returns></returns>
public List<string> GetTables()
{
List<string> list = new List<string>();
try
{
if (_DbConnection.State == ConnectionState.Closed) _DbConnection.Open();
DataTable dt = _DbConnection.GetSchema("Tables");
foreach (DataRow row in dt.Rows)
{
if ((row[3].ToString() == "TABLE") || (row[3].ToString() == "BASE TABLE"))
list.Add(row[2].ToString());
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (_DbConnection.State != ConnectionState.Closed) _DbConnection.Close();
}
return list;
}
}
}
四、导入数据按钮事件
C# 全选
private void btnImport_Click(object sender, EventArgs e)
{
if (!File.Exists(txtExcel.Text)) return;
Assertion.AssertEditorEmpty(txtTableName, "请选择表名!", true);
try
{
btnImport.Enabled = false;
Application.DoEvents();
ImportExcel import = new ImportExcel(txtExcel.Text);
DataTable target = GetTargetTable();
string keyword = "";
import.Import(txtTableName.Text, (row) =>
{
keyword = row[1].ToStringEx().Trim();
//关键词不为空,导入记录
if (keyword != "")
{
DataRow R = target.Rows.Add();
R["CustomerCode"] = txtCustomerCode.EditValue;
R["Domain"] = txtDomain.EditValue;
R["Keyword"] = keyword;
R["IndexNo"] = ConvertEx.ToInt(row[5]);//数字类型
R["IndexType"] = "百度";
R["FlagSEO"] = row[6].ToStringEx() == "1" ? "Y" : "N";//FlagSEO=1/0/空
R["InUse"] = "Y";
R["CreationDate"] = DateTime.Now;
R["CreatedBy"] = "admin";
R["LastUpdateDate"] = DateTime.Now;
R["LastUpdatedBy"] = "admin";
}
});
long count = new bllCustomerKeywords().BulkImport(target);
_ImportCount = count;
if (count > 0)
this.Close();
else
btnImport.Enabled = true;
}
catch (Exception ex)
{
btnImport.Enabled = true;
Msg.Warning(ex.Message);
}
}
五、DAL层使用SqlBulkCopy快速导入数据
C# 全选
public long SyncRows { get; set; } = 0;
public long BulkImport(DataTable dt)
{
if (dt.Rows.Count == 0) return 0;
int batchSize = 10;//每个批次提交的数据(单个事务)
try
{
//目标数据库,连接字符串
string conn = _Database.ConnectionString;
SqlBulkCopy bulk = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default);
bulk.BatchSize = batchSize;
bulk.BulkCopyTimeout = 5 * 60;
bulk.DestinationTableName = dt.TableName;
bulk.SqlRowsCopied += Bulk_SqlRowsCopied;
bulk.NotifyAfter = 1;
bulk.WriteToServer(dt);
return this.SyncRows;
}
catch (Exception ex)
{
//计算导入成功的记录数
if (this.SyncRows > 0 && batchSize > 0)
{
if (this.SyncRows % batchSize > 0)
this.SyncRows = this.SyncRows - SyncRows % batchSize;
if (this.SyncRows == batchSize)
this.SyncRows = 0;
}
return this.SyncRows;
}
}
private void Bulk_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
SyncRows = e.RowsCopied;
}
快速开发框架
C/S架构快速开发平台-旗舰版V5.1 (2021最新版)
https://www.csframework.com/archive/csv5/1630505048.html
参考文档:
Winform框架通用导入程序,支持Excel,xls/xlsx格式|C/S开发框架
在基类窗体扩展一个通用导出Excel文件的按钮(支持导出所有表格的数据到Xlsx文件)
C# OleDbConnection读取加装Excel2003(.xls),Excel2007(.xlsx)文件
CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架
C# .NET8使用NPOI导出数据到Excel文件
ORACLE 使用 expdp 命令导出dmp数据库文件|C/S开发框架
EFCore+.NET8:使用Oracle数据库提交大图片文件需要指定BLOB类型|C/S开发框架
C# ASP.NET使用ashx一般处理程序实现上传文件功能-C/S开发框架
C#多线程使用读写锁ReaderWriterLockSlim同步写入文件-C/S开发框架
C# Excel xls文件导入程序Excel数据库通用类XlsFileDB
C# SharpMap的简单使用-C/S开发框架
OLEDB创建DbConnection连接Excel文件报错:未在本地计算机上注册ACE.OLEDB
原创文档-Winform开发框架提供通用导入Excel功能界面|C/S框架网
2022年最新数据:中国国家省市区行政区域数据库下载(Excel/SQLLite)|C/S开发框架
Winform软件开发框架使用DevExpress组件有那些优势?|软件平台
2022年最新:中国行政区域编码数据表,省市区编号xls文件下载|C#源码
Winform框架通用导入程序,支持Excel,xls/xlsx格式|C/S开发框架
在基类窗体扩展一个通用导出Excel文件的按钮(支持导出所有表格的数据到Xlsx文件)
C# OleDbConnection读取加装Excel2003(.xls),Excel2007(.xlsx)文件
CSFrameworkV6旗舰版 | 导入导出Excel文件数据开发教程|C/S开发框架
C# .NET8使用NPOI导出数据到Excel文件
ORACLE 使用 expdp 命令导出dmp数据库文件|C/S开发框架
EFCore+.NET8:使用Oracle数据库提交大图片文件需要指定BLOB类型|C/S开发框架
C# ASP.NET使用ashx一般处理程序实现上传文件功能-C/S开发框架
C#多线程使用读写锁ReaderWriterLockSlim同步写入文件-C/S开发框架
C# Excel xls文件导入程序Excel数据库通用类XlsFileDB
C# SharpMap的简单使用-C/S开发框架
OLEDB创建DbConnection连接Excel文件报错:未在本地计算机上注册ACE.OLEDB
原创文档-Winform开发框架提供通用导入Excel功能界面|C/S框架网
2022年最新数据:中国国家省市区行政区域数据库下载(Excel/SQLLite)|C/S开发框架
Winform软件开发框架使用DevExpress组件有那些优势?|软件平台
2022年最新:中国行政区域编码数据表,省市区编号xls文件下载|C#源码
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
