JCFXBL平台客户端XML数据的存储与查询
程序调试:王强、杨鹏
文档整理:杨鹏
本系列文章由ex_net(张建波)编写,转载请注明出处。
http://blog.csdn.net/ex_net/article/details/7837517
作者:张建波 邮箱: 281451020@qq.com 电话:13577062679 欢迎来电交流!
一、前提条件
1、 控件命名规范
在使用SQL XML字段存储查询功能时,需要规范要传入XML控件id,
例如:
项目编号通常我们定义它的id为”txtXMBH”,但是在本功能中,要将id设置为”Fx_XML_TXT_XMBH”。
“Fx_XML_”为本功能标准的空间前缀名。
“TXT”为控件类型。下拉框、单选框为”CMB”,多选框为”CHK”。
“XMBH”即为字段名。
2、 数据库表中字段的属性
在数据库的表中,你需要一个字段,名称任意,但是类型一定要是XML。
3、 调用相关函数
当控件命名完成后,在相关的js中执行函数getDomXmlData()并传入界面的document属性,由于函数是放在总的js文件夹下的,因此在页面中要执行parent. getDomXmlData(document)函数既可以完成XML文件的制作(详细看示例)。
4、 查询SQL中XML字段中对应的值
当我们从数据库中查询出对应的XML字段时,就可以调用setXmlValue()函数来实现对对应的控件进行赋值。注意,要传入一个window来获取界面中的控件(详细看示例)。
二、示例
(一)保存信息到XML字段
1、 制作如图所示界面
2、 将准备放入XML字段的控件id进行规范化命名
项目名称:Fx_XML_TXT_XMMC
负责人:Fx_XML_TXT_FZR
负责人性别:Fx_XML_CMB_XB
年龄:Fx_XML_TXT_NL
好人:Fx_XML_CMB_HR
坏人:Fx_XML_CMB_HR1
香蕉:Fx_XML_CHK_XJ
西瓜:Fx_XML_CHK_XG
3、建表
在数据库中建一张新表,表名为”T_TEST_XML”
4、新建存储过程、
新建一个存储过程,名为”ACT_TEST_XML_ADD”
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[ACT_TEST_XML_ADD](@XMBH nvarchar(50),@QT xml,@return_value int output, @return_msg nvarchar(50) output, @result nvarchar(100) output)ASBEGINinsert into T_TEST_XML(XMBH,QT)values(@XMBH,@QT)set @return_value=1 set @return_msg='保存成功!' set @result=''END
5、客户端代码(JavaScript)
function Save(xml){//获取传入的XML var vXMBH=Ext.getCmp('txtXMBH').getValue(); Ext.Msg.wait('正在执行操作...','Loading...'); Ext.Ajax.request({ url:"Execute.ashx?act=ACT_TEST_XML_ADD?ms=4&formId=F0201", success: function(res,opts){ var obj = Ext.util.JSON.decode(res.responseText); Ext.MessageBox.hide(); if(obj.success=='success'){ if(obj.return_value==1) { //业务层操作正常,数据库也操作正常 Ext.Msg.alert('提示','保存成功'); } else { //数据库操作有异常 Ext.MessageBox.show({ title: '警告', msg: '数据库操作异常!原因是:'+obj.return_msg, buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.WARNING}); } } else { //Ext --- BI 验重错误 Ext.MessageBox.show({ title: '错误', msg: obj.return_msg, buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.ERROR }); } }, failure: function(res,opts){ Ext.MessageBox.show({ title: '错误', msg: '服务器连接失败!', buttons: Ext.MessageBox.OK, icon: Ext.MessageBox.ERROR }); }, headers: {'my-header': 'foo'}, params: { sys_username : 'admin', //不要修改 sys_password : '123456', //不要修改 XMBH: vXMBH, QT: xml } }); }
输入相关信息,并保存后字段会保存成XML,如图:
存入表中后该行数据为:
XML字段即为:
<data> <filed id="Fx_XML_TXT_XMMC"> <value>测试项目</value> </filed> <filed id="Fx_XML_TXT_FZR"> <value>张三</value> </filed> <filed id="Fx_XML_CMB_XB"> <value>男</value> </filed> <filed id="Fx_XML_TXT_NL"> <value>25</value> </filed> <filed id="Fx_XML_CMB_HR"> <value>true</value> </filed> <filed id="Fx_XML_CMB_HR1"> <value>false</value> </filed> <filed id="Fx_XML_CHK_XJ"> <value>true</value> </filed> <filed id="Fx_XML_CHK_XG"> <value>false</value> </filed> <filed id="Fx_XML_TXT_XX"> <value /> </filed></data>
(二)从XML字段取出相应的字段信息
1、新建查询存储过程
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[ACT_TEST_XML_CX](@XMBH nvarchar(50),@return_value int output, @return_msg nvarchar(50) output)ASBEGINdeclare @result NVARCHAR(MAX),@idoc int,@doc xml,@zd NVARCHAR(MAX)SET @result=''SET @zd=''select @doc=QT from T_TEST_XML where XMBH=@XMBHSELECT @result=@result+(case when len(@result)>0 then ',' else @result end) +id+':'''+value+'''' from(Select b.value('@id','nvarchar(100)') id , b.value('value[1]','nvarchar(100)') value FROM (select*from T_TEST_XML where XMBH=@XMBH)b CROSS APPLY QT.nodes('/data/filed') T([b])) aSET @result='{'+@result+'}'SELECT XMBH,result=@result from T_TEST_XML where XMBH=@XMBHset @return_value=1 set @return_msg='成功!'END
2、编写查询代码(JavaScript)
function CX(){ var BH=Ext.getCmp('txtBH').getValue(); Ext.Msg.wait('正在执行操作...','Loading...'); Ext.Ajax.request({ url:'GetDbStore.ashx?act=ACT_TEST_XML_CX?ms=1&formId=F0102', success: function(res,opts){ var obj = Ext.util.JSON.decode(res.responseText); if(obj.success=='success'){ var r=obj.result; if(typeof(r[0]) == "undefined"){ alert("查无此结果!"); }else{ var re=Ext.decode(r[0].result);//取到的json Ext.getCmp('txtXMBH').setValue(r[0].XMBH); parent.setXmlValue(window,re);//取值函数 } } Ext.MessageBox.hide(); }, failure: function(res,opts){ alert('服务器连接失败!'); }, headers: { 'my-header': 'foo' }, params: {XMBH:BH} }); }
测试:
单击查询前:
单击查询后:
与保存时的信息一致,成功。
总结:
采用XML可以将客户端的多个“字段”的数据统一打包成一个“ XML 字符串 ”,然后一次性的提交(POST)到服务端,利用MS SQL 2005对XML数据的强大处理,可以减少SQL语句的编写,以及优化T-SQL程序的复杂度。
同时,由于XML数据的可扩展性,用他来保存数据,只要把结构写好。今后可以在不改动原有程序结构的基础上,随意的增加UI上的字段。