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 ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ACT_TEST_XML_ADD]
(
@XMBH nvarchar(50),
@QT xml,
@return_value int output,
@return_msg nvarchar(50) output,
@result nvarchar(100) output
)
AS
BEGIN
insert 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 ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ACT_TEST_XML_CX]
(
@XMBH nvarchar(50),
@return_value int output,
@return_msg nvarchar(50) output
)
AS
BEGIN
declare @result NVARCHAR(MAX),@idoc int,@doc xml,@zd NVARCHAR(MAX)
SET @result=''
SET @zd=''
select @doc=QT from T_TEST_XML where XMBH=@XMBH
SELECT @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])) a
SET @result='{'+@result+'}'
SELECT XMBH,result=@result from T_TEST_XML where XMBH=@XMBH
set @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上的字段。