打印本文 打印本文 关闭窗口 关闭窗口
使用 ASP.NET Community Starter Kit建造网站
作者:武汉SEO闵涛  文章来源:敏韬网  点击数6105  更新时间:2009/4/23 10:44:10  文章录入:mintao  责任编辑:mintao
EXEC Community_EditContentPage
   @contentPageID,
   @userID,
   @question,
   @introduction,
   @metaDescription,
   @metaKeys,
   @topicID
UPDATE Community_Faqs SET
   Faq_Answer = @answer,
   Faq_Reference = @reference
WHERE Faq_ContentPageID = @contentPageID

这里我们又一次使用了CSK中的存储过程Community_ContentPages,然后用Update的SQL更新Community_Faqs。与新增FAQ的存储过程相比,这里没有使用事务来保证更新操作的原子性。我们遵循了CSK中已经建立的模式,这里都不使用事务。也许是设计者认为更新操作失败的可能性比新增要小的多,减少不必要的资源锁定来提高系统数据吞吐能力吧。

Community_FaqsGetFaqs

接下来要写的存储过程是返回某个社区内给定范围的所有FAQ记录。这个名为Community_GetPagedSortedContent的存储过程,在原来的基础上增加了针对FAQ列的参数,并用IndexID排序。

CREATE PROCEDURE Community_FaqsGetFaqs
(
   @communityID int,
   @username NVarchar(50),
   @sectionID int,
   @pageSize int,
   @pageIndex int,
   @sortOrder NVarchar(50)
)
AS
DECLARE @currentDate DATETIME
SET @currentDate = GetUtcDate()
SELECT
   null Faq_Answer,
   null Faq_Reference,
   Content.*
FROM
   dbo.Community_GetPagedSortedContent
   (
      @communityID,
      @username,
      @sectionID,
      @currentDate,
      @sortOrder,
      @pageSize,
      @pageIndex,
      default
   ) Content
ORDER BY
   IndexID

这个存储过程使用了两个减少代码和将来维护量的技巧。首先,我们使用了Content.*作为返回的结果,这里还使用了CSK中的存储过程。从效率上来说,取回所有的列比让数据库推算哪些列是需要的在返回要更有效率。而且,在这里设计师为了更好的兼顾了维护性。如果将来Community_Contentpages的结构有了修改(如增加列),并不需要修改或测试相关的存储过程。

第二个要指出的是结果集中的两个空列(Faq_Answer和Faq_Reference)。后面我们将写一个FaqInfo组件来保存来自这个存储过程的多条记录和后面一个存储过程的单条记录。由于我们想使用同一个组件来实现这两种操作,所以我们要填充所有列的信息。因为这两个列可能占用很大空间,而且不会在FAQ的统计列表中显示,所以这里我们就用NULL值来代替。

Community_FaqsGetFaq

这个存储过程我们要用来取得一条单独的记录和其它相关的功能。它还需要增加这个页面的访问计数和告诉用户开始读取页面的内容。这些任务是通过执行CSK的Community_ContnetpagesTrackStats过程来完成的,整个过程代码如下:

CREATE PROCEDURE Community_FaqsGetFaq
(
   @communityID INT,
   @username NVarchar(50),
   @contentPageID int
)
AS
DECLARE @userID INT
SET @userID = dbo.Community_GetUserID(@communityID, @username)
-- Update ViewCount and HasRead Stats
EXEC Community_ContentPagesTrackStats @userID, @contentPageID
DECLARE @currentDate DATETIME
SET @currentDate = GetUtcDate()
SELECT
   Faq_Answer,
   Faq_Reference,
   Content.*
FROM
   dbo.Community_GetContentItem(
      @communityID,
      @userID,
      @currentDate) Content
   JOIN Community_Faqs (nolock)
      ON ContentPage_ID = Faq_ContentPageID
WHERE
   ContentPage_ID = @contentPageID

注意由于要显示明细,这里我们读取了Faq_Answer和Faq_Reference列的实际值。这里我们在join连接Community_Faqs表时使用了nolock的选项,这将允许我们执行脏读取而不会有任何警告提示。(和数据库锁定机制有关)

初始化FAQ模块

每一个社区模块都有一个维护用的存储过程用来填充数据库中与模块运行关的信息设置内容。譬如我们要通过在Community_PageTypes中增加记录来注册页面类型:一条信息是关于显示FAQ列表的页面,另一条是显示单个FAQ详细信息的页面。为了遵循CSK一致的命名规则我们把这个存储过程叫做Community_MaintenanceInitializeFaqs,其中部分代码摘录如下:

IF NOT EXISTS (SELECT * FROM Community_PageTypes
               WHERE pageType_Name=''''Faq Section'''')
   BEGIN
   INSERT Community_PageTypes
   (
      pageType_name,
      pageType_description,
      pageType_pageContent,
      pageType_IsSectionType,
      pageType_ServiceSelect
   )
   VALUES
   (
      ''''FAQ Section'''',
      ''''Contains FAQs in a question and answer style format'''',
      ''''ASPNET.StarterKit.Communities.Faqs.FaqSection'''',
      1,
      ''''Community_FaqsServiceSelect''''
   )

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ...  下一页 >> 

打印本文 打印本文 关闭窗口 关闭窗口