由于工作需要,我需要
①将十多万的数据从第一个Excel(客户提供)导入到第二个Excel,主要是对客户提供的数据进行格式化及组合其它信息
②再将第二个Excel的数据导入到SQL Server数据库
我把这些工作做成了一个工具,用的C#,但是结果发现第①步效率非常低,在使用OleDb往Excel导数据的时候只能一条一条Insert,好像是Excel OleDb只能一次插入一条,我试过批量插入,但始终没有成功,只能一条一条循环插入:cmd.CommandText = " insert into [" + strSheetName + "$](" + columnNames + ") select '" + model.cityId + "','" + model.countyId + "','" + model.schoolId + "','" + model.classId + "','" + model.jiebId + "','" + model.id + "','" + model.name + "','" + model.zbm + "' ";
cmd.ExecuteNonQuery();第②步我用的是循环组合SQL语句,每500条执行一次,效率倒也不会太低,但是也是很低的。
请问各位,有没有高效率的方法推荐一下,万分感谢。
①将十多万的数据从第一个Excel(客户提供)导入到第二个Excel,主要是对客户提供的数据进行格式化及组合其它信息
②再将第二个Excel的数据导入到SQL Server数据库
我把这些工作做成了一个工具,用的C#,但是结果发现第①步效率非常低,在使用OleDb往Excel导数据的时候只能一条一条Insert,好像是Excel OleDb只能一次插入一条,我试过批量插入,但始终没有成功,只能一条一条循环插入:cmd.CommandText = " insert into [" + strSheetName + "$](" + columnNames + ") select '" + model.cityId + "','" + model.countyId + "','" + model.schoolId + "','" + model.classId + "','" + model.jiebId + "','" + model.id + "','" + model.name + "','" + model.zbm + "' ";
cmd.ExecuteNonQuery();第②步我用的是循环组合SQL语句,每500条执行一次,效率倒也不会太低,但是也是很低的。
请问各位,有没有高效率的方法推荐一下,万分感谢。
解决方案 »
- 问一下想获取验证码的图片怎么获取?
- C#写个数据监视功能,类似CommView软件的功能,谁知道啊? 没分了:(
- 查找字符或字符串的问题。进来我的代码哪里错了,简短的。
- vs2008中,从哪里进行注册水晶报表啊。C#水晶报表api编程用。
- C#获取文本框输入的值``````
- 菜鸟请教
- 在c#中执行插入access时语句出错,但是在access中执行不出错,是什么问题?代码是这样的
- 给图片加上边框(求解)
- 请教高手关于用C#写的com组件向C#的另一个程序发送事件的问题!
- 如何用Repeater控件实现分层循环效果
- c#可以实现得到剪贴板的文件路径吗?
- C# 串口中断不能理想触发,触发时字节数不够的问题。
例如:
exec master..xp_cmdshell 'bcp "select top 10 * from rw_dbs_cz..rmstpar" queryout c:\rmstpar.xls -w -S magickerr -U "sa" -P "strong"'BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据。BCP可以将数据库的表或视图直接导出,也能通过SELECT FROM语句对表或视图进行过滤后导出。在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中。下面将详细讨论如何利用BCP导入导出数据。1. BCP的主要参数介绍BCP共有四个动作可以选择。
(1) 导入。
这个动作使用in命令完成,后面跟需要导入的文件名。
(2) 导出。
这个动作使用out命令完成,后面跟需要导出的文件名。
(3) 使用SQL语句导出。
这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。
(4) 导出格式文件。
这个动作使用format命令完成,后而跟格式文件名。下面介绍一些常用的选项:-f format_file
format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。-x
这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。-F first_row
指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。-L last_row
指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。-c
使用char类型做为存储类型,没有前缀且以"\t"做为字段分割符,以"\n"做为行分割符。-w
和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。-t field_term
指定字符分割符,默认是"\t"。-r row_term
指定行分割符,默认是"\n"。-S server_name[ \instance_name]
指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。-U login_id
指定连接SQL Sever的用户名。-P password
指定连接SQL Server的用户名密码。-T
指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。-k
指定空列使用null值插入,而不是这列的默认值。2. 如何使用BCP导出数据(1) 使用BCP导出整个表或视图。BCP AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password" --使用密码连接或BCP AdventureWorks.sales.currency out c:\currency1.txt -c -T --使用信任连接下面是上述命令执行后的输出结果Starting copy...
105 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 10 Average : (10500.00 rows per sec.)下面是currency1.txt的部分内容AED Emirati Dirham 1998-06-01 00:00:00.000
AFA Afghani 1998-06-01 00:00:00.000
... ... ...
... ... ...
ZWD Zimbabwe Dollar 1998-06-01 00:00:00.000在使用密码登录时需要将-U后的用户名和-P后的密码加上双引号。注:BCP除了可以在控制台执行外,还可以通过调用SQL Server的一个系统存储过程xp_cmdshell以SQL语句的方式运行BCP。如上述第一条命令可改写为EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password"'执行xp_cmdshell后,返回信息以表的形式输出。为了可以方便地在SQL中执行BCP,下面的命令都使用xp_cmdshell执行BCP命令。(2) 对要导出的表进行过滤。BCP不仅可以接受表名或视图名做为参数,也可以接受SQL做为参数。通过SQL语句可以对要导出的表进行过滤,然后导出过滤后的记录。EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:\currency2.txt -c -U"sa" -P"password"'BCP还可以通过简单地设置选项对导出的行进行限制。EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:\currency2.txt -F 10 -L 13 -c -U"sa" -P"password"'这条命令使用了两个参数-F 10和-L 13,表示从SELECT TOP 20 * FROM AdventureWorks.sales.currency所查出来的结果中取第10条到13条记录进行导出。3. 如何使用BCP导出格式文件BCP不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和xml格式。用户可以手工编写格式文件,也可以通过BCP命令根据表、视图自动生成格式文件。EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format1.fmt -c -T'上述命令将currency表的结构生成了一个格式文件currency_format1.fmt,下面是这个格式文件的内容。9.0
3
1 SQLCHAR 0 6 "\t" 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 "\t" 2 Name SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 24 "\r\n" 3 ModifiedDate
这个格式文件记录了这个表的字段(共3个字段)类型、长度、字符和行分割符和字段名等信息。BCP还可以通过-x选项生成xml格式的格式文件。EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format2.fmt -x -c -T'xml格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。4. 如何使用BCP导入数据BCP可以通过in命令将上面所导出的currency1.txt和currency2.txt再重新导入到数据库中,由于currency有主键,因此我们将复制一个和currency的结构完全一样的表。SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency将数据导入到currency1表中EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -T'导入数据也同样可以使用-F和-L选项来选择导入数据的记录行。EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -F 10 -L 13 -T'在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。使用普通的格式文件EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -f c:\currency_format1.fmt -T'使用xml格式的格式文件EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -x -f c:\currency_format2.fmt -T'总结BCP命令是SQL Server提供的一个快捷的数据导入导出工具。使用它不需要启动任何图形管理工具就能以高效的方式导入导出数据。当然,它也可以通过 xp_cmdshell在SQL语句中执行,通过这种方式可以将其放到客户端程序中(如delphi、c#等)运行,这也是使客户端程序具有数据导入导出功能的方法之一。
bll.Add(model);
bll是什么东东,Add方法的内容,好像这才是重点!
而且你也是循环一条一条插入吧?有没有高效一点的?
If Not Sql.ExecAdapter(SqlStr, strCN1) Then
Exit Sub
End If Ds = New DataSet
Sql.Adapter.Fill(Ds, "Tmp")
Sql.Adapter.Dispose() : Sql.Close()
Dim DesBulkOp As SqlClient.SqlBulkCopy
DesBulkOp = New SqlClient.SqlBulkCopy(strCN2, SqlClient.SqlBulkCopyOptions.UseInternalTransaction) DesBulkOp.BulkCopyTimeout = 500000000 DesBulkOp.NotifyAfter = Ds.Tables("Tmp").Rows.Count DesBulkOp.DestinationTableName = "Tmp" & ComID '可用下面的语句进行列名转换
'下面对两列进行了转换,则只插入此两列的值,其他列为空
' DesBulkOp.ColumnMappings.Add("CustomID", "ID")
' DesBulkOp.ColumnMappings.Add("CustomType", "Type") DesBulkOp.WriteToServer(Ds.Tables("Tmp"))
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "表格|*.xls";
if(ofd.ShowDialog()==DialogResult.OK)
{
string strPath1= ofd.FileName;
strPath.Text = strPath1;
string strCon = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source='" + strPath1 + "';Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
OleDbConnection Con = new OleDbConnection(strCon);//通过接口,建立连接
Con. Open();
string strSql = "select * from [Sheet1$]";//表名的写法也应注意不同,对应的excel表为sheet1,在这里要在其后加美元符号$,并用中括号
OleDbCommand Cmd = new OleDbCommand(strSql, Con);//建立要执行的命令
OleDbDataAdapter da = new OleDbDataAdapter(Cmd);//建立数据适配器
DataSet ds = new DataSet();//新建数据集,用来装读取的Excel表格里面的内容。
da.Fill(ds, "ldy");//把数据适配器中的数据读到数据集中的一个表中此处表名为ldy,可以任取表名)
//指定datagridview1的数据源为数据集ds的第一张表(也就是ldy表),也可以写ds.Table["ldy"]
dataGridView1.DataSource = ds.Tables[0]; #region
//在这里面设置处理读到的excel表中的内容。 #endregion
Con.Dispose();
ds.Dispose();
da.Dispose();
http://www.spreadsheetgear.com/my blog
http://ufo-crackerx.blog.163.com/
我想大家都有点偏题了,还是这个问题,我现在要将数据从Excel导入Excel这个问题,不讨论导SQL Server了,就是从一个Excel读取数据,然后加工后存到另一个Excel中,如何批量操作,如何提高效率?谢谢。
还有,不要怀疑我的硬件,目前我使用的是I5 460 2G,我想足够了!谢谢。
CPU:i5 460 算个伪四核吧
内存:2G 就这个有点低
Win 7评分:5.5
鲁大师评分:2696