问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C#中如何将Excel中的数据批量导入到sql server?

发布网友 发布时间:2022-04-07 20:37

我来回答

2个回答

懂视网 时间:2022-04-08 00:59

 第一种方法:
Insert
部分数据还ok 批量数据性能问题。
第二种方法:
sqlbulkcopy 方法 主要思想 是在客户端将数据缓存到datatable里面,然后用sqlbulkcopy 一次性将数据插入到数据库表中
方法如下:

            System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString);             //指定目标数据库的表名             bcp.DestinationTableName = "resulttable";             //建立数据源表字段和目标表中的列之间的映射             bcp.ColumnMappings.Add("sheetname", "sheetname");             bcp.ColumnMappings.Add("meters", "公里标");             bcp.ColumnMappings.Add("twista", "twista");             //写入数据库表 dt 是数据源DataTable             bcp.WriteToServer(dt);             //关闭SqlBulkCopy实例

            bcp.Close(); 
如果主键冲突会回滚插入操作,所以要么保证无冲突要么建临时表! 
第三种方法:
表值参数 tvps 需要先在sql上建立表值参数

--Create DataBase create database BulkTestDB; go use BulkTestDB; go --Create Table Create table BulkTestTable( Id int primary key, UserName nvarchar(32), Pwd varchar(16)) go --Create Table Valued CREATE TYPE BulkUdt AS TABLE   (Id int,    UserName nvarchar(32),

   Pwd varchar(16)) 

public static void TableValuedToDB(DataTable dt) {     SqlConnection sqlConn = new SqlConnection(       ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString);     const string TSqlStatement =      "insert into BulkTestTable (Id,UserName,Pwd)" +      " SELECT nc.Id, nc.UserName,nc.Pwd" +      " FROM @NewBulkTestTvp AS nc";     SqlCommand cmd = new SqlCommand(TSqlStatement, sqlConn);     SqlParameter catParam = cmd.Parameters.AddWithValue("@NewBulkTestTvp", dt);     catParam.SqlDbType = SqlDbType.Structured;     //表值参数的名字叫BulkUdt,在上面的建立测试环境的SQL中有。     catParam.TypeName = "dbo.BulkUdt";     try     {       sqlConn.Open();       if (dt != null && dt.Rows.Count != 0)       {           cmd.ExecuteNonQuery();       }     }     catch (Exception ex)     {       throw ex;     }     finally     {       sqlConn.Close();     } }


datatable序列化成json
调用jsonnet库
jsondata = JsonConvert.SerializeObject(dt, new DataTableConverter());

批量插入数据到sqlserver

标签:

热心网友 时间:2022-04-07 22:07

1.本文实现在c#中可高效的将excel数据导入到sqlserver数据库中,很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,最好的办法是使用bcp,也就是System.Data.SqlClient.SqlBulkCopy 类来实现。不但速度快,而且代码简单,下面测试代码导入一个6万多条数据的sheet,包括读取(全部读取比较慢)在我的开发环境中只需要10秒左右,而真正的导入过程只需要4.5秒。
2.代码如下:
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//测试,将excel中的sheet1导入到sqlserver中
string connString = "server=localhost;uid=sa;pwd=sqlgis;database=master";
System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();
if (fd.ShowDialog() == DialogResult.OK)
{
TransferData(fd.FileName, "sheet1", connString);
}
}

public void TransferData(string excelFile, string sheetName, string connectionString)
{
DataSet ds = new DataSet();
try
{
//获取全部数据
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
string strExcel = "";
OleDbDataAdapter myCommand = null;
strExcel = string.Format("select * from [{0}$]", sheetName);
myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds, sheetName);

//如果目标表不存在则创建
string strSql = string.Format("if object_id('{0}') is null create table {0}(", sheetName);
foreach (System.Data.DataColumn c in ds.Tables[0].Columns)
{
strSql += string.Format("[{0}] varchar(255),", c.ColumnName);
}
strSql = strSql.Trim(',') + ")";

using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))
{
sqlconn.Open();
System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();
command.CommandText = strSql;
command.ExecuteNonQuery();
sqlconn.Close();
}
//用bcp导入数据
using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))
{
bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
bcp.BatchSize = 100;//每次传输的行数
bcp.NotifyAfter = 100;//进度提示的行数
bcp.DestinationTableName = sheetName;//目标表
bcp.WriteToServer(ds.Tables[0]);
}
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}

//进度显示
void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)
{
this.Text = e.RowsCopied.ToString();
this.Update();
}
}
}
3.上面的TransferData基本可以直接使用,如果要考虑周全的话,可以用oledb来获取excel的表结构,并且加入ColumnMappings来设置对照字段,这样效果就完全可以做到和sqlserver的dts相同的效果了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 十大元帅分别有谁(包括排名),职务各是什么? 超燃冲压发动机可以在哪些领域应用 类似超燃冲压发动机或者脉冲发动机甚至喷气式发动机产生足够强大推进力使战机突破大气层后进行无动力巡航 中央文明委主任 跟中纪委书记 哪个大 有谁知道超燃冲压发动机和脉冲爆震发动机? 脉冲爆震和超燃冲压哪个更有发展潜力 超燃冲压发动机是什么? 中国又能力制造超燃冲压发动机吗 超燃冲压发动机为什么会有动力 超燃冲压发动机和亚燃冲压发动机的区别 “月结”是什么意思?比如月结60天是怎样个付款方式呢? 支付方式月结是什么意思? 苹果手机为什么有些wifi搜索不到就是为什么苹果手机搜索不到Wi-Fi王子... 电焊机工作原理的线路介绍 湖南永州江华的经纬度的多少? 中国湖南耒阳坛下经纬度是多少? 湖南省花垣县经纬度是多少? 谁帮我查下出生经度纬度,湖南省邵阳市塘田市镇 湖南省永州市冷水滩三公里的经纬度 湖南省平江县经纬度 我国超燃冲压发动机将军用,一旦军用飞机会变成怎样 中央政治局候补委员和副总理谁排名在前? 中国什么时候能造出使用超燃冲压发动机的武器? 变循环发动机的推力比高吗?超然冲压发动机呢? 谁知道官员级别排名啊?例如正局级,厅级等等 x-43a和x-37b有什么区别?~ 国家公务员级别排行从高到低 中国超燃冲压发动机技术如何? 为何冲压发动机不用于飞机 超然冲压发动机是如何吸入气体,它并没有像涡扇发动机的风扇 超燃冲压引擎和冲压引擎的区别? 超燃冲压发动机是什么原理 债务重组是会计行为还是非会计行为? IP地址后面的数字是什么 我今天化妆了,可是没带洗面奶,怎么样才能把脸洗干净啊 IP地址192.168.1.0代表()。 女生说我化妆了我怎么回? 请教下,新会计准则规定的债务重组收益应当直接计入当前损益是否合理?为什么? 我今天化妆口红很重 我男朋友说我涂的太红了 他不想我化妆为什么? 债务重组-延长还款期限算不算实质让步