Previous topicNext topic
Help > 开发指南 > SanMuGrid平台编程 > 主要对象 > Database > 同步数据 >
SqlBurkCopy

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);
}