Doyle

Doyle's Memories off

导航

创建 Web 部件来显示 SharePoint Portal Server 的搜索数据

创建 Web 部件来显示 SharePoint Portal Server 的搜索数据
发布日期: 09/19/2004 | 更新日期: 09/19/2004
Rohit Puri
Rahul Sakdeo
Michael Talley
Christopher Hall
Gabe Bratton
Microsoft Corporation

适用于:
Microsoft Office SharePoint Portal Server 2003

摘要:学习如何从运行 SharePoint Portal Server 的计算机上收集与搜索相关的数据,以及如何创建 Web 部件来查看和筛选收集的数据,例如某个日期范围内的数据、某天的数据以及某个用户的数据。了解如何使用 SQL DTS 软件包和存储过程,将 Internet 信息服务 (IIS) 日志文件项加载到 SQL Server 数据库,以及如何创建 Web 部件来显示 SharePoint Portal Server 页面中的数据。



本页内容
简介
存储数据:创建数据库、相关存储过程和 DTS 软件包
创建 Web 部件来显示搜索数据
关于日期的注释
小结

简介
可以利用 Microsoft Office SharePoint Portal Server 2003 中的强大搜索数据集合,创建端对端的解决方案来执行搜索项数据的收集和查看。SharePoint Portal Server 会自动记录搜索项数据。在本文中,我们会展示如何将这种数据从每天的日志文件合并到 SQL Server 数据库中,并且使其可用于快速检索和分析。我们将详细说明要实现该任务需要执行的下列高级步骤:

1.
创建 SQL 数据库、相关的存储过程和 DTS 软件包,以便将日志文件数据加载到数据库中。

2.
创建 Web 部件以查看并筛选来自 SQL 数据库的搜索数据。


请注意,在 IIS 日志文件中记录并传输到数据库的搜索结果不包括查询的作用域信息(如果适用),也不包括仅属性查询的结果,例如查询由特定人员创建的文档。

注 本文假设您对 SharePoint Portal Server、.NET Framework 技术(例如 ASP.NET)以及 Microsoft Visual C# 编程语言具有非常深入的理解。您应该将本文与 Microsoft SharePoint Products and Technologies 2003 Software Development Kit (SDK) 中的其他参考资料一起使用。

返回页首
存储数据:创建数据库、相关存储过程和 DTS 软件包
对于中央存储和简单查询,我们建议将搜索项数据信息从 IIS 日志文件加载到 SQL Server 数据库中。要采取三个步骤,如下所示:

1.
创建数据库和表。

2.
创建存储过程。

3.
创建数据转换服务 (DTS) 软件包。


步骤 1. 创建数据库和表
使用“企业管理器”或相似的工具,在 SQL Server 计算机上创建数据库,以存储 IIS 日志文件信息、存储过程和 DTS 软件包。

在新的 SQL 数据库中创建以下两个表:

• tblLogItems

• tblSearchTerms


每个表都应该具有以下结构:

[DateData] [varchar] (255)注 对于 tblSearchTerms 表中的 [DateData],该字段的类型为 [datetime] (8)。

[TimeData] [varchar] (255)
[IP] [varchar] (255)
[Type] [varchar] (255)
[Page] [varchar] (255)
[SearchTermData] [varchar] (255)
[Port] [varchar] (255)
[UserData] [varchar] (255)
[IP2] [varchar] (255)
[Browser] [varchar] (255)
[HTTPCode] [varchar] (255)
[Col012] [varchar] (255)
[Col013] [varchar] (255)
[Col014] [varchar] (255)
[Col015] [varchar] (255)

注 DateData、TimeData、SearchTermData 和 UserData 字段用于 Web 部件查询中。IIS 日志文件中收集的其他信息存储在表中,可以通过修改 Web 部件查询来使用。

步骤 2. 创建存储过程
在本步骤中,创建以下八个存储过程:

• sp_ReturnFileName

• sp_DeleteIDA

• sp_AppendTerms

• sp_UpdateSearchTermData

• sp_GetDateData

• sp_GetUserData

• sp_GetDatabyDate

• sp_GetDatabyUser


存储过程 #1: sp_ReturnFileName
下面的存储过程,由 DTS 软件包使用,它返回前一天的 IIS 日志文件名。可以为 @stPrefix 变量指定不同的本地路径或通用命名约定 (UNC) 值。IIS 日志文件存储在路径 \WINDOWS\system32\LogFiles\W3SVC1\ 中,但可以将这些文件复制到另一个位置以便将来导入到数据库中。

注 您必须更改 @stPrefix 的变量声明,以便准确匹配您为本地路径或 UNC 路径指定的字符串的长度。

CREATE PROCEDURE sp_ReturnFileName
AS
  DECLARE @dtRetrieveFile datetime,
  @stPrefix char(25),
  @stSuffix char(4),
  @stTemp char(2),
  @stYear char(2),
  @stMonth char(2),
  @stDay char(2)

  SET @dtRetrieveFile = DateAdd(d, -1, GetDate())
  -- may include UNC or local path in @stPrefix
  -- change declaration to the number
  -- of characters in @stPrefix
  SET @stPrefix = '\\server_name\share\ex'
  SET @stSuffix = '.log'
 
  -- Get two-digit year
  SET @stYear = Cast(Right(DatePart(yy,@dtRetrieveFile), 2) As char(2))

  -- Get two-digit month
  SET @stTemp = Cast(Datepart(mm,@dtRetrieveFile) As char(2))
  SELECT @stMonth =
  CASE Len(@stTemp)
   WHEN 1 THEN '0' + @stTemp
   ELSE @stTemp
  END

  -- Get two-digit day
  SET @stTemp = Cast(DatePart(dd,@dtRetrieveFile) As char(2))
  SELECT @stDay =
  CASE Len(@stTemp)
   WHEN 1 THEN '0' + @stTemp
   ELSE @stTemp
  END

  SELECT @stPrefix + @stYear + @stMonth + @stDay + @stSuffix
GO

存储过程 #2: sp_DeleteIDA
下面的存储过程,用于 DTS 软件包中,它从 tblLogItems 表中删除不相关的项。

CREATE PROCEDURE sp_DeleteIDA
AS
DELETE tblLogItems WHERE SearchTermData = '/default.ida' Or SearchTermData Like '%root.exe'
GO

存储过程 #3: sp_AppendTerms
下面的存储过程用于 DTS 软件包中,它将包含搜索项目的记录从 tblLogItems 表添加到 tblSearchTerms 表中。DateData 字段从 IIS 日志文件格式 (yyyy-mm-dd) 转换为 USA 格式 (mm/dd/yyyy),以适应显示目的以及在 Web 部件代码中更简便的进行查询。

CREATE PROCEDURE dbo.sp_AppendTerms
AS INSERT INTO dbo.tblSearchTerms
           (DateData, TimeData, IP, Page, SearchTermData,
           Port, UserData, IP2, Browser, HTTPCode, Col012,
           Col013, Type)
SELECT   CAST(DateData AS DateTime), TimeData, IP, Page, SearchTermData,
Port, UserData, IP2, Browser, HTTPCode, Col012, Col013, Type
FROM     dbo.tblLogItems
WHERE   (Type LIKE 'POST') AND (NOT (UserData LIKE '-')) AND (NOT (SearchTermData LIKE '-'))
GO

存储过程 #4: sp_UpdateSearchTermData
下面的存储过程用于 DTS 软件包中,它清除最近添加到 tblSearchTerms 表中的搜索项。

CREATE PROCEDURE dbo.sp_UpdateSearchTermData
AS UPDATE  dbo.tblSearchTerms
SET       SearchTermData = REPLACE(SUBSTRING(SearchTermData, 64,
PATINDEX('%+Search+Server+Name%', SearchTermData) - 64), '+', ' ')
WHERE   (PATINDEX('%+Search+Server+Name%', SearchTermData) > 0)
GO

存储过程 #5: sp_GetDateData
下面的存储过程由 Web 部件使用,它从 tblSearchTerms 表中检索日期的列表。

CREATE PROCEDURE dbo.sp_GetDateData
AS SELECT DISTINCT DateData
FROM     dbo.tblSearchTerms
GROUP BY DateData
GO

存储过程 #6: sp_GetUserData
下面的存储过程由 Web 部件使用,它从 tblSearchTerms 表中检索不同用户的列表。

CREATE PROCEDURE dbo.sp_GetUserData
AS SELECT DISTINCT UserData
FROM     dbo.tblSearchTerms
GROUP BY UserData
GO

存储过程 #7: sp_GetDatabyDate
下面的存储过程由 Web 部件使用,它用于从 tblSearchTerms 表中检索特定日期或日期范围的搜索项。

CREATE PROCEDURE dbo.sp_GetDatabyDate(@StartDate DATETIME,
@EndDate DATETIME)
AS SELECT   SearchTermData, DateData, COUNT(SearchTermData) AS strCount
FROM     dbo.tblSearchTerms
WHERE   (DateData >= @StartDate) AND (DateData <= @EndDate)
GROUP BY SearchTermData, DateData
GO

存储过程 #8: sp_GetDatabyUser
下面的存储过程由 Web 部件使用,它用于从 tblSearchTerms 表中检索特定用户的搜索项。

CREATE PROCEDURE dbo.sp_GetDatabyUser
(@UserName VARCHAR(255))
AS SELECT   SearchTermData, DateData, COUNT(SearchTermData) AS strCount
FROM     dbo.tblSearchTerms
WHERE   (UserData = @UserName)
GROUP BY SearchTermData, DateData
GO

步骤 3. 创建 DTS 软件包
数据转换服务 (DTS) 软件包是使用 SQL Server Enterprise Manager 中的 DTS 设计器创建的。要创建一个软件包,请右键单击 SQL Server 实例下的 Data Transformation Services 文件夹,然后选择 New Package。

要创建 DTS 软件包,请执行以下七个步骤:

• 创建连接。

• 创建动态属性任务。

• 创建执行 SQL 任务。

• 创建连接间的工作流。

• 创建工作流的其余部分。

• 重置动态属性任务。

• 保存 DTS 软件包并安排其每天运行一次。


创建连接
1.
插入新的 Text File (Source) 连接。

2.
在 File Name 框中,浏览到现有 IIS 日志文件或键入到该文件的路径。

3.
在“Text File Properties”向导的 Select File Format 步骤中,单击 Delimited,然后单击 Next。

4.
在 Specify Column Delimiter 中,单击 Other,然后键入一个空格。现在,您应该看到在 Preview 框中的 IIS 日志文件项。

5.
单击 Finish,然后单击 OK。

6.
键入新的 Microsoft OLE DB Provider for SQL Server 连接。

7.
根据您的环境,选择 Server 和 Database,然后单击 OK。


创建动态属性任务
1.
键入新的动态属性任务。

2.
命名任务 ReturnFileName,然后在 Dynamic Properties Task Properties 中,单击 Add。

3.
在 Dynamic Properties Task: Package Properties 对话框中,选择 Text File (Source) 连接。

4.
选择 DataSource 属性,然后单击 Set。

5.
在 Add/Edit Assignment 对话框中,对于 Source,选择 Query。

6.
对于 Connection,选择 Microsoft OLE DB Provider for SQL Server。

7.
在 Query 框中,键入 execute sp_ReturnFileName。

8.
单击 Refresh,然后确认 Preview 框包含存储过程 sp_ReturnFileName 的结果。

9.
单击 OK,然后再次单击 OK。


创建执行 SQL 任务
• 插入新的执行 SQL 任务。

• 命名新任务 DeleteIDA,然后对于 Connection,选择 Microsoft OLE DB Provider for SQL Server。

• 在 SQL statement 框中,键入 execute sp_DeleteIDA。

• 单击 Parse Query 确认该语法,单击 OK 关闭该消息,然后再次单击 OK。

• 插入新的执行 SQL 任务。

• 命名新任务 AppendTerms,然后对于 Connection,选择 Microsoft OLE DB Provider for SQL Server。

• 在 SQL statement 框中,键入 execute sp_AppendTerms。

• 单击 Parse Query 确认该语法,单击 OK 关闭该消息,然后再次单击 OK。

• 插入新的执行 SQL 任务。

• 命名新任务 UpdateSearchTermData,然后对于 Connection,选择 Microsoft OLE DB Provider for SQL Server。

• 在 SQL statement 框中,键入 execute sp_UpdateSearchTermData。

• 单击 Parse Query 确认该语法,单击 OK 关闭该消息,然后再次单击 OK。


创建连接间的工作流
1.
选择 Text File (Source) 连接。

2.
按下 Ctrl 键并保持不放,然后选择 Microsoft OLE DB Provider for SQL Server。

3.
右键单击 Transform Data Task 以选择它,然后双击从 Text File (Source) 连接指向 Microsoft OLE DB Provider for SQL Server 连接的箭头。

4.
在 Source 选项卡上,命名任务 Copy Log。

5.
在 Destination 选项卡上,选择 tblLogItems 表。

6.
在 Transformations 选项卡上,确认存在箭头(如果没有,按照前后顺序,将文本文件中的字段映射到表中),然后单击 OK。


创建工作流的其余部分
1.
选择 ReturnFileName 任务。

2.
按下 Ctrl 键并保持不放,然后选择 Text File (Source) 连接。

3.
在 Workflow 菜单上,单击 On Success。

4.
选择 Microsoft OLE DB Provider for SQL Server 连接。

5.
按下 Ctrl 键并保持不放,然后选择 DeleteIDA 任务。

6.
在 Workflow 菜单上,选择 On Success。

7.
选择 DeleteIDA 任务。

8.
按下 Ctrl 键并保持不放,然后选择 AppendTerms 任务。

9.
在 Workflow 菜单上,单击 On Success。

10.
选择 AppendTerms 任务。

11.
按下 Ctrl 键并保持不放,然后选择 UpdateSearchTermData 任务。

12.
在 Workflow 菜单上,单击 On Success。


重置动态属性任务
1.
右键单击 ReturnFileName 任务,选择 Properties,然后单击 Edit。

2.
对于 Text File (Source) 连接,突出显示 DataSource,然后单击 Set。

3.
单击 Refresh。

4.
单击 OK,然后再次单击 OK。


保存 DTS 软件包并安排其每天运行一次
1.
在 Package 菜单上,单击 Save As,然后保存带有描述性名称的 DTS 软件包。

2.
关闭 DTS 软件包设计器。

3.
在 Data Transformation Services 文件夹中,右键单击该 DTS 软件包,然后选择 Schedule Package。

4.
在 Edit Recurring Job Schedule 对话框中,选择 Daily,然后将频率设置为每天进行一次,即某个服务器不忙的时间。

注 DTS 软件包导入前一天的 IIS 日志文件。


返回页首
创建 Web 部件来显示搜索数据
在将必要的数据存储在 SQL 表并且 DTS 软件包至少执行一次后,您可以使用 Web 部件来查询数据,可以筛选数据并显示在 SharePoint Portal Server 计算机上执行的搜索摘要。现在,我们研究一下如何创建一个允许您以下面三种方式来查看数据的用户界面:

• 某个日期范围内的数据。

• 某个日期的数据。

• 某个用户的数据。

注 不需要创建自定义的 Web 部件,您可以使用 SharePoint 数据视图 Web 部件,并且可以在 Microsoft Office FrontPage 2003 中对它进行配置以查看 SQL 表中的数据。有关数据视图 Web 部件的详细信息,请参阅 Microsoft Office FrontPage 2003 帮助。


创建基本的 Web 部件
开始创建 Web 部件来显示搜索数据。该过程并未在本文中进行阐述,但是您可以按照 MSDN 文章 Creating a Basic Web Part 中的步骤完成。要获得该过程的快速入门,可以下载 Web Part Templates for Visual Studio .NET (WebPartTemplatesforVSNetSample2.exe)。完成后,可以添加一个对 System.Data.dll 的引用。

修改默认代码文件以添加演示代码
可以对基本 Web 部件的默认代码进行基本的添加和修改,以允许它显示 tblSearchTerms 表中的数据,通过下列操作完成上述任务:

• 添加命名空间指令。

• 定义类级别的变量。

• 定义子控件。

• 编写单击事件的代码以获得基于用户选择的搜索统计。

• 修改 RenderWebPart 方法。


添加命名空间指令
1.
在 Visual Studio .NET 中,打开解决方案资源管理器,然后双击 WebPart1.cs。

2.
在代码的顶端附近,将以下命名空间指令添加到 Web 部件。

3.
using Microsoft.SharePoint.Utilities;

4.
using Microsoft.SharePoint.WebPartPages;

5.
using Microsoft.SharePoint.WebControls;

6.
using System.Web.UI.HtmlControls;

7.
using System.Data;

8.
using System.Data.OleDb;

9.
using System.Data.SqlClient;


定义类级别的变量
在定义类级别的变量后,替换 Server_Name 和 Database_Name 以反映您的环境。请使用以下代码:

private string text ="";
const string tblName = "tblSearchTerms";
const string strConn = "Data Source=Server_Name;Initial
Catalog=Database_Name;Integrated Security=SSPI;";

HtmlSelect startDate,endDate,selectDay,selectUser;
Label lblDateRange,lblDay,lblUser;
HtmlButton btnDateRange,btnDay,btnUser;
string sTableData="";
HtmlTextArea Result;

const string defaultText = "";

private SPWeb oWeb = null;

定义子控件
使用 HTML 子控件来提供用户界面。定义四个 HtmlSelect 控件来显示用户的三个选择,以便获得如下搜索统计数据:

• 数据范围(每天完成搜索的数量)。

• 当天数据(当天搜索的内容以及搜索的次数)。

• 用户数据(用户搜索的内容以及用户搜索的次数)。


还可以定义一个 HtmlTextArea 控件来显示结果,并定义三个 HtmlButton 控件来执行前面三个选择中每个的代码。

将以下代码行添加到 CreateChildControls。

oWeb = SPControl.GetContextWeb(Context);

//Result text area
Result = new HtmlTextArea();
Result.Cols = 50;

//Start Date, End Date, Day, User combo boxes
startDate = new HtmlSelect();
endDate = new HtmlSelect();
selectDay = new HtmlSelect();
selectUser = new HtmlSelect();

//Respective labels
lblDateRange = new Label();
lblDateRange.Text = "Date Range Data:";
lblDay = new Label();
lblDay.Text = "Day Data:";
lblUser = new Label ();
lblUser.Text = "User Data:";

//Buttons to execute queries and their click events
btnDateRange = new HtmlButton();
btnDateRange.InnerText = "Go";
btnDateRange.ServerClick += new EventHandler (btnDateRange_click);
btnDay = new HtmlButton();
btnDay.InnerText = "Go";
btnDay.ServerClick += new EventHandler (btnDay_click);
btnUser = new HtmlButton();
btnUser.InnerText = "Go";
btnUser.ServerClick += new EventHandler (btnUser_click);

//Populate the Date Range, Day, and user combo boxes with data
//from the table
SqlConnection objConn = new SqlConnection(strConn);

//Set up stored procedure calls
SqlCommand cmdDate = new SqlCommand("sp_GetDateData", objConn);
SqlCommand cmdUsers = new SqlCommand("sp_GetUserData", objConn);
cmdDate.CommandType = CommandType.StoredProcedure;
cmdUsers.CommandType = CommandType.StoredProcedure;

try
{
  //Open stored procedure for Dates
  SqlDataReader drDate;
  objConn.Open();
  drDate = cmdDate.ExecuteReader();

  //Read dates into the controls
  while (drDate.Read())
  {
   //Convert the time zone of the date to UTC
   //FormatDate converts it back to a local time
   //on the SharePoint Portal Server computer; the following two
   //lines negate time zone conversions but
   //are necessary to show dates in the local SharePoint calendar
   System.DateTime myDate = oWeb.RegionalSettings.TimeZone.LocalTimeToUTC((System.DateTime)drDate
   .GetValue(0));
   string myFormattedDate = SPUtility.FormatDate(oWeb,myDate,SPDateFormat.DateOnly);
   startDate.Items.Add(SPEncode.HtmlEncode(myFormattedDate));
   endDate.Items.Add(SPEncode.HtmlEncode(myFormattedDate));
   selectDay.Items.Add(SPEncode.HtmlEncode(myFormattedDate));
  }

  //Close reader and connection
  drDate.Close();
  objConn.Close();
}
catch(Exception ex)
{
  Result.InnerText = "An Error has occurred: " + ex.Message;
}

try
{
  //Open stored procedure for Users
  SqlDataReader drUsers;
  objConn.Open();
  drUsers = cmdUsers.ExecuteReader();

  //Read users into the control
  while (drUsers.Read())
  {
   selectUser.Items.Add(drUsers.GetValue(0).ToString());
  }
  //Close reader and connection
  drUsers.Close();
  objConn.Close();
}
catch(Exception ex)
{
  Result.InnerText = "An Error has occurred: " + ex.Message;
}
//Add all the controls to render
Controls.Add (startDate);
Controls.Add (endDate);
Controls.Add (btnDateRange);
Controls.Add (selectDay);
Controls.Add (btnDay);
Controls.Add (selectUser);
Controls.Add (btnUser);
Controls.Add (Result);
Controls.Add (lblDateRange);
Controls.Add (lblUser);
Controls.Add (lblDay);

编写 HtmlButton 控件的单击事件代码
在每个单击事件中,使用 SqlConnection 来打开到包含 tblSearchTerms 表的数据库的连接,并据此运行各自的查询。在找回数据后,将其传递到显示结果的 Web 部件上的 HtmlTextArea 控件。

在 CreateChildControls 部分后添加以下代码:

public void btnDateRange_click(object sender, EventArgs e)
{
  //Use ParseDate to convert from SharePoint calendar date
  //to System.DateTime
  //Use a time value of "12:00:00" as a placeholder to ensure
  //time conversion does not cross dates
  //Use the Date property of the System.DateTime object;
  //these dates are used for the stored procedure
  System.DateTime dtStartDate =
  SPUtility.ParseDate(oWeb,startDate.Value.ToString(),"12:00:00",false).Date;
  System.DateTime dtEndDate =
  SPUtility.ParseDate(oWeb,endDate.Value.ToString(),"12:00:00",false).Date;
  int cntRows = new Int16();

  //Set up connection
  SqlConnection objConn = new SqlConnection(strConn);
  //Set up sp command
  SqlCommand cmdDateFiltered = new SqlCommand("sp_GetDatabyDate", objConn);
  cmdDateFiltered.CommandType = CommandType.StoredProcedure;
 
  //Add Parameters to sp command
  cmdDateFiltered.Parameters.Add("@StartDate", SqlDbType.DateTime);
  cmdDateFiltered.Parameters["@StartDate"].Value = dtStartDate;
  cmdDateFiltered.Parameters.Add("@EndDate", SqlDbType.DateTime);
  cmdDateFiltered.Parameters["@EndDate"].Value = dtEndDate;

  try
  {
   SqlDataReader drDateFiltered;
   objConn.Open();
   drDateFiltered = cmdDateFiltered.ExecuteReader();
   while (drDateFiltered.Read())
   {
     //Read data into variables
     string myTerm = drDateFiltered.GetValue(0).ToString();
     //Convert the time zone of the date to UTC
     //FormatDate converts it back to a local time
     //on the SharePoint Portal Server computer
     //The following two lines negate time zone conversions but
     //are necessary to show dates in the local SharePoint calendar
     System.DateTime myDate =
     oWeb.RegionalSettings.TimeZone.LocalTimeToUTC((System.DateTime)drDateFiltered.GetValue(1));
     string myFormattedDate = SPUtility.FormatDate(oWeb,myDate,SPDateFormat.DateOnly);
     sTableData = sTableData + myFormattedDate + "\t" + myTerm +
     "\t" + myStrCount + "\n";
     cntRows += 1;
   }

   //Close reader and connection
   drDateFiltered.Close();
   objConn.Close();
  }
  catch(Exception ex)
  {
   Result.InnerText = "An error has occurred: \n" + ex.Message;
  }
 
  //Set row count on HTML control and fill with result
  Result.Rows = cntRows + 2;
  Result.InnerText = "Date" + "\t" + "Search Term" + "\t" + "Count"
  + "\n" + "------------------------------------" +"\n" + SPEncode.HtmlEncode(sTableData);
}

public void btnDay_click(object sender, EventArgs e)
{
  //Use ParseDate to convert from SharePoint calendar date
  //to System.DateTime
  //Use a time value of "12:00:00" as a placeholder to ensure
  //time conversion does not cross dates
  //Use the Date property of the System.DateTime object;
  //this date is used for the stored procedure
  System.DateTime dtStartDate =
  SPUtility.ParseDate(oWeb,selectDay.Value.ToString(),"12:00:00",false).Date;
  int cntRows = new Int16();

  //Set up connection
  SqlConnection objConn = new SqlConnection(strConn);
 
  //Set up sp command
  SqlCommand cmdDateFiltered = new SqlCommand("sp_GetDatabyDate", objConn);
  cmdDateFiltered.CommandType = CommandType.StoredProcedure;
 
  //Add Parameters to sp command
  cmdDateFiltered.Parameters.Add("@StartDate", SqlDbType.DateTime);
  cmdDateFiltered.Parameters["@StartDate"].Value = dtStartDate;
  cmdDateFiltered.Parameters.Add("@EndDate", SqlDbType.DateTime);
  cmdDateFiltered.Parameters["@EndDate"].Value = dtStartDate;

  try
  {
   SqlDataReader drDateFiltered;
   objConn.Open();
   drDateFiltered = cmdDateFiltered.ExecuteReader();
   while (drDateFiltered.Read())
   {
     //Read data into variables
     string myTerm = drDateFiltered.GetValue(0).ToString();
     //Convert the time zone of the date to UTC
     //FormatDate converts it back to a local time
     //on the SharePoint server. The following two lines
     / egate time zone conversions but are necessary
     //to show dates in the local SharePoint calendar
     System.DateTime myDate =
     oWeb.RegionalSettings.TimeZone.LocalTimeToUTC((System.DateTime)drDateFiltered.GetValue(1));
     string myFormattedDate = SPUtility.FormatDate(oWeb,myDate,SPDateFormat.DateOnly);
     string myStrCount = drDateFiltered.GetValue(2).ToString();
     sTableData = sTableData + myFormattedDate + "\t" + myTerm +
     "\t" + myStrCount + "\n";
     cntRows += 1;
   }

   //Close reader and connection
   drDateFiltered.Close();
   objConn.Close();
  }
  catch(Exception ex)
  {
   Result.InnerText = "An error has occurred: \n" + ex.Message;
  }
 
  //Set row count on HTML control and fill with result
  Result.Rows = cntRows + 2;
  Result.InnerText = "Date" + "\t" + "Search Term" + "\t" + "Count"
  + "\n" + "------------------------------------" +"\n" + SPEncode.HtmlEncode(sTableData);
}

public void btnUser_click(object sender, EventArgs e)
{
  string strUser = selectUser.Value.ToString();
  int cntRows = new Int16();

  //Set up connection
  SqlConnection objConn = new SqlConnection(strConn);
 
  //Set up sp command
  SqlCommand cmdUserFiltered = new SqlCommand("sp_GetDatabyUser", objConn);
  cmdUserFiltered.CommandType = CommandType.StoredProcedure;
 
  //Add Parameters to sp command
  cmdUserFiltered.Parameters.Add("@UserName", SqlDbType.VarChar,255);
  cmdUserFiltered.Parameters["@UserName"].Value = strUser;
 
  try
  {
   SqlDataReader drUserFiltered;
   objConn.Open();
   drUserFiltered = cmdUserFiltered.ExecuteReader();
   while (drUserFiltered.Read())
   {
     //Read data into variables
     string myTerm = drUserFiltered.GetValue(0).ToString();
     //Convert the time zone of the date to UTC
     //FormatDate converts it back to a local time
     //on the SharePoint Portal Server computer.
     //The following two lines negate time zone conversions but
     //are necessary to show dates in the local SharePoint calendar
     System.DateTime myDate =
     oWeb.RegionalSettings.TimeZone.LocalTimeToUTC((System.DateTime)drUserFiltered.GetValue(1));
     string myFormattedDate = SPUtility.FormatDate(oWeb,myDate,SPDateFormat.DateOnly);
     string myStrCount = drUserFiltered.GetValue(2).ToString();
     sTableData = sTableData + myFormattedDate + "\t" + myTerm +
     "\t" + myStrCount + "\n";
     cntRows += 1;
   }

   //Close reader and connection
   drUserFiltered.Close();
   objConn.Close();
  }
  catch(Exception ex)
  {
   Result.InnerText = "An error has occurred: \n" + ex.Message;
  }
 
  //Set row count on HTML control and fill with result
  Result.Rows = cntRows + 2;
  Result.InnerText = "Date" + "\t" + "Search Term" + "\t" + "Count"
  + "\n" + "------------------------------------" +"\n" +
  SPEncode.HtmlEncode(sTableData);
}

修改 RenderWebPart 方法
最后,您需要修改 RenderWebPart 方法中的代码,以在 Web 部件中呈现子控件。在 RenderWebPart 中添加以下代码。

lblDateRange.RenderControl(output);
output.Write(text);
startDate.RenderControl(output);
endDate.RenderControl(output);
btnDateRange.RenderControl(output);
output.Write(text);
lblDay.RenderControl(output);
output.Write(text);
selectDay.RenderControl(output);
btnDay.RenderControl(output);
output.Write(text);
lblUser.RenderControl(output);
output.Write(text);
selectUser.RenderControl(output);
btnUser.RenderControl(output);
output.Write(text);
output.Write(text);
Result.RenderControl(output);
output.Write(text);

返回页首
关于日期的注释
SQL 存储过程和 Web 部件代码假设您从一个时区中的一台 SharePoint Portal Server 计算机中累积数据。可以修改存储过程和 Web 部件代码以包括时间信息,但是时区信息会根据 Web 部件当前运行的 SharePoint Portal Server 配置进行调整,而不是根据所执行的每个单独搜索的时区信息。

在浏览器中显示和检索日期信息时,会分别使用 SPUtility 类的 FormatDate 和 ParseDate 方法。Web 部件代码和 SQL Server 计算机之间的日期操作是使用 .NET System.DateTime 对象进行处理的。

SPUtility 类的 FormatDate 方法会将日期的时区调整为本地 SharePoint Portal Server 计算机的时区,并且会设置日期的格式,以便它可以显示在 SharePoint Portal Server 计算机的本地日历中。示例代码并没有考虑搜索发生的时间。此外,时间“12:00:00”会传递到 ParseDate 方法,以确保从 Web 部件检索并且随后用于存储过程的日期没有跨天进行调整。

返回页首
小结
在 SQL Server 数据库中累积 Microsoft Office SharePoint Portal Server 2003 搜索项数据,然后使用自定义的 Web 部件查询并显示信息是一种非常强大的方法,该方法可以查看包含在每天 IIS 日志文件中的数据。SharePoint Portal Server 会自动记录搜索项数据。但是,通过将这种数据从每天的日志文件合并到 SQL Server 数据库,可以使数据用于快速检索和分析。

posted on 2004-11-06 22:58  Doyle  阅读(390)  评论(0编辑  收藏  举报