将excel高效导入sqlserver的可行方法
程序员文章站
2024-03-31 11:51:10
大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了。很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,syste...
大部分人都知道用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相同的效果了。
推荐阅读
-
将excel高效导入sqlserver的可行方法
-
将Excel中数据导入到Access数据库中的方法
-
将Excel中数据导入到Access数据库中的方法
-
将excel高效导入sqlserver的可行方法
-
将excel导入sqlserver2008的表中引发的问题
-
将excel导入sqlserver2008的表中引发的问题
-
asp.net实现将Excel中多个sheet数据导入到SQLSERVER中的方法
-
(转)高效的将excel导入sqlserver中
-
phpMyAdmin下将Excel中的数据导入MySql的图文方法_MySQL
-
phpMyAdmin下将Excel中的数据导入MySql的图文方法_MySQL