📄 readme.txt
字号:
大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了。很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClient.SqlBulkCopy 对于新手来说还是比较陌生的,这个就是传说中效率极高的bcp,6万多数据从excel导入到sql只需要4.5秒。
注:net2.0以上才可以使用
_________________________________________________________________________
using System.Data;
using System.Data.OleDb;
using System.Data .SqlClient;
public void TransferData(string excelFile, string sheetName, string connectionString,string sqlname,string[,] arramy2)
{
//这是一个将excel文件中的一张表的数据传送给SQL中的一样结构的表,2张表名称相同
//参数excelFile为excel文件名,sheetName为excel文件中的具体表,connectionString为SQL具体连接字符串
//arramy2是一个2维数组,如{ { "a", "b", "c", "d"}, { "a1", "a2", "a3", "a4" } }; {0,字符}表示源目标的字段名, {1,字符}表示复制数据库端的字段名
try
{
//获取全部数据存在一个dataset中
string sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
string strExcel = string.Format("select * from [{0}$]", sheetName);
OleDbCommand objCmdSelect = new OleDbCommand(strExcel, objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;
DataSet objDataset1 = new DataSet();
objAdapter1.Fill(objDataset1, "aaa");
objConn.Close();
//用bcp导入数据
SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString);
bcp.DestinationTableName = sqlname;//目标表
//源与目标的列的对应
int lensum = arramy2.Length / 2-1;
for (int i = 0; i <= lensum; i++)
{
bcp.ColumnMappings.Add(arramy2[0, i], arramy2[1, i]);
}
//导入数据到sql
bcp.WriteToServer(objDataset1.Tables["aaa"]);
//提示信息
Response.Write("导入成功");
}
catch (Exception ex)
{
Response .Write (ex.Message);
Button1.Visible = false;
}
}
_______________________________________________________________________________
上面的TransferData基本可以直接使用,如果要考虑周全的话,可以用oledb来获取excel的表结构,并且加入ColumnMappings来设置对照字段,这样效果就完全可以做到和sqlserver的dts相同的效果了。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -