其实是设计一种规范。xml只是一种载体,写的XML规范需要能解决多表连接和动态生成SQL问题。有点思路是:在XML节点中写入SQL语句。把这个SQL语句当做一个虚表。从这个虚表中SELECT自己的想要的字段。但是SQL怎么写不知道。下面是大部分的xml;只有<rs0> </rs0> 和<union>  </union>里面怎么写SQL不知道改怎么写。下面红色的SQL语句只是大体应该这样子的。
<rs name="RS">
<rs0>
 select ID, PID, CID, DID from A left join B ON a.id=b.id where 1=1
</rs0>
 <union>
  select ID, PID, CID, DID from A left join B ON a.id=b.id where 1=1
 </union>
</rs>
<?xml version="1.0" encoding="gb2312"?>
<root>
<server name="server" Ip="232.123.3.3" instance="MSSqlserver" userid="" pwd="">
<database name="sde">
<rs name="tpm_pipe"> </rs>
<field name="ID", table="" datatype="varchar" pk="true" auto="true" num="1000", default="">
<display type="ComboBox" caption="区属"configurable="false" oftenused="true"display="false">
<!--0代表“或”出现,1代表“并”出现,2代表“或和并”全部出现,3代表什么都不出现 -->
<injectors type="1"/>
<!--0代表“等于和不等于”出现,1代表“大于、大于等于、小于、小于等于”出现,2代表上述六个全部出现  -->
<conditions type = "0">
<condition>等于<condition> 
<condition>不等于<condition>
</conditions type = "0">
<options transform="true">
  <option value="ABS">宝山区</option>
  <option value="AHK">虹口区</option>
 
</display>
</field>
<field name="ID", datatype="int" pk="true" auto="true" num="1000", default="">
<display type="textbox" caption="管道GID"configurable="false" oftenused="true"display="false">
<injector type="1" />
<conditions type = "1">
<condition>等于<condition> 
<condition>不等于<condition>
<condition>大于<condition>
<condition>大于等于<condition> 
<condition>小于<condition>
<condition>小于等于 <condition>
</conditions type = "1">
</display>
</field>
</database>
</server>
</root>

解决方案 »

  1.   

    类似的表与实体类的映射工具有不少,基本工作方式是表建好后就能生成实体类和基本数据库查询语句如select, insert, update, delete,查询和结果放到XML里。但不可能100%把查询全部生成,这是无规律可询的,因为业务逻辑会改变。写查询是不可避免的。你的想法很好,但实际中意义不大,还增加了工作量,因为在修改查询的同时,还要修改XML。试想复杂的查询你复制到XML里,还要不断调试以确保字符串要正确,是不是很累?
      

  2.   

    你是想动态的修改SQL 语句解决提取的数据的不同,但是输出的字段应该是相同的吧。
    可以看看Sql server report service  中 报表定义文件 RDL 文件,自己研究一下,就会有帮助。
      

  3.   

    其实是为了让数据库和程序分离。程序写好就不在改动。要改动搜索条件的时候。只改动XML就可以啦。XML主要可以配置动态生成的SQL语句。不管多么复杂的SQL都可以从XML中配置。。下面是最新改动的XML
    <?xml version="1.0" encoding="gb2312"?>
    <root>
    <server name="server" Ip="232.123.3.3" instance="MSSqlserver" userid="" pwd="">
    <database name="sde">
       <resultset name="" type="sql">
    <fields>
             <field name="Area_Class" table="TPM_Pipe" datatype="varchar" pk="false"      auto="true" num="1000" default=""  length="" describe="" permitempty="true"          ="false" sortrule="" formula="" precision="5" decimaldigits="0" ingseed="" ingincreasingquantity=""/>
    </fields>
    <selectsection>
    <vt name="ta">
    TPM_Pipe left join TPM_Stand_Pipe ON TPM_Pipe.GID=TPM_Stand_Pipe.GID where 1=1
    </vt>
    <condition type="and">
    ta.len>10
    </condition>
    </selectsection>
    <union>
    <tables>
     <table name="T1"/>
    </tables>
    <fmap>
    <area_class table="T2" map="area" />
    </fmap>
    <vt name="uniontable">
    from T8 left join T2 ON T8.ID=T2.ID left T3 T2.ID=T3.ID where 1=1
    </vt>
    <condition type="and">
    T2.ID>12
    </condition>
    <condition type="or">
    T8.ID=3
    </condition>
    <condition type="or">
    T8.ID in (2,3,4)
    </condition>
    </union>
    </resultset>
    <fielddisplay filed="Area_Class" type="ComboBox" caption="区属" configurable="false" oftenused="true" display="false">
    <!--0代表“等于和不等于”出现,1代表“大于、大于等于、小于、小于等于”出现,2代表上述六个全部出现  -->
    <conditions type = "0">
       <condition>等于</condition> 
       <condition>不等于</condition>
    </conditions>
    <options transform="true">
       <option value="ABS">宝山区</option>
       <option value="AHK">虹口区</option>
     </options>
    </fielddisplay>
    <fielddisplay filed="ID" type="textbox" caption="管道GID" configurable="false" oftenused="true" display="false" >
    <conditions type = "1">
    <condition>等于</condition> 
    <condition>不等于</condition>
    <condition>大于</condition>
    <condition>大于等于</condition> 
    <condition>小于</condition>
    <condition>小于等于 </condition>
    </conditions>
    </fielddisplay>
    <fielddisplay filed="installdate" type="DateTimePicker" caption="管线安装时间" configurable="false" oftenused="true" display="false">
    <conditions type = "1">
    <condition>等于</condition> 
    <condition>不等于</condition>
    <condition>大于</condition>
    <condition>大于等于</condition> 
    <condition>小于</condition>
    <condition>小于等于 </condition>
    </conditions>
    </fielddisplay>
    </database>
    </server>
    </root>
      

  4.   

    知道你的想法很好,但实际上实现起来很难,因为不可能把所有的业务逻辑泛型化。你所实现的只是针对某一个查询的XML映射,如果有几百个查询,每一个都需要XML映射的话,增加开发时间不说,维护调试起来难于上青天。而且你将查询的方法限定在你的思维逻辑上映射成XML,如果你的查询不是最优化的,需要重写,或别人有别人的思维来实现,那是不是还要重新设计一个XML?如果想在结果中增加或减少几个字段,就算XML文件可以成功适应这种改变,程序数据绑定部分和界面用不用调整?如果调整还是要重新编译系统。或者使用的T-SQL关键字不在你的XML映射文件中怎么办?将所有的T-SQL关键字映射?那还不如直接修改SQL查询。当前一些工具可以实现当一个表的结构改变则自动生成新的实体类和针对新表的基本查询,这个还是比较实际的。
      

  5.   

    呵呵,你的思路我四年前就实现了,不过当时作的是增删改,动态 new 窗体中的文本、下拉、日期等对象,再绑定字段,所有描述信息都保存到xml中,当然是通过图形化界面保存的。另外可以采用虚函数重构的方法,实现处理的多样性。你的思路绝对可行,但要付出很大的代价。
      

  6.   

    呵呵,你的思路我四年前就实现了,不过当时作的是增删改,动态 new 窗体中的文本、下拉、日期等对象,再绑定字段,所有描述信息都保存到xml中,当然是通过图形化界面保存的。另外可以采用虚函数重构的方法,实现处理的多样性。你的思路绝对可行,但要付出很大的代价。