在我發表了《如何將數據導入到 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 地址訪問。
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 數據庫文件。
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 需要替換成分號(';')。
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 數據庫的方法也需要相應改動。
{
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日