ASP.NET C#中ADO如何使用IN关键字

attidust 2012-11-26 06:50:50
故事的背景是这样的:

在做一个小的OA系统,希望使用树状结构来模拟公司的组织,并同时实现部门之间权限屏蔽的功能。在获取一些通知、人员列表等信息时,思路是,首先通过递归,获取某一个组织(分公司、部门、班组等)的所有上线组织(或者下线)的组织代码,储存在一个DataTable里面,然后从数据库里面,把组织代码在这个DataTable里面的信息检索出来,SQL是要用SELECT *** FROM tb_resource WHERE org_code IN my_DataTable这样的语句的。

问题1:

怎么通过ADO的方法,把DataTable传递给SQL Server,然后让数据库服务器,执行SELECT IN的语句?

问题2:

如果不使用DataTable之类的方法,还有别的方法可以实现类似的功能吗?
...全文
414 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
attidust 2012-11-27
  • 打赏
  • 举报
回复
回复18楼,把组织设计成为树状结构,并用这种结构来做权限管理,个人以为要比以往按照是否拥有授权的权限控制方法好很多,因为如果要使用传统的权限控制,那么有一个很重要的前提,系统需要明确组织的构成结构,并且一旦系统根据组织的结构搭建完成,组织发生结构变化时,系统很难做相应的调节。而使用树状结构,系统在设计时,并不需要对组织的结构有完全的了解,只需要根据系统的实施范围,相应的增加或调整系统中组织节点就够了,这点是很有诱惑力的,尤其对于中小企业的OA系统设计而言。
无忧无虑Coding 2012-11-26
  • 打赏
  • 举报
回复
楼主为什么不采用把DataTable 定义为一个全局变量,然后采用DataTable.Select方法进行循环查询,这样的话效率也比较高,因为程序仅仅和物理数据库发生了一次查询,后面的循环操作都是在内存中进行,更能发挥出ADO.NET的特点。 个人感觉存储过程是一个好东西,但是程序的维护性和可读性都比较复杂。
attidust 2012-11-26
  • 打赏
  • 举报
回复
接17楼: 之后只需要把各个资源,INNER JOIN resource.org_id=list.org_id,生成的表就可以了
阿达King哥 2012-11-26
  • 打赏
  • 举报
回复
我觉得你的思路有问题。如果是我,我就不按照你这个思路做。你应该在设计这个结构的时候把整个组织做一个聚合的关系。所有的查询用LazyLoad的思想。这样就不存在什么DataTable里面还要做IN的操作什么的。
attidust 2012-11-26
  • 打赏
  • 举报
回复
请大家参考,指正: org_id org_name org_upline 1 系统根目录 NULL 2 集团 1 3 本部 2 4 青岛分 2 5 上海分 2 6 青岛财务 4 7 青岛分操作 4 8 上海分财务 5 9 上海操作 5 查询上线节点: 7 WITH org_CTE(org_id, org_name, org_upline) AS( SELECT org_id, org_name, org_upline FROM org_nod WHERE org_id=7 UNION ALL SELECT succ.org_id, succ.org_name, succ.org_upline FROM org_nod succ INNER JOIN org_CTE prev ON prev.up_line=succ.org_ID ) SELECT org_id, org_name, org_upline FROM org_CTE 第一次递归 org_id org_name org_upline 7 青岛分操作 4 第二次递归(未UNION ALL) org_id org_name org_upline 4 青岛分 2 第三次递归(未UNION ALL) org_id org_name org_upline 2 集团 1 第四次递归(未UNION ALL) org_id org_name org_upline 1 系统根目录 NULL 递归结束,无选出值 UNION ALL后结果: org_id org_name org_upline 7 青岛分操作 4 4 青岛分 2 2 集团 1 1 系统根目录 NULL 查询下线节点: 2 WITH org_CTE(org_id, org_name, org_upline) AS( SELECT org_id, org_name, org_upline FROM org_nod WHERE org_id=2 UNION ALL SELECT succ.org_id, succ.org_name, succ.org_upline FROM org_nod succ INNER JOIN org_CTE prev ON prev.org_ID=succ.org_upline ) SELECT org_id, org_name, org_upline FROM org_CTE 第一次递归 org_id org_name org_upline 2 集团 1 第二次递归(未UNION ALL) org_id org_name org_upline 3 本部 2 4 青岛分 2 5 上海分 2 第三次递归(未UNION ALL) 6 青岛财务 4 7 青岛分操作 4 8 上海分财务 5 9 上海操作 5 递归结束,无选出值 UNION ALL后结果: org_id org_name org_upline 2 集团 1 3 本部 2 4 青岛分 2 5 上海分 2 6 青岛财务 4 7 青岛分操作 4 8 上海分财务 5 9 上海操作 5
attidust 2012-11-26
  • 打赏
  • 举报
回复
找到一个示例,给大家参考一下: http://blog.sina.com.cn/s/blog_6471ccb60100lemj.html 思路应该是存储过程的递归调用,用C#实现,或者转集合的做法,也行,不过个人觉得这个更好,直接就递归搞定! 留到12点结贴,大家继续集思广益!
attidust 2012-11-26
  • 打赏
  • 举报
回复
是!!!13楼,就像圣诞树!
谷文仁 2012-11-26
  • 打赏
  • 举报
回复
楼主是要这种效果不 先获取组织 再获取组织底下(包括组织底下底下)的信息吗? 如果是我就贴代码..
attidust 2012-11-26
  • 打赏
  • 举报
回复
如果系统用于一个树状结构的组织(比如大部分的集团公司),角色配置,很难满足要求,因为某一个角色,配置成一样,那么整个系统中的所有组织节点的用户,都有相同的权限,这个对于树状组织是不合适的。
CSMSDN 2012-11-26
  • 打赏
  • 举报
回复
这样来检查权限,复杂要得死命了,利用角色权限进行配置,这样才行的,百度一下,这一方面的思想
手可摘星辰 2012-11-26
  • 打赏
  • 举报
回复
换个样子就不会了。。。。。。
  • 打赏
  • 举报
回复
DataTable dt = new DataTable(); string sql = "select * from 表 where id in (" + string.Join(",", dt.AsEnumerable().Select(t => new { id = t.Field<int>("id").ToString() }).Select(tt => tt.id).ToArray()) + ")";
attidust 2012-11-26
  • 打赏
  • 举报
回复
求写出来过的人,给个参考
LHNET66 2012-11-26
  • 打赏
  • 举报
回复
在存储过程中嵌套个游标 游标一条一条往下读 通过流程控制 不过仅供参考 难度很大, 如果写出来求参考
Jonly 2012-11-26
  • 打赏
  • 举报
回复
表示关注!!
attidust 2012-11-26
  • 打赏
  • 举报
回复
问题是,如何把数据表这样的数据,传给SQL Server。考虑过做一个临时表,然后用SELECT In来实现,但是,当多用户调用时候,临时表会不会冲突,这个也需要考虑,并且给数据库的压力也很大。
attidust 2012-11-26
  • 打赏
  • 举报
回复
考虑过三楼的建议,但是,存储过程怎么能把一个组织节点的上线组织和下线组织给找出来呢? 不会用SQL写这个……
conan8126 2012-11-26
  • 打赏
  • 举报
回复
可以考虑使用存储过程
bdmh 2012-11-26
  • 打赏
  • 举报
回复
必须循环datatable,拼接条件,如 拼接id为 1,2,3,4之类的
attidust 2012-11-26
  • 打赏
  • 举报
回复
千万别说,一条一条的取出DataTable里面的信息,然后SELECT WHERE A=B啊,那样的执行效率太低了……
加载更多回复(1)

62,017

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧