设为首页 收藏本站
查看: 752|回复: 0

[经验分享] InfoPath开发实战(3):获取SQL Server中的数据

[复制链接]

尚未签到

发表于 2015-6-27 20:50:49 | 显示全部楼层 |阅读模式
  本节的内容:

  • 如何在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 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表单添加此数据连接,方法如下:

  • 在“数据源”面板中点击“管理数据连接”;
  • 在弹出的“数据连接”对话框中点击“添加”;
  • 在弹出的“数据连接向导”对话框中选择“新建连接”和“仅接收数据”,点击“下一步”;
  • 选择“数据库(仅Microsfot SQL Server 或 Microsoft Office Access)”作为数据源,点击“下一步”;
  • 点击“选择数据库”,在弹出的“选择数据源”对话框中选中“+新 SQLServer 连接”,点击“打开”;
  • 输入服务器名称和验证信息,点击“下一步”;
  • 选择“TestDB”,取消勾选“连接到指定表格”,点击“下一步”;
  • 输入文件名(或保留默认值),点击“完成”;
  • 点击“编辑SQL”,在弹出的“编辑SQL”对话框中输入以下SQL查询字符串:

    select distinct blog from blogs where name = 'Windie Chai'
  • 点击“测试SQL语句”,显示测试成功后,点击“确定”关闭此对话框;
  • 输入名称“blogs”,勾选“在打开表单时自动检索数据”,点击“完成”。
  此时在打开“数据源”面板,将数据源切换为刚才创建“blogs(辅助)”,会看到InfoPath已经导入了SQL查询所返回的架构。
DSC0000.png   
  接下来我们添加一个超链接控件并绑定到item及其子元素上,藉此来显示所有的相册,方法如下:

  • 在“数据源”面板中,点击最底层的blog元素旁的下箭头按钮,在其上下文菜单中选择【其他】;
  • 在弹出的“选择控件”对话框中选择“超链接”,点击“确定”,这会在mainifest.xsf文件的设计界面中添加一个用于显示blog地址的超链接控件,并且该控件绑定到了查询结果的blog字段上。
  然后回到mainifest.xsf文件的设计界面中,简单的调整一下控件的尺寸,添加一行描述文字,使其看起来如下图所示:
DSC0001.png
  然后按F5键运行,可以看到InfoPath已经正确查询了数据库并且显示出了我的blog地址:
DSC0002.png
  虽然本示例只是绑定了一个字段而已,但完全可以将查询得到的一组数据绑定到可重复的控件上,而且这也并不难实现。具体步骤如下:

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

    select name from blogs
  • 在“数据源”面板中,编辑blogs数据连接,取消勾选“在打开表单时自动检索数据”;
  • 在“工具箱”中拖放一个“下拉列表框”控件到mainifest.xsf设计界面中;
  • 在刚才拖放的下拉列表框控件上点击右键,选择【“下拉列表框”属性】;
  • 在弹出的“下拉列表框属性”对话框中,找到“列表框项”区域,选择“从外部数据源查找值”;
  • 在“数据源”中选择bloggers;
  • 点击“项”右侧的“选择XPath”按钮,在弹出的“选择域或组”对话框中选中最底层的name字段;点击“确定”;
  • 点击“确定”来关闭“下拉列表框属性”对话框。
  简单地调整一下版式,使其看起来如下图所示:  
DSC0003.png    
  按F5键运行,可以看到InfoPath已经正确查询了数据库并且在下拉列表框中列出了数据库中的bloggers:
DSC0004.png
  下面我们来编写几行代码,让这个表单可以从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地址。最终效果如下:

  示例源码:点击下载

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81076-1-1.html 上篇帖子: [SQL Server] 《Microsoft SQL Server 2005技术内幕》系列丛书 下篇帖子: SQL Server遍历表中记录的2种方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表