如何將數據導入到 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(40NOT NULL,
    SupplierID 
int NULL,
    CategoryID 
int NULL,
    QuantityPerUnit 
nvarchar(20NULL,
    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(20NOT NULL,
    FirstName 
nvarchar(10NOT NULL,
    Title 
nvarchar(30NULL,
    TitleOfCourtesy 
nvarchar(25NULL,
    BirthDate 
datetime NULL,
    HireDate 
datetime NULL,
    Address 
nvarchar(60NULL,
    City 
nvarchar(15NULL,
    Region 
nvarchar(15NULL,
    PostalCode 
nvarchar(10NULL,
    Country 
nvarchar(15NULL,
    HomePhone 
nvarchar(24NULL,
    Extension 
nvarchar(4NULL,
    Photo 
image NULL,
    Notes 
ntext NULL,
    ReportsTo 
int NULL,
    PhotoPath 
nvarchar(255NULL
);

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 的端口。另外,我還沒有測試過大數據量的導入,我擔心會存在內存不足的問題。大家可以測試一下!

示例代碼下載:sqlce_data_import2.rar

作者:黎波
博客:http://upto.cnblogs.com/
日期:2007年8月8日 
發佈了96 篇原創文章 · 獲贊 1 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章