如何将数据导入到 SQL Server Compact Edition 数据库中(四)

系列文章导航:
如何将数据导入到 SQL Server Compact Edition 数据库中(一)
如何将数据导入到 SQL Server Compact Edition 数据库中(二)
如何将数据导入到 SQL Server Compact Edition 数据库中(三)

摘要:在本系列文章的第一篇和第二篇为了提高数据写入的性能,我使用了 SqlCeResultSet 基于表的数据写入方式,而不是使用常规的 Insert 语句。使用 SqlCeResultSet 写入数据确实方便又快速,但是必须保证从源数据库查询的结果集(通过 Select 查询语句)跟目标数据库(SQL Server Compact Edition)表的字段先后顺序一致。如果不一致,可能会导致数据导入出错;即便是导入成功,数据跟原来的字段位置也对不上。所以,我觉得有必要给大家介绍常规的 Insert 语句数据插入方式,解决 SqlCeResultSet 存在的问题。

在第三篇文章中,我们学习了 IDataReader.GetSchemaTable 方法,它可以返回一个描述了 DataReader 查询结果中各列的元数据的 DataTable。在前面的文章介绍的数据导入方法中,都是使用 DataReader 从源数据库读取数据。那么从这个 DataReader 获取的 SchemaTable 信息,就可以用于生成插入数据的 Insert 语句,前提是源数据库和目标数据库的表字段名称一致,字段的先后顺序可以不一样。以下是根据 SchemaTable 生成 Insert 语句的代码:

// 通过DataReader获取SchemaTable信息
srcReader = srcCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTablescheamTable
= srcReader.GetSchemaTable();

// 生成SQLServerCompactEdition数据插入SQL语句
StringBuildersbFields = new StringBuilder();
StringBuildersbParams
= new StringBuilder();
string field,param;
DataRowschemaRow;
for ( int i = 0 ;i < scheamTable.Rows.Count;i ++ )
{
if (i != 0 )
{
sbFields.Append(
" , " );
sbParams.Append(
" , " );
}

schemaRow
= scheamTable.Rows[i];
field
= string .Format( " [{0}] " ,schemaRow[ " ColumnName " ]); // 字段名称
param = " @ " + (( string )schemaRow[ " ColumnName " ]).Replace( " " , " _ " ); // 参数名称
sbFields.Append(field);
sbParams.Append(param);
destCommand.Parameters.Add(param,
null );
}

string insertSql = string .Format( " INSERTINTO[{0}]({1})VALUES({2}) " ,destTableName,sbFields,sbParams);
destCommand.CommandText
= insertSql;

生成 Insert 语句的代码很简单,这里就不再详细说明了。准备好了 Insert 语句,就可以开始从源数据库取数据并写入目标数据库了。这里我使用了 DataReader.GetValues 方法一次性读取一整行数据,再给 Insert 命令的参数赋值。代码如下所示:

// 执行数据导入
object []values;
while (srcReader.Read())
{
values
= new object [srcReader.FieldCount];
srcReader.GetValues(values);
for ( int i = 0 ;i < values.Length;i ++ )
{
destCommand.Parameters[i].Value
= values[i];
}
destCommand.ExecuteNonQuery();
}

本文的主要内容到这里已经介绍完了,我们可以结合第三篇文章介绍的根据 SchemaTable 自动生成创建表结构的 SQL 语句的代码,在导入数据前先自动创建数据表结构。相关的代码如下:

//通过DataReader获取SchemaTable信息
srcReader=srcCommand.ExecuteReader(CommandBehavior.KeyInfo);
DataTablescheamTable=srcReader.GetSchemaTable();


// 创建SQLServerCompactEdition表结构
SqlCeCommandcommand = destConnection.CreateCommand();
command.CommandText
= GenerateTableSchemaSql(scheamTable);
command.ExecuteNonQuery();

//生成SQLServerCompactEdition数据插入SQL语句
StringBuildersbFields=newStringBuilder();
StringBuildersbParams=newStringBuilder();
......

通过遍历 SQL Server 2000 的 Northwind 数据库的每个用户表,并将每个表的数据导入到一个 SQL Server Compact Edition 数据文件 Northwind.sdf 中。代码如下所示:

// 创建源SQLServer数据库连接对象
string srcConnString = " DataSource=(local);InitialCatalog=Northwind;IntegratedSecurity=True " ;
SqlConnectionsrcConnection
= new SqlConnection(srcConnString);

// 创建目标SQLServerCompactEdition数据库连接对象
string destConnString = @" DataSource=C:\Northwind.sdf " ;
SqlCeConnectiondestConnection
= new SqlCeConnection(destConnString);

// 创建SQLServerCompactEdition数据文件
VerifyDatabaseExists(destConnString);

srcConnection.Open();
destConnection.Open();

// 复制数据
string []tableNames = GetTableNames(srcConnection);
string query;
for ( int i = 0 ;i < tableNames.Length;i ++ )
{
query
= string .Format( " SELECT*FROM[{0}] " ,tableNames[i]);
CopyTable(srcConnection,destConnection,query,tableNames[i]);
}

srcConnection.Close();
destConnection.Close();

同第二篇文章相比,本文中的 VerifyDatabaseExists 方法只创建 SQL Server Compact Edition 数据文件,不批量创建表结构,因为我们用上了“自动”的方法,不需要预先准备好创建表结构的 SQL 脚本。GetTableNames 和GenerateTableSchemaSql 方法跟第三篇文章的一样,这里不再解释。

总结:本文介绍了一种比 SqlCeResultSet 更安全的数据写入方式,并结合了第三篇文章中介绍的自动生成创建数据库表结构的 SQL 语句的方法,向大家展示了一种比较完善的 SQL Server Compact Edition 数据导入方法。在后续的文章中我会继续深入下去,提供本方案在实际应用中面临的问题的解决方法。

示例代码下载:sqlce_data_import4.rar

作者:黎波
博客:http://upto.cnblogs.com/
日期:2008年2月9日

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值