JCFXBL平台客户端XML数据的存储与查询

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、  查询SQLXML字段中对应的值

当我们从数据库中查询出对应的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上的字段。

 

 

 

 


 

posted @ 2012-08-07 08:16  陕北蜂农  阅读(240)  评论(0编辑  收藏  举报