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] ... 下一页 >> [C语言系列]使用C#实现ADSL自动拨号 [Web开发]狂人采集器规则使用详解 [电脑技术]windows7快捷键使用大全 [办公软件]PowerPoint模板使用经验之谈 [办公软件]如何在PowerPoint中使用(插入)Media Player控件播… [办公软件]如何在PowerPoint中使用(插入、创建)书签及书签的… [办公软件]如何在PowerPoint中插入(使用)条形码 [办公软件]如何在PowerPoint中制作模板并使用模板 [办公软件]使用PowerPoint制作电子相册教程 [办公软件]可以使用PowerPoint来测试液晶显示器质量
|