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


//  创建源 SQL Server 数据库连接对象
string  srcConnString  =   " Data Source=bjb-libo;Initial Catalog=Northwind;User Id=sa;Password=1234; " ;
SqlConnection srcConnection 
=   new  SqlConnection(srcConnString);

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

//  创建目标 SQL Server Compact Edition 数据库连接对象
string  destConnString  =   " Data Source=Northwind.sdf " ;
SqlCeConnection destConnection 
=   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  (SqlCeConnection connection  =   new  SqlCeConnection(connectionString))
    {
        
if  ( ! File.Exists(connection.Database))
        {
            
using  (SqlCeEngine engine  =   new  SqlCeEngine(connection.ConnectionString))
            {
                engine.CreateDatabase();

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

                SqlCeCommand command 
=   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 的端口。另外,我还没有测试过大数据量的导入,我担心会存在内存不足的问题。大家可以测试一下!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值