当前位置: 首页 > 编程笔记 >

将excel高效导入sqlserver的可行方法

常波
2023-03-14
本文向大家介绍将excel高效导入sqlserver的可行方法,包括了将excel高效导入sqlserver的可行方法的使用技巧和注意事项,需要的朋友参考一下

大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了。很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClient.SqlBulkCopy 对于新手来说还是比较陌生的,这个就是传说中效率极高的bcp,6万多数据从excel导入到sql只需要4.5秒。

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(); 
} 


} 
} 

上面的TransferData基本可以直接使用,如果要考虑周全的话,可以用oledb来获取excel的表结构,并且加入ColumnMappings来设置对照字段,这样效果就完全可以做到和sqlserver的dts相同的效果了。

 类似资料:
  • 问题内容: 如何在不使用导入向导的情况下使用sql查询将Excel文件导入到sqlserver2008 Express Edition中的新表中 谢谢普拉迪 问题答案: 有一个Microsoft知识库文章,列出了所有可能的方法。 http://support.microsoft.com/kb/321686 我认为,使用或将是没有向导的最简单方法。(请参阅分布式查询) 请参阅OPENROWSET文档

  • 问题内容: 我是Sql的新手,但是将excel文档中的1000多个行插入到我的数据库中的最佳方法是什么(Sql Server2008。) 例如,我正在使用以下查询: 这很好用,但是插入1000条记录是有限制的,我有19000条记录,我真的不想做19条单独的插入语句,还有另一个问题,那就是公司ID总是相同的,那么有没有更好的方法呢写了19000次吗? 问题答案: Microsoft提供了带有SQL

  • 本文向大家介绍Asp.Net使用Npoi导入导出Excel的方法,包括了Asp.Net使用Npoi导入导出Excel的方法的使用技巧和注意事项,需要的朋友参考一下 asp.net针对Excel文件的导入与导出是非常常见的功能之一。本文实例讲述了Asp.Net使用Npoi导入导出Excel的方法。分享给大家供大家参考之用。具体方法如下: 在使用Npoi导出Excel的时候,服务器可以不装任何offi

  • 我使用apache poi将数据从excel读取到mysql表。我用excel表格做了这个,有两个字段。我的代码是这样的, 然后将数据放在arraylist上。ten将其插入数据库。。但是现在我需要系统来获取具有可变克隆数的excel文件。我能做到吗?我只是急需帮助。因此,请帮助我一些想法和可能的一些代码。 先谢谢你,苏吉

  • 本文向大家介绍thinkPHP实现将excel导入到数据库中的方法,包括了thinkPHP实现将excel导入到数据库中的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了thinkPHP实现将excel导入到数据库中的方法。分享给大家供大家参考,具体如下: PHPExcel插件可点击此处本站下载。 这里使用的是thinkphp框架的3.1版本,下载好压缩包,框架中的extend中的ve

  • 问题内容: 一些方法可以做到这一点: 阅读整个CSV,然后使用 以某种方式反转文件(对大文件执行此操作的最佳方法是什么?),然后使用参数读取 以某种方式在CSV中找到行数,然后使用并读取所需的行数。 也许做块读取丢弃初始块(尽管不确定如何工作) 可以用更简单的方法吗?如果没有,那三者中哪一个更受欢迎?为什么? 问题答案: 我不认为熊猫会提供一种方法来实现这一目标。 也许最整洁(一次通过)是使用: