`
yidongkaifa
  • 浏览: 4059386 次
文章分类
社区版块
存档分类
最新评论

如何将数据导入到 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数据库连接对象
stringsrcConnString="DataSource=bjb-libo;InitialCatalog=Northwind;UserId=sa;Password=1234;";
SqlConnectionsrcConnection
=newSqlConnection(srcConnString);

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

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

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

CREATETABLEProducts(
ProductID
intNOTNULLCONSTRAINTPK_ProductsPRIMARYKEY,
ProductName
nvarchar(40)NOTNULL,
SupplierID
intNULL,
CategoryID
intNULL,
QuantityPerUnit
nvarchar(20)NULL,
UnitPrice
moneyNULL,
UnitsInStock
smallintNULL,
UnitsOnOrder
smallintNULL,
ReorderLevel
smallintNULL,
Discontinued
bitNOTNULL
);

CREATETABLEEmployees(
EmployeeID
intNOTNULLCONSTRAINTPK_EmployeesPRIMARYKEY,
LastName
nvarchar(20)NOTNULL,
FirstName
nvarchar(10)NOTNULL,
Title
nvarchar(30)NULL,
TitleOfCourtesy
nvarchar(25)NULL,
BirthDate
datetimeNULL,
HireDate
datetimeNULL,
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
imageNULL,
Notes
ntextNULL,
ReportsTo
intNULL,
PhotoPath
nvarchar(255)NULL
);

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

publicstaticvoidVerifyDatabaseExists(stringconnectionString)
{
using(SqlCeConnectionconnection=newSqlCeConnection(connectionString))
{
if(!File.Exists(connection.Database))
{
using(SqlCeEngineengine=newSqlCeEngine(connection.ConnectionString))
{
engine.CreateDatabase();

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

SqlCeCommandcommand
=newSqlCeCommand();
command.Connection
=connection;
connection.Open();
stringquery;
for(inti=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 的端口。另外,我还没有测试过大数据量的导入,我担心会存在内存不足的问题。大家可以测试一下!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics