大部分人都知道用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