热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个递归的方法,为什么它会覆盖原来循环的值呢?

有一个地区表(AR_AREA),如:AR_PKAR_NAMEAR_PID1广东02广西0

   有一个地区表(AR_AREA),如:
   AR_PK  AR_NAME  AR_PID
     1      广东     0
     2      广西     0
     3      广州     1
     4      东莞     1
     5      桂林     2
     6      海珠区   3
     7      天河区   3
   有一个单位表(UN_UNIT),如:
   UN_PK    UN_ANME   UN_AREA
     1       AA         1
     2       BB         3
     3       CC         7

我的目的是根据地区ID(UN_AREA),把对应的公司的ID(UN_PK)取出来,如我限制的地区是:用一个变量Name="1,"来表示,也就是取出广东所有单位的信息,这时就应该把地区是广州(3)、东莞(4)、海珠区 (6)、天河区(7)的单位取出来

                DataTable [] DT = new DataTable[2];
string Name = "1,";
SqlDataAdapter sda = null;
DataSet    ds = null;

private void cLoad()
{
                        string [] att = Name.Split(',');
for(int i=0;i {
cLoadUnit(att[i]);
}
}
private void cLoadUnit(string PID)
{
string SQL  = "SELECT * FROM UN_UNIT WHERE UN_AREA = "+ PID;
sda = new SqlDataAdapter(SQL,con);
ds  = new DataSet();
ds = sda.fill("AA");

DT[0] = ds.Tables["AA"];
for(int i=0;i {
ComID.Text += DT[0].Rows[i]["UN_PK"].ToString() + ",";
}

string cSQL = "SELECT * FROM AR_AREA WHERE AR_SUPERIORAREA ="+PID;
sda = new SqlDataAdapter(cSQL,con);
                        ds = sda.fill("BB")
DT[1] = ds.Tables["BB"];
for(int i=0;i {
                                 LoadUnit(DT[1].Rows[i]["AR_PK"].ToString());
}

}

最终的结果应该是ComID.Text = "1,2,3,";但事实却是这样:东莞(3)\天河区(7)这两条纪录不会被作为父ID递归下去,因为那时DT[1].Rows.Count已被清0了,因此ComID.Text="1,2,";

不知道我表达得是否清楚,有时间和有兴趣的朋友能帮我调试吗.

15 个解决方案

#1


#2


去SQL區,這個好解決,

#3


没人来帮我看一下吗

#4


顶一下。快要下班了。唉~~~

#5


select * 
fro Ar_Area as a, UN_UNIT as u
where a.AR_PK=u.UN_AREA and (a.ARPK=地区编号  or a.AR_PID=地区编号)

#6


最简单的办法就是在地区表上加一个字段,AR_PATH,表示每个节点的路径,如:
  AR_PK  AR_NAME  AR_PID   AR_PATH
     1      广东     0       /1
     2      广西     0       /2
     3      广州     1       /1/3
     4      东莞     1       /1/4
     5      桂林     2       /2/5
     6      海珠区   3       /1/3/6
     7      天河区   3       /1/3/7

这样,如果取广东的所有地区,就查找AR_PATH以/1开头的记录,如果要找广州以下的地区,就找以/1/3开头的记录。这种做法的效率肯定会比递归来得高,但维护的时候会比较麻烦,一旦更改某个节地区的上级地区,那它和它的下级地区的AR_PATH也必须更改。

#7


同意 effun(一风)  .这样设计时比较好,查询是不用递归.

#8


维护时也不是很麻烦.用个触发器很容易实现.

#9


还有用递归不要查询数据库.

#10


string strCitys = "";

DataTable dt = DataClass.ExecuteDataTable("Select * FROM AR_AREA");
 
this.cLoadUnit(ref strCitys,ref dt,"1");

if(strCitys != "")
{
strCitys = strCitys.Substring(0,strCitys.Length-1);
}
Response.Write(strCitys);


private void cLoadUnit(ref string Citys,ref DataTable dt ,string PID)
{
DataRow[] rows = dt.Select("AR_PID='"+ PID+"'");

for(int i=0;i {
Citys += rows[i]["AR_PK"].ToString() +",";

this.cLoadUnit(ref Citys,ref dt,rows[i]["AR_PK"].ToString());
}


}

#11


再顶一下,看还有没能能人说一下.

#12


用一条SQL批处理命令就可以了。

string Sql=@"
  declare @tmp table(ar_pk int)
  insert @tmp (ar_pk) select ar_pk from AR_AREA where ar_pk=@param
  declare @deep int  --防止你的AR_AREA有循环
  set @deep=0
  while @@rowcount>0 and @deep<5 begin
    insert @tmp(ar_pk) select ar_pk from AR_AREA as a 
      inner join @tmp as t on a.ar_pk=t.ar_pid
    set @deep=@deep+1
  end
  select un_pk from un_unit as u
    inner join @tmp as t on u.ar_pk=u.un_area";

查询时在你的DBCommandParameter参数中给出@param参数值。

#13


最后一句有一个字母t写错了:

declare @tmp table(ar_pk int)
insert @tmp (ar_pk) select ar_pk from AR_AREA where ar_pk=@param
declare @deep int  --防止你的AR_AREA有循环
set @deep=0
while @@rowcount>0 and @deep<5 begin
  insert @tmp(ar_pk) select ar_pk from AR_AREA as a 
    inner join @tmp as t on a.ar_pk=t.ar_pid
  set @deep=@deep+1
end
select un_pk from un_unit as u
  inner join @tmp as t on t.ar_pk=u.un_area


许多数据库程序都可以用SQL来计算,不要使用c#来写。这类从数据库计算问题,直接到SQL Server论坛(或者相应的数据库论坛)去问就行了。这个程序还是很简单的,许多复杂的计算程序的逻辑要比这个复杂的多(往往需要inner join五六个),用一两条SQL查询要比你写上几百行代码来的清楚、快速的多。

在这类数据库查询应用方面,如果你不懂SQL,是很吃亏的。如果一个项目需要稍微复杂的面向数据库编程,使用懂SQL的程序员来写是很重要的。

#14


sp1234 ,你写的这类的SQL语句我真的不懂啊..我以前学的都是些简单的.这类的语句我都不知从哪里开始学,能给个方向我吗?

#15


sp1234,好像执行你那段代码有些错误啊.能写个详细的步骤给我吗.

推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Mysql调优的顺序及面试问题总结
    文章目录一、调优相关1.第一步:本地explain线上查询遇到的第一个坑:遇到的第二个坑:2.第二步:覆盖索引3.第三步&# ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 题目描述:一个DNA序列由ACGT四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个 ... [详细]
  • 函数:每个DBMS都有特定的函数。举例说明:DBMS函数的差异函数语法提取串的组中部分数据类型转换Access使用MID(); ... [详细]
author-avatar
痴情季豪_726
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有