In SQL Server, many people concatenate SQL statements by repeating the excel data read by oledb. This is not only error-prone but also inefficient. The best way is to use bcp, that is, System. data. sqlClient. sqlBulkCopy class. Not only is it fast, but the code is simple. The following test code imports a sheet with more than 60 thousand pieces of data,
In SQL Server, many people concatenate SQL statements by repeating the excel data read by oledb. This is not only error-prone but also inefficient. The best way is to use bcp, that is, System. data. sqlClient. sqlBulkCopy class. Not only is it fast, but the code is simple. The following test code imports a sheet with more than 60 thousand pieces of data,
In SQL Server, many people concatenate SQL statements by repeating the excel data read by oledb. This is not only error-prone but also inefficient. The best way is to use bcp, that is, System. data. sqlClient. sqlBulkCopy class. Not only is the speed fast, but the code is simple. The following test code imports a sheet with more than 60 thousand pieces of data, including reading (all reading is slow). It takes about 10 seconds in my development environment, the real import process takes only 4.5 seconds.
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 button#click (object sender, EventArgs e)
{
// Test. Import Sheet 1 in excel to 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
{
// Obtain all data
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 );
// Create a table if the target table does not exist
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 ();
}
// Use bcp to import data
Using (System. Data. SqlClient. SqlBulkCopy bcp = new System. Data. SqlClient. SqlBulkCopy (connectionString ))
{
Bcp. SqlRowsCopied + = new System. Data. SqlClient. SqlRowsCopiedEventHandler (bcp_SqlRowsCopied );
Bcp. BatchSize = 100; // number of rows transmitted each time
Bcp. policyafter = 100; // number of rows prompted by the progress
Bcp. DestinationTableName = sheetName; // target table
Bcp. WriteToServer (ds. Tables [0]);
}
}
Catch (Exception ex)
{
System. Windows. Forms. MessageBox. Show (ex. Message );
}
}
// Progress display
Void bcp_SqlRowsCopied (object sender, System. Data. SqlClient. SqlRowsCopiedEventArgs e)
{
This. Text = e. RowsCopied. ToString ();
This. Update ();
}
}
}
The above TransferData can be used directly. If you need to consider it carefully, you can use oledb to obtain the excel table structure and add ColumnMappings to set the control field, in this way, you can achieve the same effect as data transmission of sqlserver.
For more information about how to obtain the excel structure, see my previous article.
Http://blog.csdn.net/jinjazz/archive/2008/05/13/2441635.aspx