首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

ASP.NET C#中ADO怎么使用IN关键字

2012-12-17 
ASP.NET C#中ADO如何使用IN关键字故事的背景是这样的:在做一个小的OA系统,希望使用树状结构来模拟公司的组

ASP.NET C#中ADO如何使用IN关键字
故事的背景是这样的:

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

问题1:

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

问题2:

如果不使用DataTable之类的方法,还有别的方法可以实现类似的功能吗?
[最优解释]
楼主是要这种效果不 
    先获取组织 再获取组织底下(包括组织底下底下)的信息吗? 如果是我就贴代码..
    
[其他解释]
可以考虑使用存储过程
[其他解释]
千万别说,一条一条的取出DataTable里面的信息,然后SELECT WHERE A=B啊,那样的执行效率太低了……
[其他解释]
必须循环datatable,拼接条件,如 拼接id为 1,2,3,4之类的
[其他解释]
考虑过三楼的建议,但是,存储过程怎么能把一个组织节点的上线组织和下线组织给找出来呢?
不会用SQL写这个……
[其他解释]
问题是,如何把数据表这样的数据,传给SQL Server。考虑过做一个临时表,然后用SELECT In来实现,但是,当多用户调用时候,临时表会不会冲突,这个也需要考虑,并且给数据库的压力也很大。
[其他解释]
表示关注!!
[其他解释]
在存储过程中嵌套个游标  
游标一条一条往下读
通过流程控制
不过仅供参考
难度很大,
如果写出来求参考
[其他解释]
求写出来过的人,给个参考
[其他解释]
 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()) + ")";
          
[其他解释]
换个样子就不会了。。。。。。
[其他解释]
这样来检查权限,复杂要得死命了,利用角色权限进行配置,这样才行的,百度一下,这一方面的思想
[其他解释]
如果系统用于一个树状结构的组织(比如大部分的集团公司),角色配置,很难满足要求,因为某一个角色,配置成一样,那么整个系统中的所有组织节点的用户,都有相同的权限,这个对于树状组织是不合适的。
[其他解释]
该回复于2012-11-26 10:11:02被管理员删除
[其他解释]
是!!!13楼,就像圣诞树!
[其他解释]
找到一个示例,给大家参考一下:

http://blog.sina.com.cn/s/blog_6471ccb60100lemj.html

思路应该是存储过程的递归调用,用C#实现,或者转集合的做法,也行,不过个人觉得这个更好,直接就递归搞定!

留到12点结贴,大家继续集思广益!
[其他解释]
我觉得你的思路有问题。如果是我,我就不按照你这个思路做。你应该在设计这个结构的时候把整个组织做一个聚合的关系。所有的查询用LazyLoad的思想。这样就不存在什么DataTable里面还要做IN的操作什么的。
[其他解释]
请大家参考,指正:

org_idorg_nameorg_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_idorg_nameorg_upline
7青岛分操作4

第二次递归(未UNION ALL)
org_idorg_nameorg_upline
4青岛分2

第三次递归(未UNION ALL)
org_idorg_nameorg_upline
2集团1

第四次递归(未UNION ALL)
org_idorg_nameorg_upline
1系统根目录NULL

递归结束,无选出值
UNION ALL后结果:
org_idorg_nameorg_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_idorg_nameorg_upline
2集团1


第二次递归(未UNION ALL)
org_idorg_nameorg_upline
3本部2
4青岛分2
5上海分2


第三次递归(未UNION ALL)
6青岛财务4
7青岛分操作4
8上海分财务5
9上海操作5

递归结束,无选出值

UNION ALL后结果:
org_idorg_nameorg_upline
2集团1
3本部2
4青岛分2
5上海分2
6青岛财务4
7青岛分操作4
8上海分财务5
9上海操作5

[其他解释]
表结构
组织id  组织nane 上级组织 
 id       name     pid(表自关联可为空)
 如下
  1      北京      null
  2      湖南      null
  3      长沙       2
  4      湘潭       2
如果现在获取的是湖南编号为2
IList<int> listints = new List<int>();//获取所有的编号
listints.Add(2);//先把湖南加进来
GetTypeids(listints, new[] { page.Type });
    //获取所有子类别
    private void GetTypeids(List<int> ints, int[] parentids)
    {
        List<int> list = GetTypeids(parentids);
        if (list != null && list.Count > 0)
        {
            ints.AddRange(list);
            GetTypeids(ints, list.ToArray());
        }
    }


        /// <summary>
        /// 获取所有子类别
        /// </summary>
        /// <param name="parentids"></param>


        /// <returns></returns>
        public List<int> GetTypeids(int[] parentids)
        {

            if (parentids != null && parentids.Length > 0)
            {
                StringBuilder strSql = new StringBuilder();
                strSql.Append(" select 字段 from  表");
                strSql.Append(" where pid in(");
                foreach (var parentid in parentids)
                {
                    strSql.AppendFormat("'{0}'", parentid).Append(",");
                }
                strSql.Remove(strSql.Length - 1, 1);
                strSql.Append(" )");
                DataSet dataSet = DbHelperSQL.Query(strSql.ToString());
                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    return (from DataRow d in dataSet.Tables[0].Rows select int.Parse(d["id"].ToString())).ToList();
                }
            }
            return null;
        }
基本就这样了把  这样就获取湖南地下所有的下级   。。。希望是你想要的

[其他解释]
接17楼:

之后只需要把各个资源,INNER JOIN resource.org_id=list.org_id,生成的表就可以了
[其他解释]
回复18楼,把组织设计成为树状结构,并用这种结构来做权限管理,个人以为要比以往按照是否拥有授权的权限控制方法好很多,因为如果要使用传统的权限控制,那么有一个很重要的前提,系统需要明确组织的构成结构,并且一旦系统根据组织的结构搭建完成,组织发生结构变化时,系统很难做相应的调节。而使用树状结构,系统在设计时,并不需要对组织的结构有完全的了解,只需要根据系统的实施范围,相应的增加或调整系统中组织节点就够了,这点是很有诱惑力的,尤其对于中小企业的OA系统设计而言。
[其他解释]
    楼主为什么不采用把DataTable 定义为一个全局变量,然后采用DataTable.Select方法进行循环查询,这样的话效率也比较高,因为程序仅仅和物理数据库发生了一次查询,后面的循环操作都是在内存中进行,更能发挥出ADO.NET的特点。
     个人感觉存储过程是一个好东西,但是程序的维护性和可读性都比较复杂。

热点排行