• c#,sharepoint,2007,moss,spsitedataquery,跨列表查询,跨网站查询,join,联合查询 Virus


    最近在研究WSS V3开发的基本知识,在联合查询,也就是跨列表查询碰到了问题,我照着列子做了,可是出不来结果,没有报错,但是结果为零。
    下面是代码,大家可以帮我看一下,有什么问题,还有啊,我的MSN:jorden008@hotmail.com,欢迎大家和我交流,共同进步,共同 MOSS MVP,哈哈。

    我建立了一个网站,三个列表,
    签到信息:姓名,签到时间,签退时间
    班次设置:班次名称,开始时间,结束时间
    排班设置:姓名,班次名称
    现在想联合班次列表和排版列表,根据姓名查询班次的开始、结束时间,这要是用sql,就好弄多了,

    select 姓名,班次名称,开始时间,结束时间 from 班次设置 inner join  排班设置 on  班次设置.班次名称=排班设置.班次名称 where 姓名=“virus”

    可是在sharepoint中,就是没有结果,下面是我的代码,谢谢大家了,如果有了结果,我也会及时更新的

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using Microsoft.SharePoint;

    namespace ConsoleApplication3
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {
                SPSite site 
    = new SPSite("http://virus/sites/intranet/");
                SPWeb web 
    = site.OpenWeb("sdev");
                SPSiteDataQuery siteQuery 
    = new SPSiteDataQuery();

                siteQuery.Webs 
    = "<Webs Scope=\"SiteCollection\" />";
                
                
    //siteQuery.Lists = string.Format("<Lists><List ID='{0}' /><List ID='{1}' /></Lists>",
                
    //    web.Lists["班次设置"].ID, web.Lists["排班设置"].ID);
                
    //siteQuery.ViewFields = string.Format("<FieldRef Name='{0}' /><FieldRef Name='{1}' /><FieldRef Name='{2}' />",
                
    //    web.Lists["排班设置"].Fields["姓名"].InternalName, web.Lists["班次设置"].Fields["开始时间"].InternalName,
                
    //    web.Lists["班次设置"].Fields["结束时间"].InternalName);
                
    //siteQuery.RowLimit = 10;
                siteQuery.Query = string.Format("<Where><Eq><FieldRef Name='{0}' /><Value Type='Text'>{1}</Value></Eq></Where>",
                    web.Lists[
    "排班设置"].Fields["姓名"].InternalName, "史文彬");

                DataTable dt 
    = web.GetSiteData(siteQuery);
                
    foreach (DataRow row in dt.Rows)
                {
                    
    foreach (DataColumn col in dt.Columns)
                    {
                        Console.WriteLine(col.ColumnName
    +":"+row[col].ToString());
                    }
                }

                Console.ReadLine();
            }
        }
    }

    要么就是下面的结果,不是我想要的啊
    ListId:{9E71D527-5169-42D6-8A91-8B9EB1430521}
    WebId:{42EF18F6-3FA5-4CAF-A176-3F0F1E81B8AB}
    ID:2
    ListId:{E78A92E8-7831-4E1F-B222-B370E0F7AC8B}
    WebId:{42EF18F6-3FA5-4CAF-A176-3F0F1E81B8AB}
    ID:1

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using Microsoft.SharePoint;

    namespace ConsoleApplication3
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {
                SPSite site 
    = new SPSite("http://virus/sites/intranet/");
                SPWeb web 
    = site.OpenWeb("sdev");
                SPSiteDataQuery siteQuery 
    = new SPSiteDataQuery();

                siteQuery.Webs 
    = "<Webs Scope=\"SiteCollection\" />";


                siteQuery.Lists 
    = string.Format("<Lists><List ID='{0}' /><List ID='{1}' /></Lists>", web.Lists["排班设置"].ID, web.Lists["班次设置"].ID);
                siteQuery.ViewFields 
    = string.Format("<FieldRef Name='{0}' /><FieldRef Name='{1}' />",
                    web.Lists[
    "排班设置"].Fields["姓名"].InternalName, web.Lists["排班设置"].Fields["班次名称"].InternalName);
               
                
                siteQuery.RowLimit 
    = 10;
                siteQuery.Query 
    = string.Format("<Where><Eq><FieldRef Name='{0}' /><Value Type='Text'>{1}</Value></Eq></Where>",
                    web.Lists[
    "排班设置"].Fields["姓名"].InternalName, "史文彬");

                DataTable dt 
    = web.GetSiteData(siteQuery);

                Console.WriteLine(
    "数据显示开始");
                
    foreach (DataRow row in dt.Rows)
                {
                    Console.WriteLine(
    "=========================================");
                    
    foreach (DataColumn col in dt.Columns)
                    {
                        Console.WriteLine(col.ToString()
    +":"+row[col].ToString());
                    }
                   Console.WriteLine(
    "=========================================");
                }

                Console.WriteLine(
    "数据显示完毕");
                Console.ReadLine();
            }
        }
    }

    这个也可以,但是只是显示了我的名字和我的班次,想要显示我的班次的时间就不行了,不知道为什么啊,还有啊,我发现他会一直显示三个ID,webID,listID,本身的ID,可能是为了确定唯一吧。
    苦恼中。。。。。。。。。。。。。。。。。。。。。。。。

     

    研究的最终结果如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using Microsoft.SharePoint;

    namespace ConsoleApplication3
    {
        
    class Program
        {
            
    static void Main(string[] args)
            {
                SPSite site 
    = new SPSite("http://virus/sites/intranet/");
                SPWeb web 
    = site.OpenWeb("sdev");
                SPSiteDataQuery siteQuery 
    = new SPSiteDataQuery();

                siteQuery.Webs 
    = "<Webs Scope=\"SiteCollection\" />";

                siteQuery.Lists 
    = string.Format("<Lists><List ID='{0}' /><List ID='{1}' /></Lists>", web.Lists["排班设置"].ID, web.Lists["班次设置"].ID);
                siteQuery.ViewFields 
    = string.Format("<FieldRef Name='{0}' Nullable=\"TRUE\" /><FieldRef Name='{1}' Nullable=\"TRUE\" />",
                    web.Lists[
    "排班设置"].Fields["姓名"].InternalName, web.Lists["班次设置"].Fields["开始时间"].InternalName);
                
                siteQuery.RowLimit 
    = 10;
                siteQuery.Query 
    = string.Format("<Where><Eq><FieldRef Name='{0}' /><Value Type='Text'>{1}</Value></Eq></Where>",
                    web.Lists[
    "排班设置"].Fields["姓名"].InternalName, "史文彬");

                DataTable dt 
    = web.GetSiteData(siteQuery);

                Console.WriteLine(
    "数据显示开始");
                
    foreach (DataRow row in dt.Rows)
                {
                    Console.WriteLine(
    "=========================================");
                    
    foreach (DataColumn col in dt.Columns)
                    {
                        Console.WriteLine(col.ToString()
    +":"+row[col].ToString());
                    }
                   Console.WriteLine(
    "=========================================");
                }

                Console.WriteLine(
    "数据显示完毕");
                Console.ReadLine();
            }
        }
    }
    程序运行正常,结果如下:

    数据显示开始
    =========================================
    ListId:6E63F720-249C-4E10-A2E5-F36EEDCE0C75
    WebId:42EF18F6-3FA5-4CAF-A176-3F0F1E81B8AB
    ID:3
    _x59d3__x540d_:virusswb
    _x5f00__x59cb__x65f6__x95f4_:2008-11-05T16:00:00Z
    =========================================
    =========================================
    ListId:E78A92E8-7831-4E1F-B222-B370E0F7AC8B
    WebId:42EF18F6-3FA5-4CAF-A176-3F0F1E81B8AB
    ID:1
    _x59d3__x540d_:virusswb
    _x5f00__x59cb__x65f6__x95f4_:
    =========================================
    数据显示完毕

    说明什么呢,说明它所谓的联合查询crossing query不是我以前理解的那种联合两个表来查询内容,比如说联合学生表和学生课程关系表和课程表查询学生的选课情况,而是把你指定的lists中的列表记录中,有你关心的列的记录全部找出来,可能列表1是:姓名,性别,列表2是:姓名,爱好,特长
    查询列表1和列表2的结果就是
    virusswb,男性(来自列表1)
    virusswb,体育,.NET(来自列表2)

    我错了,方向性错误,555555555555555555555555

    为什么不支持sql中的联合查询呢,我认为很有用啊,还是我没有发现,请发现者可以留言,谢谢。

    【Blog】http://virusswb.cnblogs.com/

    【MSN】jorden008@hotmail.com

    【说明】转载请标明出处,谢谢

    反馈文章质量,你可以通过快速通道评论:

  • 相关阅读:
    利用Event和MapFile进程共享信息
    基于不可靠数据报的文件传输
    Simple .NET code and memory profiler
    一步一步Asp.Net MVC系列_权限管理之权限控制
    新的起点,新的开始
    找工作的你需要了解和准备的东西
    我的大学读书生涯
    一步一步Asp.Net MVC系列_权限管理数据库与ViewModel篇
    一步一步asp.net_日志导航
    一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)
  • 原文地址:https://www.cnblogs.com/virusswb/p/1327990.html
Copyright © 2020-2023  润新知