如何实现100%的动态数据管道(二)

动态|数据

主要思路解决了,下面开始写详细设计(以Sybase ASE数据库为例,其他各位扩展):

            1.建立中间层表vdt_columns,这个表的属性用于构建管道中的列资料.

            执行类似的代码生成:

            ls_sql = "create table vdt_columns ("
            ls_sql +="uid              int             null    ,"
           ls_sql +="upkey            varchar(1)      null    ,"
           ls_sql +="udmid      int         null,"
           ls_sql +="udmname    varchar(30)   null,"
           ls_sql +="unulls           varchar(1)     null    ,"
           ls_sql +="uwidth           int       null    ,"
           ls_sql +="uscale         int         null,"
           ls_sql +="uname         varchar(30)   null,"
           ls_sql +="udefault       varchar(255)  null,"  
           ls_sql +="ucheck         varchar(255)  null,"    
           ls_sql +="uidentity        int     null"
           ls_sql +=")"
   
           EXECUTE IMMEDIATE :ls_sql using SrcSqlca;

        2.构建其他相关的可能用到中间层视图:

           系统对象视图:

            ls_sql = 'create view vdt_objects (uid,uuid,uname,utype) as'+&
               ' select id,uid,name,(case type when~'TR~' then ~'T~' else type end) from sysobjects'
              EXECUTE IMMEDIATE :ls_sql using SrcSqlca;

        系统表视图:

        ls_sql = 'create view vdt_tables (uid,uuid,uname)as'+&
               ' select id,uid,name from sysobjects where type = ~'U~''
          EXECUTE IMMEDIATE :ls_sql using SrcSqlca;

      3.初始化vdt_columns 表.

        insert vdt_columns
   select sc.id,so.name,sc.colid,'N',sc.type,
      (case when (select count(*) from systypes st where sc.type=st.type and sc.usertype=st.usertype)=0 then (select max(st.name) from systypes st where sc.type=st.type) else (select st.name from systypes st where sc.type=st.type and sc.usertype=st.usertype) end),
      'N',(case when prec is not null then isnull(sc.prec,0) else sc.length end),
      sc.scale,sc.name,substring(sy.text,9,char_length(sy.text) -8),"0",(case when sc.status=128 then 1 else 0 end)
     from syscolumns sc,sysobjects so ,syscomments sy
    where sc.id*=so.id and sc.cdefault*=sy.id
    using SrcSqlca;
    
    在Sybase中,确定主键列比较麻烦:

    declare cur_vdtcolumns cursor for
   select distinct utname from vdt_columns
   using SrcSqlca;
   
   open cur_vdtcolumns;
   
   fetch cur_vdtcolumns into :ls_utname;
   
   do while SrcSqlca.sqlcode=0
    wait(true)
    ls_nulls='';ls_pkey=''
    of_getnull_ase(ls_utname,ls_nulls)
 
    of_getpk_ase(ls_utname,ls_pkey)
    if len(ls_pkey)>0 then
     update vdt_columns
      set upkey = 'Y',unulls='N'
      where CHARINDEX(uname,:ls_pkey)>0
      and utname = :ls_utname
      using SrcSqlca;
    end if
    fetch cur_vdtcolumns into :ls_utname;
   loop
  end if

    其中of_getpk_ase()用于确定某列是否是主键.

    /*Out of date*/
Long Ll_Cnt
int Li_keycnt,Li_indexid,Li_indstat,Li_indstat2

String Ls_keys,Ls_ThisKey
int Li_i

If Not IsValid(SrcSqlca) Then return -1

Select Count(*) Into :Ll_Cnt From sysobjects Where name = :as_tablename Using SrcSqlca;
If Ll_Cnt <= 0 Then
 return -2
End if

DECLARE curs_sysindexes CURSOR FOR
 SELECT keycnt, indid, status, status2
 FROM   sysindexes
 WHERE  id = object_id(:as_tablename)   AND indid > 0 Using SrcSqlca;

OPEN curs_sysindexes ;

FETCH curs_sysindexes INTO  :Li_keycnt, :Li_indexid, :Li_indstat, :Li_indstat2;

do while (SrcSqlca.Sqlcode = 0)
 If Mod(int(Li_indstat2/2),2) = 1 Then
  
  IF Mod(int(Li_indstat/2048),2) = 1 Then  //主键
  
   Ls_Keys = ''
   Li_i = 1
   
   do while Li_i <=Li_keycnt
    Select distinct index_col(:as_tablename, :Li_indexid, :Li_i) into :Ls_ThisKey
     From vdt_columns Using SrcSqlca;
    If Isnull(Ls_ThisKey) Then
     Exit
    Else
     If Li_i > 1 Then Ls_keys += ','
     Ls_Keys += Ls_ThisKey
    End if
    Li_i ++
   loop
  End if
 End if
 FETCH curs_sysindexes INTO  :Li_keycnt, :Li_indexid, :Li_indstat, :Li_indstat2;
loop
CLOSE curs_sysindexes;

as_keys=Ls_keys
return 1

    经过以上的步骤,中间层的数据就基本获得了,根据这些数据,基本上能够无误差的传输绝大部分表.构建了中间层,为以后的不同数据库的扩展打下了一个良好的基础.

不同的数据库,构造中间层的语法各有不同,但是中间层的表(视图)的结构是一样的,这样程序中处理的方法也统一了.

    待续...

    

    

时间: 2024-12-22 16:28:58

如何实现100%的动态数据管道(二)的相关文章

如何实现100%的动态数据管道(三)

动态|数据 下面看看,如何根据中间层的数据,构建管道语法: 1.首先建立一个数据窗口对象:d_vdtcolumns SQL语法是:  SELECT vdt_columns.utid,            vdt_columns.uid,            vdt_columns.upkey,            vdt_columns.udmid,            vdt_columns.udmname,            vdt_columns.unulls,        

用asp+javascript实现动态数据联动,不刷新

javascript|动态|数据|刷新 /////////////by xxrl(孔曰成仁,孟曰取E) /////////////Chinese:蒋健华 /////////////email:jjh_115@eyou.com 联动,联动,联动....困扰了好多网友的神经,在CSDN-ASP板块中,总是看到网友们大呼救命,救什么?联动!为什么联动这样受到关注,其实用性无可非议,用户也能认可,可是如果数据是大量并相互关联的,那问题就来了,怎么识别并显示是一个很苦恼的问题.那究竟有没有一个很好的解决办

linux-Linux下怎样实现VPN数据管道?

问题描述 Linux下怎样实现VPN数据管道? 手上有A.B两台服务器,A服务器一直空着,B服务器部署有VPN服务(应该都知道在哪) 最近直连B服务器网络不是很好然后我就想通过A服务器连接到B服务器最后访问网络以保证其稳定性而不会出现200-2000这种不稳定的坑爹延迟,即本地连接A服务器然后由A服务器将数据传给B服务器然后由B服务器访问网络 问了下周围的朋友,他们说用iptunnel+iprule或者VPN+路由(C/S)的方法即可实现,但无奈,这些我都不会所以我就想问问我该怎么实现? 补充:

用ADO的COMMAND对象实现对WEB数据库动态数据查询的方法

用ADO的COMMAND对象实现对WEB数据库动态数据查询的方法★ 林碧英众所周知,由于ASP技术的出现,使得Intranet的应用更加广泛深入.相当多的企业都建立了企业内部综合查询系统,如何快速.准确地查询企业内部信息是编写基于WEB技术应用程序必须要解决的主要问题.ASP提供了用ADO内置的3个主要对象Recordset.Connection和Command对WEB数据库进行操作.其中Connection的主要功能是建立与WEB数据库的链接:Command的主要功能是向WEB数据库传送数据查

100万条数据存入mongo,通过java代码实现,要求时间在5秒之内,或者越快越好

问题描述 100万条数据存入mongo,通过java代码实现,要求时间在5秒之内,或者越快越好 通过java代码将oracle中的100万条数据查询出来,然后直接插入mongo数据库中,要求时间越短越好.我从oracle中将100万条数据查询出来花费了3秒左右.希望存入mongo的时间在5秒以内.请问各位大神有没有好的办法,谢谢. 解决方案 你可以买一个性能好一些的电脑,这样会比较快的. 解决方案二: 你把oracle查询到的数据分下类,优化时间在2秒内,存到Mongo可能会快点,最近公司也是遇

JavaScript如何获得从java程序输入的动态数据

问题描述 JavaScript如何获得从java程序输入的动态数据 JavaScript如何获得从java程序输入的动态数据.具体的格式怎么写 解决方案 在java程序中把数据保存到session里传到前台的jsp页面,然后在前台的jsp页面里用js就可以取出了 session.setAttribute("AttName",Object); 保存 session.getAttribute("AttName") 取出 解决方案二: 动态数据报表

去哪儿网面试题:对100亿行数据排序

问题描述 去哪儿网面试题:对100亿行数据排序 一个文本文件里面有100亿行无序的数据,将这些数据从小到大排列并输出前100个数据. http://www.manong1024.com/q/205 解决方案 这是典型的bitmap排序.也就是创建一个4294967296元素的数组,然后遍历这100亿数据,如果某个数据等于12,就让数组下标为12的那个元素+1,以此类推. 最后从数组0开始输出,如果这个元素对应的值是1,就输出1次,如果是2就输出2次,直到100为止. 解决方案二: 如果用bitm

极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)     实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的时间.     本实验中所用到工具为VS2008和SQL SERVER 2000.SQL SERVER 2008,分别使用5中方法将100万条数据导入SQL 2000与SQL 2008中,实验环境是DELL 2850双2.0GCPU,2G内存的服务器.感兴趣的朋友可以下载源代码自己

谢谢-如何用echarts图表获取后台json数据变成动态数据,

问题描述 如何用echarts图表获取后台json数据变成动态数据, 网站首页是用echarts图表布局的数据,但是是静态的,需要送后台获取json数据生成动态数据,新手不知道怎么搞? 解决方案 使用ajax,向后台请求获取json数据 解决方案二: http://www.w3school.com.cn/jquery/ajax_ajax.asp ajax从动态页获取到数据后再生成echarts,将数据赋值给echarts相关配置