需要注意的是,InfoPath虽然支持SQL Server Express数据库,但却不支持以文件的形式连接SQL Server Express(直接连接.mdf文件),所以如果想使用SQL Server Express数据库,请将数据库文件(.mdf文件)附加到SQL Server Express中。这也就意味着,数据库无法同InfoPath一起分发,使用了SQL Server数据连接的InfoPath如果想要正常地进行查询,就必须保证客户端能够访问SQL Server数据库(无法离线查询)。使用Access数据库也需要确保客户端可以访问Access数据库。如果该Access数据库位于网络位置,则需要确保客户端可以访问该位置;如果Access数据库位于本地,那么分发InfoPath表单时就需要注意连同该数据库一起分发(这种方式可以实现离线查询)。
而查询方式上,这两种数据库都统一使用了SQL语法。
因为没有安装Office Access,所以本示例将使用SQL Server作为目标数据库。首先在SQL Server中创建一个名为TestDB的数据库,然后使用下面的脚本来向其中添加blogs表以及其内容:
/****** 对象: Table [dbo].[blogs] 脚本日期: 01/19/2009 13:45:22 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[blogs]') AND type in (N'U'))
DROP TABLE [dbo].[blogs]
GO
/****** 对象: Table [dbo].[blogs] 脚本日期: 01/19/2009 13:45:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[blogs]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[blogs](
[name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[blog] [nvarchar](100) COLLATE Chinese_PRC_CI_AS NULL
)
END
GO
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'Windie Chai', N'http://xiaoshatian.iyunv.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'Terry Lee', N'http://terrylee.iyunv.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'AnyTao', N'http://anytao.iyunv.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'Anders Liu', N'http://andersliu.iyunv.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'Kaneboy', N'http://blog.joycode.com/kaneboy')
接着为InfoPath表单添加此数据连接,方法如下:
public void field2_Changed(object sender, XmlEventArgs e)
{
AdoQueryConnection conn
= this.DataSources["blogs"].QueryConnection as AdoQueryConnection;
conn.Command
= string.Format("select distinct blog from blogs where name = '{0}'", e.NewValue);
conn.Execute();
}
下面简单地解释一下这段代码: