none
关于数据查询效率的问题 RRS feed

  • 问题

  • 设已有一个datatable--dt,里面有[姓名]字段,若干条记录;
    向数据库中另一个表中查询姓名相同的记录,并将相关记录字段内容填充到dt中,怎么写比较好?总不能循环创建Adapter吧
    2009年9月1日 7:48

答案

  • 既然你的条件是有限的,那么就使用 in 或一个一个的获取吧。获取前先打开连接,这样可以避免频繁开关数据连接。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 ahking 2009年9月17日 0:38
    2009年9月16日 2:18
    版主

全部回复

  • 把这个 dt 中的姓名插入到数据中的临时表中,然后通过 INNER JOIN 关连两个表的姓名字段得到所有记录。
    知识改变命运,奋斗成就人生!
    2009年9月1日 8:19
    版主
  • 把这个 dt 中的姓名插入到数据中的临时表中,然后通过 INNER JOIN 关连两个表的姓名字段得到所有记录。
    知识改变命运,奋斗成就人生!

    没有建表和插入数据的权限该怎么办呢
    2009年9月1日 8:59
  • 动态生成 WHERE  条件如 WHERE Name IN ('Name1', 'Name2') 
    知识改变命运,奋斗成就人生!
    2009年9月1日 9:03
    版主
  • 动态生成 WHERE  条件如 WHERE Name IN ('Name1', 'Name2') 
    知识改变命运,奋斗成就人生!

    这样将对应数据填充到dt中似乎不好操作
    2009年9月1日 9:11
  • 你好 select * from [另一个表] where [另一个表].[姓名] in (‘姓名1’ ,‘姓名2’,'姓名n')

    后边的姓名在程序中通过遍历datatable获得 作为DbCommand参数传入进去查询

    如果另一个表数据量不是很大的话 也可以全取出来 然后通过DataTable.Select方法获取


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月1日 9:12
    版主
  • 建议使用我第一次给你说的方法,如果这种操作做得比较频繁,可以和管理协商建立一张物理表。
    知识改变命运,奋斗成就人生!
    2009年9月1日 9:29
    版主
  • 你好,这些建议都在一个存储过程中实现,然后把结果返回UI就可以了,

    select * from tablename1 where colname in (select colname from tablename2)
    jon.valett@gmail.com
    2009年9月1日 10:46
    版主
  • 动态生成 WHERE  条件如 WHERE Name IN ('Name1', 'Name2') 
    知识改变命运,奋斗成就人生!

    这样将对应数据填充到dt中似乎不好操作

    不一定要放到dt 放在一个 list<Datarow> 也很好啊
    恭喜自己5星用户达成
    2009年9月2日 5:32
    版主
  • 动态生成 WHERE  条件如 WHERE Name IN ('Name1', 'Name2') 
    知识改变命运,奋斗成就人生!

    这样将对应数据填充到dt中似乎不好操作

    不一定要放到dt 放在一个 list<Datarow> 也很好啊
    恭喜自己5星用户达成

    .net 2.0支持list<Datarow>的写法么,为了绑定的需要用的dt
    2009年9月2日 23:47
  • 你好,这些建议都在一个存储过程中实现,然后把结果返回UI就可以了,

    select * from tablename1 where colname in (select colname from tablename2)
    jon.valett@gmail.com

    我的datatable是代码生成的,不是从数据库查询得来的;从数据库中按姓名姓名相同获取数据后,还要再遍历datatable按姓名相同将字段内容填充到dt中,感觉既麻烦又低效;不想用在服务器建临时表的办法,有什么别的好方法么?
    2009年9月11日 8:37
  • 你好,最高效的方法就是在存储过程实现你的逻辑,然后把数据返回来,而不是返回一堆数据,再去筛选。这样既消耗网络传送,有很消耗内存。
    jon.valett@gmail.com
    2009年9月12日 2:01
    版主
  • 你好,最高效的方法就是在存储过程实现你的逻辑,然后把数据返回来,而不是返回一堆数据,再去筛选。这样既消耗网络传送,有很消耗内存。
    jon.valett@gmail.com

    但是在本案例中,好像没有办法用你的方法啊
    2009年9月14日 0:28
  • 设已有一个datatable--dt,里面有[姓名]字段,若干条记录;
    向数据库中另一个表中查询姓名相同的记录,并将相关记录字段内容填充到dt中,怎么写比较好?总不能循环创建Adapter吧
    你好,你的代码中存在一个Datatable,与,数据库中一个表进行比较,建议你,代码中的表在数据库中也获取一份来,然后在数据库中与你所有的那个数据库表比较,这样效率会高些,不然,你的数据已经拿出来了,然后又要回去比较,这个设计本身就效率不高,再怎么优化也是有个限度的。

    比较出来结果后,获取你想要的数据,然后最后在返回UI,一句话,UI负责显示数据,不处理数据。

    jon.valett@gmail.com
    2009年9月14日 2:15
    版主
  • 设已有一个datatable--dt,里面有[姓名]字段,若干条记录;
    向数据库中另一个表中查询姓名相同的记录,并将相关记录字段内容填充到dt中,怎么写比较好?总不能循环创建Adapter吧
    你好,你的代码中存在一个Datatable,与,数据库中一个表进行比较,建议你,代码中的表在数据库中也获取一份来,然后在数据库中与你所有的那个数据库表比较,这样效率会高些,不然,你的数据已经拿出来了,然后又要回去比较,这个设计本身就效率不高,再怎么优化也是有个限度的。

    比较出来结果后,获取你想要的数据,然后最后在返回UI,一句话,UI负责显示数据,不处理数据。

    jon.valett@gmail.com

    "代码中的表在数据库中也获取一份来",你的意思是把datatable放到数据库中?关键是datatable的数据不是从数据中获取的,是粘贴,然后代码生成的,而且没有往数据库再写的权限啊
    2009年9月15日 8:37
  • Hi,
       如果数据库你只有读的权限,可以直接写sql查询语句传递进去吧,然后在ADO.net 里使用Dataset来装载数据。
      因为你没有写权限,所以不能借助生成表或者创建索引等方式了。
      只能使用sql,来进行数据处理,效率应该i可以,比你直接在C#代码里比较数据,然后重新整理赛选符合要求的结果还是方便不少。
      我给你个参考语句,你自己,大概的思路:
      dt1,
      dt2,两个表都包含一个相同的字段name.
      select name,* from dt1
      inner join dt2 on dt1.name = dt2.name 
     
      如果你还有其他的条件,比如日期闲置,你可以再此语句后直接加Where dt1.time >'2009-09-12'
     
      然后使用ADO.NET 的SQLCommand对象直接传递此SQL语句给数据库服务器。
     DataSet dataSET ,来装载你查询的数据结果~

      参考思路。你看看有帮助没~
     
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月15日 10:03
    版主
  •   dt1,
      dt2,两个表都包含一个相同的字段name.
      select name,* from dt1
      inner join dt2 on dt1.name = dt2.name 

    dt1是数据库中的一个表,dt2是代码中的dataTable,不是数据库中表,可以这么写么?
    2009年9月15日 23:56
  • 既然你的条件是有限的,那么就使用 in 或一个一个的获取吧。获取前先打开连接,这样可以避免频繁开关数据连接。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 ahking 2009年9月17日 0:38
    2009年9月16日 2:18
    版主
  • 既然你的条件是有限的,那么就使用 in 或一个一个的获取吧。获取前先打开连接,这样可以避免频繁开关数据连接。
    知识改变命运,奋斗成就人生!

    只有这么办了
    2009年9月16日 8:40
  • 使用LINQ,很方便的。你可以试试。
    2009年9月16日 10:42
  •   dt1,
      dt2,两个表都包含一个相同的字段name.
      select name,* from dt1
      inner join dt2 on dt1.name = dt2.name 

    dt1是数据库中的一个表,dt2是代码中的dataTable,不是数据库中表,可以这么写么?
    那就不可以了
    你可以参考楼下的建议使用linq尝试一下
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月16日 12:02
    版主
  • 动态生成 WHERE  条件如 WHERE Name IN ('Name1', 'Name2') 
    知识改变命运,奋斗成就人生!

    这样将对应数据填充到dt中似乎不好操作

    不一定要放到dt 放在一个 list<Datarow> 也很好啊
    恭喜自己5星用户达成

    .net 2.0支持list<Datarow>的写法么,为了绑定的需要用的dt
    当然支持
    恭喜自己5星用户达成
    2009年9月17日 4:44
    版主