|            
引言:
  无线项目开发中,项目需求要对无线的服务项目追加额外参数,所以需要解析那边的xml数据(如何获得xml数据我已经在其它的文章中写过了),然后再按照一定的规律存到本地库(无线那边提供的xml数据需要通过一定的转化过程才能得到我们想要的东西)并重新构造一个xml树型目录出来。本文便要提供一种简便的方法实现从数据库生成xml文档,进而用xslt解析成树型目录的方案。
   
  设计方案:
  一、数据库
   
  Mobile_ServiceType 服务类型   Field   DataType  Default  Description   ServiceTypeID  int  Identity  ID   ParentID  Int  0  父类型ID   MetoneServiceTypeID  Int  0  类型ID   ServiceTypeName  int  0  服务类型名称  
   
  一点说明:这个表存放的是服务类型名称及类型之间的关系的,MetoneServiceTypeID是当前信息的ID,这里没有使用ServiceTypeID 作为当前节点的ID是因为当前节点ID是不可以随便改变的,而且这个ID决定了收费标准,所以独立设定此字段的,不过从技术层面来讲设置谁为当前节点并没有什么不同,ParentID是类型的父类型ID。
  二、存储过程:
  /**********************************
  功能:根据一定条件读取类型记录
  作者:Rexsp
  创建日期:2004-03-24
  修改者:
  修改日期:
  **********************************/
  ALTER PROCEDURE GetMobileServiceType
  (   
  @Action NVARCHAR(20)='Complex',
  @ServiceTypeID INT=-1,
  @ServiceTypeName NVARCHAR(50)=null,
  @MetoneServiceTypeID INT=-1,
  @ParentID INT=-1
  )
  AS
  SET NOCOUNT ON 
  IF(@Action='Complex')
  BEGIN
  --省略N行与本篇无关的代码
  END
  IF(@Action='GetTree')
  BEGIN
         SELECT 
                MetoneServiceTypeID,
                ServiceTypeName,
                ParentID,
                URL='MobileSetting.aspx?ID='+CAST(MetoneServiceTypeID AS NVARCHAR(4)) 
                FROM  [Mobile_ServiceType] 
  END
  一点解释:存储过程有两部分,前半部分是为了一个复杂查询设计的,后面的是构建xml树设置的。这里是通过一个@Actoin变量来控制跳入哪个部分的,另外这里的代码我简化处理了,真实环境中会根据另外一个表的设置来动态生成不同的xml树的。
  三、COM层代码就列了,总体层次是三层架构,这我在专栏中也有提过。这里只给出几个相关的COM层类的接口和功能说明。
  MobileServiceTypeCollection提供各种搜索条件得出的数据集,里面有一个方法,返回一个DataSet,调用的SP就是上面提供的那个:
  /// <summary>
  /// 获取生成美类型列表相关数据
  /// </summary>
  /// <param name="dataSet">类型列表数据集</param>
  /// <returns>成功返回true,失败返回false;</returns>
  public bool GetMetoneTree(out DataSet dataSet)
  {
         //创建Adapter对象
         SqlDataAdapter dataAdapter = null;
         //创建data对象和params
         Database data = new Database("Town");
         SqlParameter[] prams ={data.MakeInParam("@Action",SqlDbType.NVarChar,20,"GetTree")};
         try
         {
                data.RunProc("GetMobileServiceType", prams, out dataAdapter);
                dataSet = new DataSet();
                dataAdapter.Fill(dataSet,"Tree");
                dataAdapter.Dispose();
                return true;
         }
         catch (Exception ex)
         {
                dataSet = null;
                Error.Log("Town", ex.ToString());
                return false;
         }
         finally
         {                          
                dataAdapter.Dispose();
                data.Close();
                data.Dispose();
         }
  }
 
   
 |