打印本文 打印本文 关闭窗口 关闭窗口
使用 ASP.NET Community Starter Kit建造网站
作者:武汉SEO闵涛  文章来源:敏韬网  点击数6105  更新时间:2009/4/23 10:44:10  文章录入:mintao  责任编辑:mintao
   ),

   CONSTRAINT [FK_Community_Faqs_Community_ContentPages]

   FOREIGN KEY

   (

      [Faq_ContentPageID]

   ) REFERENCES [Community_ContentPages] (

   [contentPage_id]

   ) ON DELETE CASCADE

可以看到表的命名方式和数据类型与CSK中的其它模块都是一致的,这样的编程习惯在国内实在是难以做到。

我们存储FAQ的答案和参考索引的字段是ntext类型,这是为了能支持大数据量的文本(可高达1GB)。还要注意的是Faq_Answer是一个必要字段而Faq_Reference可以是空值。我们的主键(Faq_ContentpageID)关联到Community_Contentpages表中的附加内容。另外一个要注意的细节是外键的约束(级联删除)的使用,保证的数据关联的完整性,并且节省了程序代码。

CSK使用名为Community_ContentpagesDeleteContentPage(太长了吧)的存储过程删除Community_ContentPages表中的记录。当这个存储过程删除记录时,服务器根据外键自动删除FAQ表中的对应记录。

增加存储过程

下面我们要做的是建立增加、编辑、读取单个、读取多个记录的存储过程,在代码中不会出现SQL的代码。从封装性和安全性来看,这样做是一种很好的习惯。

Community_FaqsAddFaq

下面是增加一条新的FAQ记录的存储过程。我们不需要给两个表中的每个字段填充数值。例如,我们不需要填充Contentpage_ViewCount列(默认为0),也不需要在ContentPage_DateCommented中填写日期。

CREATE PROCEDURE Community_FaqsAddFaq
(
   @communityID int,
   @sectionID int,
   @username nvarchar(50),
   @topicID int,
   @question nvarchar(100),
   @introduction nvarchar(500),
   @metaDescription nvarchar(250),
   @metaKeys nvarchar(250),
   @moderationStatus int,
   @answer ntext,
   @reference ntext
)
AS
DECLARE @ContentPageID int
DECLARE @pageType int
SET @pageType = dbo.Community_GetPageTypeFromName(''''Faq'''')
DECLARE @userID int
SET @userID = dbo.Community_GetUserID(@communityID, @username);
BEGIN TRAN
EXEC @ContentPageID = Community_AddContentPage
   @communityID,
   @sectionID,
   @userID,
   @question,
   @introduction,
   @metaDescription,
   @metaKeys,
   @pageType,
   @moderationStatus,
   @topicID
 
INSERT Community_Faqs
(
   Faq_ContentPageID,
   Faq_Answer,
   Faq_Reference
)
 
VALUES
(
   @ContentPageID,
   @answer,
   @reference
)
COMMIT TRAN
RETURN @ContentPageID

注意这里使用了两个CSK提供的UDF(User Defined Function),第一个UDF取回页面类型,CSK中每个模块都有唯一的页面类型。第二个存储过程是根据Community和用户名取回UserId。

由于我们要在两个不同表中插入记录,所以在这里使用了事务来保证操作的原子性。其中往Community_ContentPages表中插入记录是通过调用Communit_AddContentPage这个存储过程来完成的,把FAQ的问题作为@Title参数、介绍作为@Description参数。AddContentPage执行完后返回新增记录的主键值,该数值被用于往Community_Faqs中新增记录。

在CSK中所有新增记录的存储过程必须返回主键值作为结果。

得到新的ContentPageID数值在系统的上层是很有用的,这一点我们将在后面写数据访问组件时看到。

Community_FaqsEditFaq

这个用于修改已有的FAQ记录的存储过程需要的参数比前面少了很多。因为有些字段在我们增加记录之后就不会再被修改,如区域编号等。其代码如下:

CREATE PROCEDURE Community_FaqsEditFaq
(
   @communityID int,
   @contentPageID int,
   @username NVarchar(50),
   @topicID int,
   @question NVarchar(100),
   @introduction NVarchar(500),
   @metaDescription NVarchar(250),
   @metaKeys NVarchar(250),
   @answer Text,
   @reference Text
)
AS
DECLARE @UserID int
SET @UserID = dbo.Community_GetUserID(@communityID, @username)

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

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