当前位置: 首页 > news >正文

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

在我发表了《如何将数据导入到 SQL Server Compact Edition 数据库中》一文后,有一位读者提出这样的疑问:示例程序是否能够在 PPC 上跑,直接从远程 PC 上的 SQL Server 数据库读取数据,导入到 PPC 上的 SQL Server CE 数据库中?

事实上是可以的!!!

.NET Compact Framework 支持智能设备应用程序直接访问远程的 SQL Server 数据库,命名空间还是原来的System.Data.SqlClient。不过,System.Data.SqlClient 命名空间下的类并不在System.Data.dll 程序集中,而是封装在一个独立的程序集System.Data.SqlClient.dll 中。这个程序集和它的安装包可以在“C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Client\v2.0”目录下找到。注意,这个程序集需要独立安装,它并不包含在 .NET Compact Framework 的安装包中。



为了证实这一点,我新建了一个叫 CopyTableMobileDemo 的 Visual C# 2005 智能设备项目,添加对 System.Data.SqlServerCe.dll 和 System.Data.SqlClient.dll 的引用,并从原来的示例程序复制了主要代码过来。



接下来有代码几个地方需要稍微修改一下。

1) SQL Server 数据库连接不能使用 IntegratedSecurity=True,要使用 User Id 和 Password。Data Source 要设置成 SQL Server 服务器的 IP 地址或者计算机名称。设置成 IP 地址还是计算机名称是有区别的。如果你的 Windows Mobile 设备或仿真器是通过 ActiveSync 连接到 PC 的,那么请注意 ActiveSync 的连接设置那里,“这台计算机已连接到”选项如果选择的是单位网络,那么请使用计算机名访问,如果选择了 Internet 则使用 IP 地址访问。



// 创建源SQLServer数据库连接对象
string srcConnString = " DataSource=bjb-libo;InitialCatalog=Northwind;UserId=sa;Password=1234; " ;
SqlConnectionsrcConnection
= new SqlConnection(srcConnString);

2) SQL Server CE 数据库连接要换成智能设备的文件路径,如果 Data Source 只设置文件名,那么示例程序将会在设备的根目录下创建 SQL Server CE 数据库文件。

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

3) 由于 .NET Compact Framework 只支持 string[] string.Split(params char[] separator),那么首先 SQL Server CE 数据库创建脚本中每条命令的分隔符 GO 需要替换成分号(';')。

CREATE TABLE Products(
ProductID
int NOT NULL CONSTRAINT PK_Products PRIMARY KEY ,
ProductName
nvarchar ( 40 ) NOT NULL ,
SupplierID
int NULL ,
CategoryID
int NULL ,
QuantityPerUnit
nvarchar ( 20 ) NULL ,
UnitPrice
money NULL ,
UnitsInStock
smallint NULL ,
UnitsOnOrder
smallint NULL ,
ReorderLevel
smallint NULL ,
Discontinued
bit NOT NULL
);

CREATE TABLE Employees(
EmployeeID
int NOT NULL CONSTRAINT PK_Employees PRIMARY KEY ,
LastName
nvarchar ( 20 ) NOT NULL ,
FirstName
nvarchar ( 10 ) NOT NULL ,
Title
nvarchar ( 30 ) NULL ,
TitleOfCourtesy
nvarchar ( 25 ) NULL ,
BirthDate
datetime NULL ,
HireDate
datetime NULL ,
Address
nvarchar ( 60 ) NULL ,
City
nvarchar ( 15 ) NULL ,
Region
nvarchar ( 15 ) NULL ,
PostalCode
nvarchar ( 10 ) NULL ,
Country
nvarchar ( 15 ) NULL ,
HomePhone
nvarchar ( 24 ) NULL ,
Extension
nvarchar ( 4 ) NULL ,
Photo
image NULL ,
Notes
ntext NULL ,
ReportsTo
int NULL ,
PhotoPath
nvarchar ( 255 ) NULL
);

4) 创建 SQL Server CE 数据库的方法也需要相应改动。

public static void VerifyDatabaseExists( string connectionString)
{
using (SqlCeConnectionconnection = new SqlCeConnection(connectionString))
{
if ( ! File.Exists(connection.Database))
{
using (SqlCeEngineengine = new SqlCeEngine(connection.ConnectionString))
{
engine.CreateDatabase();

string []commands = Properties.Resources.DbSchema.Split( ';' );

SqlCeCommandcommand
= new SqlCeCommand();
command.Connection
= connection;
connection.Open();
string query;
for ( int i = 0 ;i < commands.Length;i ++ )
{
query
= commands[i].Trim();
if(!string .IsNullOrEmpty(query))
{
command.CommandText
= query;
command.ExecuteNonQuery();
}
}
}
}
}
}

其他的地方都不需要修改,让我们看看运行的效果:




总结:在 Windows Mobile 上直接将远程 SQL Server 的数据导入到 SQL Server CE 中是可行的,并且利用 CopyTable 方法可以很轻松得实现多个表的数据导入。不过从智能设备直接访问 SQL Server 数据库存在一定的局限性,它比较适合局域网环境,并且需要开放 SQL Server 的端口。另外,我还没有测试过大数据量的导入,我担心会存在内存不足的问题。大家可以测试一下!

示例代码下载: sqlce_data_import2.rar

作者:黎波
博客:http://upto.cnblogs.com/
日期:2007年8月8日

相关文章:

  • Nginx学习资料汇总
  • struts2中interceptor命名的新变化
  • Java8 之 Stream API
  • struts2的客户端验证
  • 常用Java工具包
  • 嵌套母版页中的控件访问
  • 晨猫搜集的 技术博客
  • 汇编中一个有趣的问题
  • 信号量Semaphore 的故事
  • 构造函数和继承
  • java探索之native方法源码实现
  • java6的@override注解与java5的不同之处
  • jdk版本依赖的JSR标准
  • FPGA与DSP共享外部总线问题
  • gradle使用过程遇到的一个关于out目录的问题
  • 2017前端实习生面试总结
  • CentOS7 安装JDK
  • ECMAScript6(0):ES6简明参考手册
  • javascript面向对象之创建对象
  • Java精华积累:初学者都应该搞懂的问题
  • leetcode98. Validate Binary Search Tree
  • Node项目之评分系统(二)- 数据库设计
  • react-native 安卓真机环境搭建
  • Ruby 2.x 源代码分析:扩展 概述
  • 当SetTimeout遇到了字符串
  • 动态魔术使用DBMS_SQL
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于遗传算法的优化问题求解
  • 前嗅ForeSpider教程:创建模板
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • gunicorn工作原理
  • NLPIR智能语义技术让大数据挖掘更简单
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 整理一些计算机基础知识!
  • ​【已解决】npm install​卡主不动的情况
  • ​linux启动进程的方式
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ###STL(标准模板库)
  • #Lua:Lua调用C++生成的DLL库
  • #stm32驱动外设模块总结w5500模块
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C++17) optional的使用
  • (C语言)共用体union的用法举例
  • (NSDate) 时间 (time )比较
  • (力扣题库)跳跃游戏II(c++)
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)拼包函数及网络封包的异常处理(含代码)
  • *Django中的Ajax 纯js的书写样式1
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core引入性能分析引导优化
  • .Net FrameWork总结
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态