Maison > base de données > tutoriel mysql > 如何高效的将excel导入sqlserver

如何高效的将excel导入sqlserver

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2016-06-07 15:04:15
original
1037 Les gens l'ont consulté

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

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

using System;<br> using System.Data;<br> using System.Windows.Forms;<br> using System.Data.OleDb;<br> namespace WindowsApplication2<br> {<br> public partial class Form1 : Form<br> {<br> public Form1()<br> {<br> InitializeComponent();<br> }<br> <br> private void button1_Click(object sender, EventArgs e)<br> {<br> //测试,将excel中的sheet1<strong>导入</strong>到sqlserver中<br> string connString = "server=localhost;uid=sa;pwd=sqlgis;database=master";<br> System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog();<br> if (fd.ShowDialog() == DialogResult.OK)<br> {<br> TransferData(fd.FileName, "sheet1", connString);<br> }<br> }<br> <br> public void TransferData(string excelFile, string sheetName, string connectionString)<br> {<br> DataSet ds = new DataSet();<br> try<br> {<br> //获取全部数据<br> string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";<br> OleDbConnection conn = new OleDbConnection(strConn);<br> conn.Open();<br> string strExcel = "";<br> OleDbDataAdapter myCommand = null;<br> strExcel = string.Format("select * from [{0}$]", sheetName);<br> myCommand = new OleDbDataAdapter(strExcel, strConn);<br> myCommand.Fill(ds, sheetName);<br> <br> //如果目标表不存在则创建<br> string strSql = string.Format("if object_id('{0}') is null create table {0}(", sheetName);<br> foreach (System.Data.DataColumn c in ds.Tables[0].Columns)<br> {<br> strSql += string.Format("[{0}] varchar(255),", c.ColumnName);<br> }<br> strSql = strSql.Trim(',') + ")";<br> <br> using (System.Data.SqlClient.SqlConnection sqlconn = new System.Data.SqlClient.SqlConnection(connectionString))<br> {<br> sqlconn.Open();<br> System.Data.SqlClient.SqlCommand command = sqlconn.CreateCommand();<br> command.CommandText = strSql;<br> command.ExecuteNonQuery();<br> sqlconn.Close();<br> }<br> //用bcp<strong>导入</strong>数据<br> using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))<br> {<br> bcp.SqlRowsCopied += new System.Data.SqlClient.SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);<br> bcp.BatchSize = 100;//每次传输的行数<br> bcp.NotifyAfter = 100;//进度提示的行数<br> bcp.DestinationTableName = sheetName;//目标表<br> bcp.WriteToServer(ds.Tables[0]);<br> }<br> }<br> catch (Exception ex)<br> {<br> System.Windows.Forms.MessageBox.Show(ex.Message);<br> }<br> <br> }<br> <br> //进度显示<br> void bcp_SqlRowsCopied(object sender, System.Data.SqlClient.SqlRowsCopiedEventArgs e)<br> {<br> this.Text = e.RowsCopied.ToString();<br> this.Update();<br> }<br> <br> <br> }<br> }

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

本文资料整理来自:CSDN

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal