CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

高手们帮帮忙,一个较有研究意义的DataSet问题,大家帮帮忙!!!

楼主aiyaya(Tony,ye)2003-12-03 16:59:57 在 .NET技术 / C# 提问

例如:   我有三张表A、B、C   。   A为主表,a为A表的主键。B、C表中也具有a   。  
  我想通过查询A表获得的满足要求的a,把相关的B表中的b和C表中的c用DataGrid  
  显示出来。显示如:  
   
              a               b               c  
   
  1、       X               Y               Z  
  2、       XX             YY             ZZ  
   
  (X、Y、Z和XX、YY、ZZ都是相关的)  
   
  请问能做到吗,怎么做?如果不能用DataSet做,那还有其他方法吗?  
   
  高手们帮帮忙!!!                         (分不够再加)  
  问题点数:100、回复次数:31Top

1 楼eyestrong(有时爱情图有虚名)回复于 2003-12-03 17:06:17 得分 4

如果没有数据库支持,可以使用DataTable.Select()方法实现。Top

2 楼hammlet(探花)回复于 2003-12-03 17:06:26 得分 2

用过滤吧?Top

3 楼brightheroes(在地狱中仰望天堂)回复于 2003-12-03 17:08:38 得分 5

select   bb.*,cc.*   from   A   aa,B   bb,C   cc   where   cc.a   =   aa.a   and   bb.a   =   aa.a   and   aa.a   =   你的条件  
  Top

4 楼brightheroes(在地狱中仰望天堂)回复于 2003-12-03 17:11:01 得分 5

这个问题就是一条sql语句,不关系到datagrid,dataset之类的东西  
  Top

5 楼xinyuluo(代码机器人)回复于 2003-12-03 17:13:15 得分 4

可以在数据库里面做视图就行了。  
  如果要在程序里面实现。只要动态网使用的他Table里面加列,然后判断数据是否符合要求。往里面加数据就行了Top

6 楼aiyaya(Tony,ye)回复于 2003-12-03 17:13:33 得分 0

有数据库SQL   SERVER2000的。  
  我是这样想的,因为有几种查询条件可供筛选,我能不能  
  先把这几张表放到DataSet上,然后根据他们的相关性进行  
  筛选和最终显示?Top

7 楼qiaoba(一路坎杀)回复于 2003-12-03 17:19:09 得分 5

你这么做不累吗?用一条SQL就搞定了,  
  select   A.*,B.*,C.*    
  from   A    
  left   join   B   on   A.a=b.a    
  left   join   A.a=B.a    
  where   a=?或其它条件  
  这样就得到了一个DataTable,以后的你一定会了。  
  Top

8 楼qiaoba(一路坎杀)回复于 2003-12-03 17:26:25 得分 12

上面的写错了!!!  
  你这么做不累吗?用一条SQL就搞定了,  
  select   A.*,B.*,C.*    
  from   A    
  left   join   B   on   A.a=B.a    
  left   join   A.a=C.a    
  where   A.a=?或其它条件  
  这样就得到了一个DataTable,以后的你一定会了。Top

9 楼light999(普照)回复于 2003-12-03 17:33:21 得分 3

同意,我也是这么做的。  
  用一条联合查询就可以了  
  不过逻辑条件方面一定要弄对否则会多出好多条重复的记录。  
  那就是条件设的不对Top

10 楼aiyaya(Tony,ye)回复于 2003-12-03 17:35:49 得分 0

非常感谢各位的帮忙!  
  还有其他的方法吗?大家踊跃发言呀?  
   
  还有一个问题,当我要扩充刚刚的问题,就是在DataGrid把这张表  
  显示后,如果我允许别人编辑,如:   点击   其中一条数据,我要  
  通过它查找除A、B、C三张表外的第四张表的内容时,直接SQL方法,  
  会不会较麻烦?Top

11 楼aiyaya(Tony,ye)回复于 2003-12-03 17:50:13 得分 0

我是说当DataGrid跟DataTable捆绑时会不会麻烦?  
  也是直接SQL第四张表就行了吗?  
  (刚学.NET,谢谢各位帮忙!!!)Top

12 楼zjlion(晴海)回复于 2003-12-03 18:07:00 得分 5

我倒是主张用关系来做,DataRelation,这回比较好。Top

13 楼philipsslg(刮开中大奖(█))回复于 2003-12-03 20:15:12 得分 1

写程序时,怎样用SQL语句生成DataTable,上面几个能不能写的具体点  
  Top

14 楼zjsen(位高权重责任轻,钱多事少离家近,睡觉睡到自然醒, 数钱数到手抽筋. )回复于 2003-12-03 20:45:10 得分 3

string   strConn=""user   id=sa;"   +    
              "password=;"   +    
              "initial   catalog=northwind;"   +    
              "data   source=MyComputerName\\NetSDK;"   +  
              "Connect   Timeout=5";  
  sqlConn=new   SqlConnection(strconn);  
  sqlConn.Open();  
  strSQL="select   *   from   table";  
  sqlDtApt   =   new   SqlDataAdapter(strSQL,sqlConn);  
  DateSetdtset   =   new   DataSet();  
  sqlDtApt.Fill(dtset);  
  DataTable   dt=dtset.Tables[0];  
  Top

15 楼tonyye1979(淘涛)回复于 2003-12-03 20:53:05 得分 3

挺热闹的嘛。来晚了!  
  支持用DataTable!!!Top

16 楼yellow888(我是新手,请各位帮忙)回复于 2003-12-03 20:54:58 得分 3

学习中ing...Top

17 楼rock1981(呵呵呵)回复于 2003-12-03 20:58:50 得分 3

看了一下b因你的几张表是关联的,所以最好的选择是把它们做的关系DataRelation建立起来  
  通过它们的级联关系很容易得到你想要的数据。Top

18 楼aiyaya(Tony,ye)回复于 2003-12-03 20:59:51 得分 0

如果用DataRelation怎么做啊,能实现吗?Top

19 楼simanh()回复于 2003-12-03 22:22:00 得分 2

upTop

20 楼aiyaya(Tony,ye)回复于 2003-12-04 09:25:02 得分 0

由于数据量比较大,是直接用SQL查快呢,还是用DataRelation方式快???  
  分不够再加       一百分       ,高手们踊跃发言呀!!!Top

21 楼yaopaopao(泡泡)回复于 2003-12-04 09:35:46 得分 3

用Sql快,数据库内运行比在程序中快多了,所有有关数据库中表的操作都让数据库去执行Top

22 楼rottenapple(伪程序员)回复于 2003-12-04 10:22:07 得分 3

如果是关系型数据库用sql语句写当然好了  
  如果是从其它文件得来的,例如xml文件,那么可以使用dataview  
  Top

23 楼yellow888(我是新手,请各位帮忙)回复于 2003-12-04 10:43:29 得分 3

一个较愚蠢的问题:     增加筛选条件会不会查询速度更慢?Top

24 楼philipsslg(刮开中大奖(█))回复于 2003-12-04 12:55:06 得分 3

对   zjsen(脚踏实地)   说  
  如果你用向导生成sqlAdapter;  
  这句语句  
  strSQL="select   *   from   table";  
  sqlDtApt   =   new   SqlDataAdapter(strSQL,sqlConn);  
  是不是会覆盖  
  sqlAdapter的selectCommand  
   
  Top

25 楼kevin881(孤星泪)回复于 2003-12-04 14:01:45 得分 5

是用sql语句,还是load到内存(DataSet)中,我觉得要看这么两点:  
  1,查询条件会不会变化,是不是一次查询,多次使用(这是DataSet的长项,也是微软设计它的出发点);  
  2,查询期间DB会不会改变,同步状况如何;  
  我觉得有时候单单考虑实现技术是不行的,还要结合用户需求。Top

26 楼aiyaya(Tony,ye)回复于 2003-12-04 14:37:13 得分 0

目前具体情况是这样的:  
   
  1     查询条件会变化,但它只是起过滤作用;  
   
  2     查询期间DB不变(查的是备份库),因DB数据量过大,  
  只会在晚上不工作时把运行库导入备份库更新;  
   
  3     因过滤条件存在一对多的情况,而且可以选择几个条件  
  复合查询,所以最好能直接在DataSet里过滤获得需要的数据。  
   
  SQL到DataTable后,应该也能过滤吧???Top

27 楼vipfenghuang(张伟)回复于 2003-12-04 15:41:08 得分 3

 
   
  select    
  bb.*,  
  cc.*    
  from    
  A   aa,  
  B   bb,  
  C   cc    
  where   cc.a   =   aa.a    
  and   bb.a   =   aa.a    
  and   aa.a   =   你的条件  
   
  前提是b,c表的字段a是A表得外键  
  就是一条sqlTop

28 楼gordenfl(笨笨(杨过寻找姑姑,两行泪....))回复于 2003-12-04 16:10:37 得分 3

ds.Table["c"].Select(bb.*,cc.*   from   A   aa,B   bb,C   cc   where   cc.a   =   aa.a   and   bb.a   =   aa.a   and   aa.a   =   你的条件)Top

29 楼qiaoba(一路坎杀)回复于 2003-12-04 17:00:58 得分 10

标准答案:  
   
   
  DataRelation   的主要功能之一是允许您在   DataSet   中从一个   DataTable   导航至另一个   DataTable。它使您能够在给定相关   DataTable   中的单个   DataRow   的情况下检索一个   DataTable   中的所有相关   DataRow   对象。例如,当建立客户表和订单表之间的   DataRelation   后,可以使用   DataRow.GetChildRows   检索特定客户行的所有订单行。  
   
  以下代码示例创建   DataSet   中   Customers   表和   Orders   表之间的   DataRelation,并返回每个客户的所有订单。  
   
  [Visual   Basic]  
  Dim   custOrderRel   As   DataRelation   =   custDS.Relations.Add("CustOrders",   _  
                                            custDS.Tables("Customers").Columns("CustomerID"),   _  
                                            custDS.Tables("Orders").Columns("CustomerID"))    
   
  Dim   custRow   As   DataRow  
  Dim   orderRow   As   DataRow  
   
  For   Each   custRow   in   custDS.Tables("Customers").Rows  
      Console.WriteLine(custRow("CustomerID"))  
      For   Each   orderRow   in   custRow.GetChildRows(custOrderRel)  
          Console.WriteLine(orderRow("OrderID"))  
      Next  
  Next  
   
  [C#]  
  DataRelation   custOrderRel   =   custDS.Relations.Add("CustOrders",  
                                            custDS.Tables["Customers"].Columns["CustomerID"],  
                                            custDS.Tables["Orders"].Columns["CustomerID"]);  
  foreach   (DataRow   custRow   in   custDS.Tables["Customers"].Rows)  
  {  
      Console.WriteLine(custRow["CustomerID"]);  
      foreach   (DataRow   orderRow   in   custRow.GetChildRows(custOrderRel))  
          Console.WriteLine(orderRow["OrderID"]);  
  }  
   
  下一示例以上例为基础,将四个表关联在一起,并在导航这些关系。如上例所示,CustomerID   使   Customers   表与   Orders   表相关。对于   Customers   表中的每个客户,将确定   Orders   表中的所有子行,以返回特定客户的订单数以及他们的   OrderID   值。  
   
  该扩展示例还将返回   OrderDetails   表和   Products   表中的值。Orders   表使用   OrderID   与   OrderDetails   表相关,以确定在每一客户订单中订购的产品及数量。由于   OrderDetails   表只包含已订购产品的   ProductID,OrderDetails   将使用   ProductID   与   Products   相关,以返回   ProductName。在这一关系中,Products   表为父表,而   Order   Details   表为子表。因此,当循环访问   OrderDetails   表时,将调用   GetParentRow   来检索相关的   ProductName   值。  
   
  请注意,当为   Customers   表和   Orders   表创建   DataRelation   时,没有为   createConstraints   标志指定任何值(默认为   true)。它假定   Orders   表中的所有行都具有一个存在于父   Customers   表中的   CustomerID   值。如果   CustomerID   存在于   Customers   表之外的   Orders   表中,则   ForeignKeyConstraint   将引发异常。  
   
  如果子列可能包含父列不包含的值,添加   DataRelation   时请将   createConstraints   标志设置为   false。在该示例中,对于   Orders   表和   OrderDetails   表之间的   DataRelation,createConstraints   标志将设置为   false。这样,应用程序就可以返回   OrderDetails   表中的所有记录并只返回   Orders   表中记录的子集,而不会生成运行时异常。该扩展示例生成以下格式的输出。  
   
              Customer   ID:   NORTS  
                  Order   ID:   10517  
                              Order   Date:   4/24/1997   12:00:00   AM  
                                    Product:   Filo   Mix  
                                  Quantity:   6  
                                    Product:   Raclette   Courdavault  
                                  Quantity:   4  
                                    Product:   Outback   Lager  
                                  Quantity:   6  
                  Order   ID:   11057  
                              Order   Date:   4/29/1998   12:00:00   AM  
                                    Product:   Outback   Lager  
                                  Quantity:   3  
   
  以下代码示例是一个扩展示例,在该示例中将返回   OrderDetails   表和   Products   表中的值,并只返回   Orders   表中记录的子集。  
   
  [Visual   Basic]  
  Dim   custOrderRel   As   DataRelation   =   custDS.Relations.Add("CustOrders",   _  
                                            custDS.Tables("Customers").Columns("CustomerID"),   _  
                                            custDS.Tables("Orders").Columns("CustomerID"))  
   
  Dim   orderDetailRel   As   DataRelation   =   custDS.Relations.Add("OrderDetail",   _  
                                            custDS.Tables("Orders").Columns("OrderID"),   _  
                                            custDS.Tables("OrderDetails").Columns("OrderID"),   false)  
   
  Dim   orderProductRel   As   DataRelation   =   custDS.Relations.Add("OrderProducts",   _  
                                            custDS.Tables("Products").Columns("ProductID"),   _  
                                            custDS.Tables("OrderDetails").Columns("ProductID"))  
   
  Dim   custRow,   orderRow,   detailRow   As   DataRow  
   
  For   Each   custRow   In   custDS.Tables("Customers").Rows  
      Console.WriteLine("Customer   ID:"   &   custRow("CustomerID").ToString())  
   
      For   Each   orderRow   In   custRow.GetChildRows(custOrderRel)  
          Console.WriteLine("     Order   ID:   "   &   orderRow("OrderID").ToString())  
          Console.WriteLine(vbTab   &   "Order   Date:   "   &   orderRow("OrderDate").ToString())  
   
          For   Each   detailRow   In   orderRow.GetChildRows(orderDetailRel)  
                  Console.WriteLine(vbTab   &   "       Product:   "   &   detailRow.GetParentRow(orderProductRel)("ProductName").ToString())  
                  Console.WriteLine(vbTab   &   "     Quantity:   "   &   detailRow("Quantity").ToString())  
          Next  
      Next  
  Next  
  Top

30 楼momoguagua(呱呱)回复于 2003-12-05 08:47:57 得分 3

不用SQL的话,楼上的方法正解Top

31 楼chinanewway(新路了无痕)回复于 2003-12-05 09:12:57 得分 4

还是在关系数据库中用SQL语句比较快吧  
  select   A.a,B.b,C.c  
  from   A  
  left   outer   join   B   on   A.a=B.a  
  left   outer   join   C   on   A.a=C.a  
  where   条件语句  
  Top

相关问题

  • DataSet
  • 如何比较两个dataset
  • dataset ,why????
  • DataGrid + DataSet
  • DataGrid + DataSet
  • C#,dataset
  • 请问国内哪些大学、研究机构或者公司做XML研究开发比较出色???
  • 那个大学的潜入式方向研究生较好?
  • \\的意义???
  • 一起来研究研究:

关键词

  • 数据库
  • 语句
  • 数据
  • datagrid
  • 帮帮忙
  • 表
  • datarelation
  • datatable
  • sqlconn
  • 条件

得分解答快速导航

  • 帖主:aiyaya
  • eyestrong
  • hammlet
  • brightheroes
  • brightheroes
  • xinyuluo
  • qiaoba
  • qiaoba
  • light999
  • zjlion
  • philipsslg
  • zjsen
  • tonyye1979
  • yellow888
  • rock1981
  • simanh
  • yaopaopao
  • rottenapple
  • yellow888
  • philipsslg
  • kevin881
  • vipfenghuang
  • gordenfl
  • qiaoba
  • momoguagua
  • chinanewway

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo