• [zt]如何将数据导入到 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);
    DataTable scheamTable 
    = srcReader.GetSchemaTable();

    // 生成 SQL Server Compact Edition 数据插入 SQL 语句
    StringBuilder sbFields = new StringBuilder();
    StringBuilder sbParams 
    = new StringBuilder();
    string field, param;
    DataRow schemaRow;
    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("INSERT INTO [{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);
    DataTable scheamTable = srcReader.GetSchemaTable();


    // 创建 SQL Server Compact Edition 表结构
    SqlCeCommand command = destConnection.CreateCommand();
    command.CommandText 
    = GenerateTableSchemaSql(scheamTable);
    command.ExecuteNonQuery();

    // 生成 SQL Server Compact Edition 数据插入 SQL 语句
    StringBuilder sbFields = new StringBuilder();
    StringBuilder sbParams = new StringBuilder();
    ......

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

    // 创建源 SQL Server 数据库连接对象
    string srcConnString = "Data Source=(local);Initial Catalog=Northwind;Integrated Security=True";
    SqlConnection srcConnection 
    = new SqlConnection(srcConnString);

    // 创建目标 SQL Server Compact Edition 数据库连接对象
    string destConnString = @"Data Source=C:\Northwind.sdf";
    SqlCeConnection destConnection 
    = new SqlCeConnection(destConnString);

    // 创建 SQL Server Compact Edition 数据文件
    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日

  • 相关阅读:
    查看Linux 系统串口信息
    解决:Web server failed to start. Port XXX was already in use
    SpringBoot集成WebSocket长连接实际应用详解
    EMQTT安装与使用
    mysql 分组查每组里创建时间最大的那条数据
    前端 获取本地时间,ios兼容
    SpringBoot:访问Mysql报错message from server: "Host 'XXXX' is blocked because of many connection errors
    Doker:dockercompose安装与操作
    Docker:docker安装操作InfluxDB时序数据库
    ASP.NET Core gRPC服务基础小例子
  • 原文地址:https://www.cnblogs.com/tdskee/p/1311421.html
Copyright © 2020-2023  润新知