如何在InfoPath表单中引用SQL SERVER 中的数据?

 

1 为什么要这么做,要引用后台的数据干嘛?

当你打开一个基于浏览器的表单时,表单中的一些下拉式控件,比如"商品类型","材料规格",你可能不希望读者自己输入,而希望直接从系统原有的SQL SERVER中的"商品类型表"读取。
或者,你希望完成一些"自动填写"操作,比如当输入完"客户名称"时,"客户地址"一栏就会根据系统原有数据自动填写完成。

2 基于InfoPath Form Service来引用后台数据库有什么注意的?

基于网页的表单,根据SDK文档,你只能引用“只读”而不是提交的数据。也就是说,如果你想把表单直接回填到数据库,你不能直接通过Infopath的无代码设计,必须做Event Handler、工作流、或是改用InfoPath方式。

3 这个过程InfoPath Form Service做了一个什么事情?

当用户打开这个表单的时候,InfoPath Form Service服务器自己,会以当前用户身份,登录SQL 服务器,用SQL把数据取回来。然后通过浏览器呈给使用者。

自己:这很重要,因为这表明,当打开InfoPath的表单时,是服务器自己去读数据,而不是使用IE客户端。

当前用户身份:这更重要,因为你需要手动在SQL SERVER,数据库下的“安全”“用户”里面,建立一个以“使用者名称”为登录名的用户,并给这个用户Sys_DataReader的架构和权限。

*我就是因为没有意识到这个问题,在用Admin调试完了后,交给用户使用而不成功,白白浪费了一个上午。

4 额外做的一个些事情:

需要调整网站结构,“网站所有内容”->“新建”->“数据连接库”

如上所说,进入SQL SERVER,把将来使用该表单的用户加入数据库的,并赋于读取权限。

做这个事情主要是为了存储,SQL的连接文件。

5 主要步骤:

“工具”->“数据连接”->“添加”->数据连接向导中选“新建连接”下的“仅接受数据”点击“下一步”->选“数据库(仅SQL Server)”->点“选择数据库”按钮->会弹出“选取数据源”,你可以“新建一个SQL连接”,然后会弹出一个数据连接向导,你如提示建立好一个SQL连接并且要“连接到指定表格”(步骤省略),完成这些后你的“数据源”除了“主”会多一个“辅助数据源”,名称就是你刚才建立连接设定的名称。

重要的一步,做好这些后,进入“数据连接库”(名称你建立的时候任意命名),在你的电脑上“我的文档”下有一个“我的数据源”下面有你刚才通过InfoPath建立的这个数据连接文件一般是ODC扩展名。把这个文件上传到库里。

然后:在“工具”->“数据连接”->选中你的那个SQL数据源,点击“转换...”,在对话框中可以指定那个数据连接文件,请点击“浏览”,选中你的SharePoint数据连接库中的那个上传的文件。

很重要的一步: 进入那个数据连接库,把库中的一个以Odc和一个udcx为扩展名的文件(转换时生成的)全部设置为“批准”

6 如何把数据连到控件上:

以列表为例:双击列表控件,在“数据”选项卡上,选择“从外部数据源查找数据”,下面依提示选择好。就OK拉。

还可以使用“规则”,比如在“用户号”一栏使用“赋值”规则, 来完成“用户名”的自动填写:

当用户号更改时,
把辅助数据源的“用户名”字段值赋值给“用户名”文本框域
筛选条件是:辅助数据源的“用户号”字段值=“用户号”文本框。


7 按正常程序发布到InfoPath表单库里就OK拉。

http://www.cnblogs.com/dosboy/archive/2007/06/24/794027.html

 

本节的内容:

如何在InfoPath中使用数据连接来从SQL Server数据库中获取数据

如何通过代码来修改数据连接中的SQL查询

在开始设计InfoPath表单之前,先准备一个数据库,InfoPath支持两种数据库连接:

Microsoft Office Access数据库(.mdb文件或.accdb文件)

Microsoft SQL Server数据库

需要注意的是,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 ONGO
SET QUOTED_IDENTIFIER ONGO
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.cnblogs.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'Terry Lee', N'http://terrylee.cnblogs.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'AnyTao', N'http://anytao.cnblogs.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'Anders Liu', N'http://andersliu.cnblogs.com')/
INSERT [dbo].[blogs] ([name], [blog]) VALUES (N'Kaneboy', N'http://blog.joycode.com/kaneboy')
 

 

接着为InfoPath表单添加此数据连接,方法如下:

在“数据源”面板中点击“管理数据连接”;

在弹出的“数据连接”对话框中点击“添加”;

在弹出的“数据连接向导”对话框中选择“新建连接”和“仅接收数据”,点击“下一步”;

选择“数据库(仅Microsfot SQL Server 或 Microsoft Office Access)”作为数据源,点击“下一步”;

点击“选择数据库”,在弹出的“选择数据源”对话框中选中“+新 SQLServer 连接”,点击“打开”;

输入服务器名称和验证信息,点击“下一步”;

选择“TestDB”,取消勾选“连接到指定表格”,点击“下一步”;

输入文件名(或保留默认值),点击“完成”;

点击“编辑SQL”,在弹出的“编辑SQL”对话框中输入以下SQL查询字符串:

select distinct blog from blogs where name='WindieChai'

点击“测试SQL语句”,显示测试成功后,点击“确定”关闭此对话框;

输入名称“blogs”,勾选“在打开表单时自动检索数据”,点击“完成”。

此时在打开“数据源”面板,将数据源切换为刚才创建“blogs(辅助)”,会看到InfoPath已经导入了SQL查询所返回的架构。

 

接下来我们添加一个超链接控件并绑定到item及其子元素上,藉此来显示所有的相册,方法如下:

在“数据源”面板中,点击最底层的blog元素旁的下箭头按钮,在其上下文菜单中选择【其他】;

在弹出的“选择控件”对话框中选择“超链接”,点击“确定”,这会在mainifest.xsf文件的设计界面中添加一个用于显示blog地址的超链接控件,并且该控件绑定到了查询结果的blog字段上。

然后回到mainifest.xsf文件的设计界面中,简单的调整一下控件的尺寸,添加一行描述文字,使其看起来如下图所示:

 


然后按F5键运行,可以看到InfoPath已经正确查询了数据库并且显示出了我的blog地址:

 

 

 

虽然本示例只是绑定了一个字段而已,但完全可以将查询得到的一组数据绑定到可重复的控件上,而且这也并不难实现。具体步骤如下:

在“数据源”面板中,按照之前添加blogs数据连接的方法添加名为bloggers的数据连接,该数据连接除了名称和SQL查询字符串之外,其余设置均和blogs数据连接相同,它的SQL查询字符串是:

select name from blogs

在“数据源”面板中,编辑blogs数据连接,取消勾选“在打开表单时自动检索数据”;

在“工具箱”中拖放一个“下拉列表框”控件到mainifest.xsf设计界面中;

在刚才拖放的下拉列表框控件上点击右键,选择【“下拉列表框”属性】;

在弹出的“下拉列表框属性”对话框中,找到“列表框项”区域,选择“从外部数据源查找值”;

在“数据源”中选择bloggers;

点击“项”右侧的“选择XPath”按钮,在弹出的“选择域或组”对话框中选中最底层的name字段;点击“确定”;

点击“确定”来关闭“下拉列表框属性”对话框。

简单地调整一下版式,使其看起来如下图所示: 


按F5键运行,可以看到InfoPath已经正确查询了数据库并且在下拉列表框中列出了数据库中的bloggers:


 

下面我们来编写几行代码,让这个表单可以从SQL Server中筛选数据。

然后右键单击下拉列表框,选择【编程】【Changed事件】,这会在FormCode.cs中生成一个field2_Changed方法(你的方法名称或许会和我的稍有不同)。

在field2_Changed方法的代码如下:

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();       
 }

下面简单地解释一下这段代码:

首先获取辅助数据源blogs的QueryConnection,并将它转换为实际类型AdoQueryConnection,AdoQueryConnection是数据库型数据源的数据连接类型。

接着结合XmlEventArgs类型参数的NewValue属性来为该AdoQueryConnection生成新的Command。

最后调用AdoQueryConnection的Execute方法执行数据源,来重新获取辅助数据源中的数据。

仍然按F5来预览效果,表单打开后,下拉列表框中便列出了数据库中的几位bloggers,在其中选择了Kaneboy之后,就会显示出他的blog地址。最终效果如下:

 


本文配套源码


本文来自:http://www.bianceng.cn/Office/soft/201001/14498_5.htm

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值