SqlBurkCopy是根据各个数据库的ADO.Net驱动提供的功能,实现以最快的速度将数据插入到数据库的指定数据表中。注意,并不是所有的数据库都支持SqlBurkCopy。如果想知道当前数据源是否支持SqlBurkCopy,可以通过Database.SupportSqlBurkCopy属性来判断。
语法:
SqlBurkCopy(myDatatable, DbTableName, ColumnMapping, UseIndependentTransaction)
参数名称 | 说明 |
myDatatable | 必填项,DataTable类型,数据源DataTable对象,准备要往数据库的表中插入的数据源。 |
DbTableName | 必填项,字符串类型,指定要插入的数据表名称。 |
ColumnMapping |
可选参数,Dictionary<string, string>类型,要上传的DataTable的字段与数据库表的字段对应字典。Key为数据库字段,Value为DataTable字段。如果此参数传null的话,则默认DataTable中的字段与数据库表的字段是一一对应的。只参数只针对SQLServer数据库有用,其他数据源直接传空值。 |
UseIndependentTransaction | 可选参数,逻辑型,是否使用独立的事务。默认值为True。如果想与其他SQL一起在同一个事务中执行的话,可以使用False。 |
SqlBurkCopy(myDataReader, DbTableName,ColumnMapping,deleteOriginalData)
参数名称 | 说明 |
myDataReader | 必填项,DbDataReader类型,数据源DataReader对象,准备要往数据库的表中插入的数据源。 |
DbTableName | 必填项,字符串类型,指定要插入的数据表名称。 |
ColumnMapping |
可选参数,Dictionary<string, string>类型,要上传的DataTable的字段与数据库表的字段对应字典。Key为数据库字段,Value为DataTable字段。如果此参数传null的话,则默认DataTable中的字段与数据库表的字段是一一对应的。只参数只针对SQLServer数据库有用,其他数据源直接传空值。 |
deleteOriginalData | 可选参数,逻辑型,是否删除表中原有的数据。为了让数据保持一致,可能会用到先删除再重新新增的方式,这种方式会更高效一点。默认值为False。 |
这里强调一下,为什么要搞2个版本,主要是为了应付超大数据量的场景,比如说有几十万、几百万、上千万条数据,如果想实现两个数据库之间的相互拷贝的话,如果想通过一次性查询DataTable来处理的话,内存很快就会被干爆了。而通过DbDataReader可以一条一条从数据库取数据,然后每一万条数据就更新一批数据到目标数据表,这样就可以实现大数据量的表拷贝,而不会导致内存溢出。
Vb.Net |
Dim tbl As SmGrid=Proj.CurrentSmGrid '假设当前表中的数据全部是新增行,这时候如果用平常的保存方法,会很慢。如果我们通过SqlBurkCopy保存到数据库的话就会很快 '如果当前表中显示的绑定数据行数与当前表中所有新增行数一致,说明就是全部都是新增行 If tbl.View.ViewRows.Count=tbl.DataTableHelp.Select("","",DataViewRowState.Added).Count Then '获得当前表的数据源 Dim db As Database=tbl.DataTableHelp.Database '获得当前表的DataTable对象 Dim dt As DataTable=tbl.DataTableHelp.DataTable '获得当前表从哪个数据表中加载的 Dim strTableName As String=tbl.DataTableHelp.DataBaseTableName '当前数据源如果支持SqlBurkCopy If db.SupportSqlBurkCopy Then '直接快速拷贝数据到数据库 db.SqlBurkCopy(dt,strTableName,Nothing,True) End If End If '示例2:模拟从一个数据源拷贝数据到另外一个数据源,两个表名称表结构都一致 Dim dbDesti As Database=Proj.SysDataFactory("UserDB1") '目标数据库 Dim dbSource As Database=Proj.SysDataFactory("UserDB2") '源数据库 Dim strDataTableName As String="OrderInfo" '当前数据源如果支持SqlBurkCopy If dbDesti.SupportSqlBurkCopy Then '从数据源中获取DbDataReader对象 Dim reader As DbDataReader=dbSource.ExecuteDataReader("select * from " & strDataTableName) '快速拷贝 dbDesti.SqlBurkCopy(reader,strDataTableName) End If |
C# |
SmGrid tbl = Proj.CurrentSmGrid; // 假设当前表中的数据全部是新增行,这时候如果用平常的保存方法,会很慢。如果我们通过SqlBurkCopy保存到数据库的话就会很快 // 如果当前表中显示的绑定数据行数与当前表中所有新增行数一致,说明就是全部都是新增行 if (tbl.View.ViewRows.Count == tbl.DataTableHelp.Select("", "", DataViewRowState.Added).Count) { // 获得当前表的数据源 Database db = tbl.DataTableHelp.Database; // 获得当前表的DataTable对象 DataTable dt = tbl.DataTableHelp.DataTable; // 获得当前表从哪个数据表中加载的 string strTableName = tbl.DataTableHelp.DataBaseTableName; // 当前数据源如果支持SqlBurkCopy if (db.SupportSqlBurkCopy) { // 直接快速拷贝数据到数据库 db.SqlBurkCopy(dt, strTableName, null, true); } } // 示例2:模拟从一个数据源拷贝数据到另外一个数据源,两个表名称表结构都一致 Database dbDesti = Proj.SysDataFactory["UserDB1"]; // 目标数据库 Database dbSource = Proj.SysDataFactory["UserDB2"]; // 源数据库 string strDataTableName = "OrderInfo"; // 当前数据源如果支持SqlBurkCopy if (dbDesti.SupportSqlBurkCopy) { // 从数据源中获取DbDataReader对象 DbDataReader reader = dbSource.ExecuteDataReader("select * from " + strDataTableName); // 快速拷贝 dbDesti.SqlBurkCopy(reader, strDataTableName); } |