系列文章导航:
如何将数据导入到 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日

转载于:https://www.cnblogs.com/rand/archive/2008/02/11/1067042.html

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

  1. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(五)

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

  2. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(三)

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

  3. sql compact 转mysql_如何将数据导入到 SQL Server Compact Edition 数据库中(四)

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

  4. 安装 SQL Server Compact Edition 及 与PC 数据同步的部署

    SQL Server 2005 Compact Edition 安装 SQL Server Compact Edition Microsoft SQL Server 2005 Compact Edit ...

  5. 将excel数据导入到SQL server数据库,SQL server引入导入excel报表,如何解决“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”问题

    目录 版本: 文章主要内容: 未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序 新版本不同的设置的地方: 版本: SQL server2018.ex ...

  6. sql查询oracle数据,sql-server – 从SQL Server查询Oracle数据库

    我有一个Oracle 11g XE数据库,我想将其转移到SQL Server Express 2005中. 起初我以为我只是在Oracle中生成表作为SQL,操纵数据格式,并在SQL Server中运 ...

  7. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息"is formatted to support  1 media fami ...

  8. C#将Excel数据导入到SQL server数据库

    将Excel数据导入到数据库,用winfrom系统,如图: 该系统可以选择导入的Excel文件,设置要导入的数据库的基本设置. 代码: winfrom窗体: public partial class ...

  9. 怎样将Excel中的数据导入到SQL Server 2000数据库中

    1.打开企业管理器,打开要导入数据的数据库,在表上按右键,所有任务-->导入数据,弹出DTS导入/导出向导,按 下一步 , 2.选择数据源 Microsoft Excel 97-2000,文件名 ...

最新文章

  1. 【随记】动态调用web服务
  2. TYVJ1427 小白逛公园
  3. python中的argparse包——用于解析命令行参数
  4. 说说JSON和JSONP
  5. 【POJ - 3250 】Bad Hair Day (单调栈)
  6. [转载] python学习笔记
  7. HTML学习笔记:演示HTML页面之间传递数据
  8. C语言二叉树之二叉链表
  9. Puppet Master安裝手冊(CentOS 7)
  10. SQL_Server_2008完全学习之第六章数据查询和管理
  11. matlab2c使用c++实现matlab函数系列教程-eye函数
  12. ubuntu 16.04 重装失败:进入grub出不来
  13. 【实用工具系列】MathCAD入门安装及快速上手使用教程
  14. Houdini函数表达式
  15. 面试题:Redis 40 道
  16. 视频如何转换html链接地址,视频肿么生成html代码放到自己的网页去求解答法案...
  17. 图书管理系统——用例图、类图、时序图
  18. 分段点处导数怎么求,导数和导函数的极限有关系吗?
  19. 1150 Travelling Salesman Problem (25 分)(分析题目,细节处理)
  20. 分享UG塑胶模具设计的分模方法,一起学起来

热门文章

  1. sourcetree打开快捷_Sourcetree使用:拉取打开项目的步骤
  2. python 遍历_Python手撕广度优先遍历
  3. mathtype的快捷键
  4. 如何快速切换静态和动态ip
  5. CVPR 2018 FlowTrack:《End-to-end Flow Correlation Tracking with Spatial-temporal Attention》论文笔记
  6. hdu3691(无向图最小割的求解)
  7. 小米路由器添加扩展工具_小米正式发布miVela软件平台,与各方共同合作推进物联网发展...
  8. Sitecore 9 为什么数据驱动的组织选择它
  9. maven package自己主动部署包
  10. PP生产订单成本的计划、控制和结算