看了http://www.cnblogs.com/Heroman/archive/2005/01/20/94806.html后我感觉有必要介绍一下CodeSmith,通常追求挑战的程序员认为设计、开发都是充满乐趣,但重复的开发相同的底层工作却是无味的,我接触过也试用过很多代码生成软件,但不是生成出的代码太复杂,就是有些方面不合自己的胃口,尤其是针对Web开发体会更是如此,通常的代码生成器生成的代码直接支持net.remoting,并且均是对dataset直接操作的,而在通常的小规模的web开发中net.reromting不一定用,而直接对dataset操作要求在session来保存临时编辑的数据,而通常对于web开发来说只要一条一条的对数据库编辑,还有,web开发通常都要有分页设计功能,而自动生成的代码也不是尽如人意。所以我一直寻求一种全方位的自定义的生成工具,哪怕初期开发复杂些,但只要开发一次,以后就可以生成合自己胃口的代码。后来一不小心发现了codesmith终于发现他正是我想要的模板生成工具,以下就以下面这个最典型的数据库结构向大家展示一下我作的模板生成的代码,来说明codesmith能达到的功能。 另外可以在“生成工具-CodeSmith-享受编程的乐趣(三)”中可以下载我写的模板

这个数据库中是面对标准的文章发布功能的主要包括两个表一个是articleClass 另一个是article,在aritclass中是一个标准的树状结构(parentid 和id有一个自联接)而articlass中有一个对于ArticleClassID的外键引用。图中除了parentID字段以外均不能为空,这样开发起来方便些:)


对于数据库的操作通常都是用多层来实现的,本篇四层为例,但目前我只作了下三层的模板,因为界面层变化因素太多通常针对不同的项目有不同的要求,大家可以通常这里介绍的方式根据具体项目来自己实现界面层。

    第一层数据库层,最通常的工作就是作一些存贮过程供下一层调用

    生成的代码如下:
    由于我通常作的开发都是基于Web的所以同时整合了分页操作,另外针对树状结构专门提供了一些贮存过程和函数。
   

------------------------------------------------------------------------------------------------------------------------
--
 the sprocs returns various error/success codes
    -- a return value of 0 means success
    -- a return value of 1 means a dup A_ArticleClass
    -- a return value of 2 means A_ArticleClass doesn't exist
--
----------------------------------------------------------------------------------------------------------------------

/****** Object:  Stored Procedure [dbo].A_ArticleClass_InsertDeleteUpdate    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_InsertDeleteUpdate]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_InsertDeleteUpdate]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_InsertDeleteUpdate]
(
    @ID 
uniqueidentifier    = null,
    @ParentID 
uniqueidentifier    = null,
    @Name 
nvarchar(128)    = null,
    @Description 
ntext    = null,
    @OrderBy 
int    = null,
    @ImgUrl 
nvarchar(128)    = null,
    @IconUrl 
nvarchar(128)    = null,
    @Action 
int
)    
AS
BEGIN
IF @Action = 0
-- Insert
BEGIN
    
IF EXISTS(SELECT * 
            
FROM [dbo].[A_ArticleClass] 
            
WHERE (ID = @ID)
            )
    
RETURN 1
    
IF EXISTS(SELECT * 
            
FROM [dbo].[A_ArticleClass] 
            
WHERE (ParentID = @ParentID) And (Name = @Name)
            )
    
RETURN 1
    
INSERT INTO [dbo].[A_ArticleClass](ID, ParentID, Name, Description, OrderBy, ImgUrl, IconUrl)
        
VALUES (@ID, @ParentID, @Name, @Description, @OrderBy, @ImgUrl, @IconUrl)
    
SELECT * 
        
FROM [dbo].[A_ArticleClass] 
        
WHERE (ID = @ID)
    
RETURN
END
IF @Action = 1
-- Delete
BEGIN
    
IF EXISTS(
    
SELECT * 
            
FROM [dbo].[A_ArticleClass] 
            
WHERE (ID = @ID)
            )
    
BEGIN
        
Delete  
            
FROM [dbo].[A_ArticleClass] 
            
WHERE (ID = @ID)
        
RETURN
    
END
    
ELSE
    
BEGIN
        
RETURN 2
    
END    
END    
IF @Action = 2
-- Update
BEGIN
    
IF EXISTS(
        
SELECT * 
                
FROM [dbo].[A_ArticleClass] 
                
WHERE (ID = @ID)
            )            
    
BEGIN
        
IF EXISTS(SELECT * 
                
FROM [dbo].[A_ArticleClass] 
                
WHERE (ParentID = @ParentID) And (Name = @Name)
                
AND (NOT
                ((ID 
= @ID))
                ))
        
RETURN 1
        
UPDATE [dbo].[A_ArticleClass] 
            
SET
            ParentID 
= @ParentID, Name = @Name, Description = @Description, OrderBy = @OrderBy, ImgUrl = @ImgUrl, IconUrl = @IconUrl
            
WHERE (ID = @ID)
        
RETURN        
    
END
    
ELSE
    
BEGIN
        
RETURN 2
    
END    
END
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetPageData    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_GetPageData]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_GetPageData]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_GetPageData]
(
    @FieldsName 
nvarchar(512= 'A.*',
    @Where 
nvarchar(512= NULL,
    @OrderBy 
nvarchar(128= NULL,
    @RecordCount 
int = 0 output ,
    @PageIndex 
int = 0 output,
    @PageSize 
int = 10
)
AS
BEGIN
IF  @Where IS NULL
BEGIN
    
Set @Where = ''
END
IF  (@FieldsName IS NULLor (@FieldsName = '')
BEGIN
    
Set @FieldsName = 'A.*'
END
IF  @OrderBy IS NULL
BEGIN
    
Set @OrderBy = ''
END

Set @FieldsName = LTRIM(RTRIM(@FieldsName))
Set @Where = LTRIM(RTRIM(@Where))
Set @OrderBy = LTRIM(RTRIM(@OrderBy))

CREATE TABLE #Pager 
(
    ID 
uniqueidentifier,
    IndexID 
int IDENTITY (11NOT NULL
)

Declare @SelectSql nvarchar(4000)

SET @SelectSql = 'INSERT INTO #Pager (ID)'
                    
+ ' SELECT ID'
                    
+ ' FROM [dbo].[A_ArticleClass]'
IF @Where <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Where ' + @Where
END
IF @OrderBy <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Order By ' + @OrderBy
END

EXEC(@SelectSql)

SELECT @RecordCount = COUNT(*FROM #Pager

IF(@RecordCount < (@PageSize * @PageIndex))
BEGIN
    
SET @PageIndex = @RecordCount / @PageSize
END 
IF(@RecordCount = (@PageSize * @PageIndex))
BEGIN
    
SET @PageIndex = @PageIndex - 1
    
IF @PageIndex < 0 
    
BEGIN
        
SET @PageIndex = 0
    
END
END

DECLARE @PageUpperBound int
DECLARE @PageLowerBound int

SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

SET @SelectSql = 'SELECT '+ @FieldsName 
                    
+ ' FROM [dbo].[A_ArticleClass] AS A INNER JOIN #Pager AS B'
                    
+ ' ON A.ID = B.ID '
                    
+ ' WHERE'
                    
+ ' B.IndexID > ' + RTRIM(LTRIM(CAST(@PageLowerBound AS varchar(128))))
                    
+ ' AND B.IndexID < ' + RTRIM(LTRIM(CAST(@PageUpperBound AS varchar(128))))
                    
+ ' ORDER BY B.IndexID'
                    
EXEC (@SelectSql)
RETURN 
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetAll    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_GetAll]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_GetAll]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_GetAll]
(
    @FieldsName 
nvarchar(512= '*',
    @Where 
nvarchar(512= NULL,
    @OrderBy 
nvarchar(128= NULL
)
AS
BEGIN

IF  @Where IS NULL
BEGIN
    
Set @Where = ''
END
IF  (@FieldsName IS NULLor (@FieldsName = '')
BEGIN
    
Set @FieldsName = '*'
END
IF  @OrderBy IS NULL
BEGIN
    
Set @OrderBy = ''
END

Set @FieldsName = LTRIM(RTRIM(@FieldsName))
Set @Where = LTRIM(RTRIM(@Where))
Set @OrderBy = LTRIM(RTRIM(@OrderBy))
Declare @SelectSql nvarchar(4000)

SET @SelectSql = 'SELECT ' + @FieldsName 
                    
+ ' FROM [dbo].[A_ArticleClass]'
IF @Where <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Where ' + @Where
END
IF @OrderBy <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Order By ' + @OrderBy
END

EXEC (@SelectSql)
RETURN
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetLevel   Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where type = 'FN' AND name = 'A_ArticleClass_GetLevel')
drop function [dbo].[A_ArticleClass_GetLevel]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[A_ArticleClass_GetLevel]
(
    @ID 
uniqueidentifier
)
RETURNS int
AS
BEGIN

DECLARE @ParentID uniqueidentifier

DECLARE @ReturnValue int
SELECT @ReturnValue = -1

SELECT @ParentID = @ID

WHILE (not (@ParentID is null))
BEGIN
    
SELECT @ReturnValue = @ReturnValue + 1
    
SELECT @ParentID = ParentID
        
FROM [dbo].[A_ArticleClass]
        
WHERE (ID = @ParentID)
END
RETURN @ReturnValue

END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetMaxLevel    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where type = 'FN' AND name = 'A_ArticleClass_GetMaxLevel')
drop function [dbo].[A_ArticleClass_GetMaxLevel]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[A_ArticleClass_GetMaxLevel]
(
)
RETURNS int
AS
BEGIN    
    
DECLARE @ReturnValue int
    
SELECT @ReturnValue = Max([dbo].A_ArticleClass_GetLevel(ID))
        
from [dbo].A_ArticleClass
    
RETURN @ReturnValue
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetFullName   Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where type = 'FN' AND name = 'A_ArticleClass_GetFullName')
drop function [dbo].[A_ArticleClass_GetFullName]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[A_ArticleClass_GetFullName]
(
    @ID 
uniqueidentifier
)
RETURNS nvarchar(4000)
AS
BEGIN    
    
DECLARE @ParentID uniqueidentifier

    
DECLARE @ReturnValue nvarchar(4000)
    
SELECT @ReturnValue = ''

    
SELECT @ParentID = @ID
    
    
WHILE (not (@ParentID is null))
    
BEGIN
        
SELECT @ReturnValue = '/' + isnull([Name],'No Name'+ @ReturnValue 
            
FROM [dbo].[A_ArticleClass]
            
WHERE (ID = @ParentID)
        
SELECT @ParentID=ParentID
            
FROM [dbo].[A_ArticleClass]
            
WHERE (ID = @ParentID)
    
END
    
RETURN @ReturnValue
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetTopID   Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where type = 'FN' AND name = 'A_ArticleClass_GetTopID')
drop function [dbo].[A_ArticleClass_GetTopID]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[A_ArticleClass_GetTopID]
(
    @ID 
uniqueidentifier
)
RETURNS uniqueidentifier
AS
BEGIN    
    
DECLARE @ParentID uniqueidentifier
    
DECLARE @ResultID uniqueidentifier
    
    
SELECT @ParentID = @ID
    
    
WHILE (not (@ParentID is null))
    
BEGIN
        
SELECT @ResultID = @ParentID
        
SELECT     @ParentID=ParentID
            
FROM [dbo].[A_ArticleClass]
            
WHERE (ID = @ParentID)
    
END
    
RETURN @ResultID 
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetFullID   Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where type = 'FN' AND name = 'A_ArticleClass_GetFullID')
drop function [dbo].[A_ArticleClass_GetFullID]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[A_ArticleClass_GetFullID]
(
    @ID 
uniqueidentifier
)
RETURNS nvarchar(4000)
AS
BEGIN    
    
DECLARE @ParentID uniqueidentifier

    
DECLARE @ReturnValue nvarchar(4000)
    
SELECT @ReturnValue = ''

    
SELECT @ParentID = @ID
    
    
WHILE (not (@ParentID is null))
    
BEGIN
        
SELECT @ReturnValue = '/' + Cast([ID]as varchar(128)) + @ReturnValue 
            
FROM [dbo].[A_ArticleClass]
            
WHERE (ID = @ParentID)
            
        
SELECT @ParentID=ParentID
            
FROM [dbo].[A_ArticleClass]
            
WHERE (ID = @ParentID)
    
END
    
RETURN @ReturnValue
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetChildren    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_GetChildren]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_GetChildren]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_GetChildren]
(
    @ID 
uniqueidentifier
)
AS
BEGIN

IF NOT exists(SELECT * FROM [dbo].A_ArticleClass WHERE (ID = @ID))
BEGIN
    
RETURN 2
END

CREATE TABLE #TmpPaths 
(
    ID 
uniqueidentifier,
    
[Level] int
)
insert into #TmpPaths(ID,[Level])
            
select ID,[dbo].A_ArticleClass_GetLevel(ID)
            
from [dbo].[A_ArticleClass] 
            
where (ID = @ID)

while(exists(
                
select * from [dbo].[A_ArticleClass] 
                    
where ParentID in (select ID from #TmpPaths) 
                    
and ID not in(select ID from #TmpPaths)
            )
        )
begin
    
insert into #TmpPaths(ID,[Level])
            
select ID,[dbo].A_ArticleClass_GetLevel(ID)
                
from [dbo].[A_ArticleClass] 
                
where ParentID in (select ID from #TmpPaths) 
                
and ID not in(select ID from #TmpPaths)
end

delete #TmpPaths
    
where ID = @ID

select A.*, B.Level
    
from [dbo].[A_ArticleClass] A inner join #TmpPaths B
    
on A.ID = B.ID
    
order by B.Level desc
RETURN

END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetNonChildren    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_GetNonChildren]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_GetNonChildren]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_GetNonChildren]
(
    @ID 
uniqueidentifier
)
AS
BEGIN

IF NOT exists(SELECT * FROM [dbo].A_ArticleClass WHERE (ID = @ID))
BEGIN
    
RETURN 2
END

CREATE TABLE #TmpPaths 
(
    ID 
uniqueidentifier
)
insert into #TmpPaths(ID)
            
select ID
            
from [dbo].[A_ArticleClass] 
            
where (ID = @ID)

while(exists(
                
select * from [dbo].[A_ArticleClass] 
                    
where ParentID in (select ID from #TmpPaths) 
                    
and ID not in(select ID from #TmpPaths)
            )
        )
begin
    
insert into #TmpPaths(ID)
            
select ID
                
from [dbo].[A_ArticleClass] 
                
where ParentID in (select ID from #TmpPaths) 
                
and ID not in(select ID from #TmpPaths)
end
Select * from [dbo].[A_ArticleClass]
    
where ID not in (select ID from  #TmpPaths)
RETURN

END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_GetParents    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_GetParents]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_GetParents]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_GetParents]
(
    @ID 
uniqueidentifier
)
AS
BEGIN

IF NOT exists(SELECT * FROM [dbo].A_ArticleClass WHERE (ID = @ID))
BEGIN
    
RETURN 2
END

CREATE TABLE #TmpPaths 
(
    ID 
uniqueidentifier,
    
[Level] int
)

DECLARE @ParentID uniqueidentifier
SELECT @ParentID = ParentID
    
from [dbo].[A_ArticleClass]
    
where (ID = @ID)

WHILE (not (@ParentID is null))
BEGIN
    
insert into #TmpPaths(ID,[Level])
        
select ID,[dbo].A_ArticleClass_GetLevel(ID)
            
FROM [dbo].[A_ArticleClass]
            
WHERE (ID = @ParentID)        

    
SELECT @ParentID=ParentID
        
FROM [dbo].[A_ArticleClass]
        
WHERE (ID = @ParentID)
END

select A.*, B.Level
    
from [dbo].[A_ArticleClass] A inner join #TmpPaths B
    
on A.ID = B.ID
    
order by B.Level desc

RETURN 
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_MoveTo    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_MoveTo]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_MoveTo]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_MoveTo]
(
    @ID 
uniqueidentifier,
    @NewParentID 
uniqueidentifier
)
AS
BEGIN

IF NOT exists(SELECT * FROM [dbo].A_ArticleClass WHERE (ID = @ID))
BEGIN
    
RETURN 2
END
IF NOT exists(SELECT * FROM [dbo].A_ArticleClass WHERE (ID = @NewParentID))
BEGIN
    
RETURN 2
END

Update [dbo].A_ArticleClass
    
Set ParentID = @NewParentID
    
where (ID = @ID)
RETURN 
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_ArticleClass_CopyChildren    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_ArticleClass_CopyChildren]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_ArticleClass_CopyChildren]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_ArticleClass_CopyChildren]
(
    @ID 
uniqueidentifier,
    @FromID 
uniqueidentifier
)
AS
BEGIN

IF NOT exists(SELECT * FROM [dbo].A_ArticleClass WHERE (ID = @ID))
BEGIN
    
RETURN 2
END
IF NOT exists(SELECT * FROM [dbo].A_ArticleClass WHERE (ID = @FromID))
BEGIN
    
RETURN 2
END

CREATE TABLE #TmpPaths 
(
    ID 
uniqueidentifier,
    ParentID 
uniqueidentifier null,
    NID 
uniqueidentifier,
    NParentID 
uniqueidentifier null
)
insert into #TmpPaths(ID,ParentID,NID, NParentID)
            
select ID,ParentID, @ID, null
                
from [dbo].[A_ArticleClass] 
                
where (ID = @FromID)

while(exists(
                
select * from [dbo].[A_ArticleClass] 
                    
where ParentID in (select ID from #TmpPaths) 
                    
and ID not in(select ID from #TmpPaths)
            )
        )
begin
    
insert into #TmpPaths(ID,ParentID,NID, NParentID)
            
select ID,ParentID, NewID(), null
                
from [dbo].[A_ArticleClass] 
                
where ParentID in (select ID from #TmpPaths) 
                
and ID not in(select ID from #TmpPaths)
end

update #TmpPaths
    
set #TmpPaths.NParentID = b.NID
    
from #TmpPaths, #tmpPaths b
    
where #TmpPaths.ParentID = b.ID

delete #TmpPaths
    
where ID = @FromID

insert into [dbo].[A_ArticleClass](Name,Description,OrderBy,ImgUrl,IconUrl,ParentID,ID)
    
select B.Name,B.Description,B.OrderBy,B.ImgUrl,B.IconUrl,a.NParentID, a.NID
    
from #TmpPaths a inner join [dbo].[A_ArticleClass] b
    
on a.ID = b.ID
RETURN 
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
------------------------------------------------------------------------------------------------------------------------
--
 the sprocs returns various error/success codes
    -- a return value of 0 means success
    -- a return value of 1 means a dup A_Article
    -- a return value of 2 means A_Article doesn't exist
--
----------------------------------------------------------------------------------------------------------------------

/****** Object:  Stored Procedure [dbo].A_Article_InsertDeleteUpdate    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_Article_InsertDeleteUpdate]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_Article_InsertDeleteUpdate]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO

------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_Article_InsertDeleteUpdate]
(
    @ID 
uniqueidentifier    = null,
    @ArticleClassID 
uniqueidentifier    = null,
    @Title 
nvarchar(256)    = null,
    @Content 
ntext    = null,
    @IsNew 
bit    = null,
    @IsTop 
bit    = null,
    @OrderBy 
int    = null,
    @ImgUrl 
nvarchar(128)    = null,
    @CreateTime 
datetime    = null,
    @UserName 
nvarchar(64)    = null,
    @Author 
nvarchar(16)    = null,
    @Keywords 
nvarchar(256)    = null,
    @Action 
int
)    
AS
BEGIN
IF @Action = 0
-- Insert
BEGIN
    
IF EXISTS(SELECT * 
            
FROM [dbo].[A_Article] 
            
WHERE (ID = @ID)
            )
    
RETURN 1
    
IF EXISTS(SELECT * 
            
FROM [dbo].[A_Article] 
            
WHERE (ArticleClassID = @ArticleClassID) And (Title = @Title)
            )
    
RETURN 1
    
INSERT INTO [dbo].[A_Article](ID, ArticleClassID, Title, Content, IsNew, IsTop, OrderBy, ImgUrl, CreateTime, UserName, Author, Keywords)
        
VALUES (@ID, @ArticleClassID, @Title, @Content, @IsNew, @IsTop, @OrderBy, @ImgUrl, @CreateTime, @UserName, @Author, @Keywords)
    
SELECT * 
        
FROM [dbo].[A_Article] 
        
WHERE (ID = @ID)
    
RETURN
END
IF @Action = 1
-- Delete
BEGIN
    
IF EXISTS(
    
SELECT * 
            
FROM [dbo].[A_Article] 
            
WHERE (ID = @ID)
            )
    
BEGIN
        
Delete  
            
FROM [dbo].[A_Article] 
            
WHERE (ID = @ID)
        
RETURN
    
END
    
ELSE
    
BEGIN
        
RETURN 2
    
END    
END    
IF @Action = 2
-- Update
BEGIN
    
IF EXISTS(
        
SELECT * 
                
FROM [dbo].[A_Article] 
                
WHERE (ID = @ID)
            )            
    
BEGIN
        
IF EXISTS(SELECT * 
                
FROM [dbo].[A_Article] 
                
WHERE (ArticleClassID = @ArticleClassID) And (Title = @Title)
                
AND (NOT
                ((ID 
= @ID))
                ))
        
RETURN 1
        
UPDATE [dbo].[A_Article] 
            
SET
            ArticleClassID 
= @ArticleClassID, Title = @Title, Content = @Content, IsNew = @IsNew, IsTop = @IsTop, OrderBy = @OrderBy, ImgUrl = @ImgUrl, CreateTime = @CreateTime, UserName = @UserName, Author = @Author, Keywords = @Keywords
            
WHERE (ID = @ID)
        
RETURN        
    
END
    
ELSE
    
BEGIN
        
RETURN 2
    
END    
END
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_Article_GetPageData    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_Article_GetPageData]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_Article_GetPageData]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_Article_GetPageData]
(
    @FieldsName 
nvarchar(512= 'A.*',
    @Where 
nvarchar(512= NULL,
    @OrderBy 
nvarchar(128= NULL,
    @RecordCount 
int = 0 output ,
    @PageIndex 
int = 0 output,
    @PageSize 
int = 10
)
AS
BEGIN
IF  @Where IS NULL
BEGIN
    
Set @Where = ''
END
IF  (@FieldsName IS NULLor (@FieldsName = '')
BEGIN
    
Set @FieldsName = 'A.*'
END
IF  @OrderBy IS NULL
BEGIN
    
Set @OrderBy = ''
END

Set @FieldsName = LTRIM(RTRIM(@FieldsName))
Set @Where = LTRIM(RTRIM(@Where))
Set @OrderBy = LTRIM(RTRIM(@OrderBy))

CREATE TABLE #Pager 
(
    ID 
uniqueidentifier,
    IndexID 
int IDENTITY (11NOT NULL
)

Declare @SelectSql nvarchar(4000)

SET @SelectSql = 'INSERT INTO #Pager (ID)'
                    
+ ' SELECT ID'
                    
+ ' FROM [dbo].[A_Article]'
IF @Where <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Where ' + @Where
END
IF @OrderBy <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Order By ' + @OrderBy
END

EXEC(@SelectSql)

SELECT @RecordCount = COUNT(*FROM #Pager

IF(@RecordCount < (@PageSize * @PageIndex))
BEGIN
    
SET @PageIndex = @RecordCount / @PageSize
END 
IF(@RecordCount = (@PageSize * @PageIndex))
BEGIN
    
SET @PageIndex = @PageIndex - 1
    
IF @PageIndex < 0 
    
BEGIN
        
SET @PageIndex = 0
    
END
END

DECLARE @PageUpperBound int
DECLARE @PageLowerBound int

SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

SET @SelectSql = 'SELECT '+ @FieldsName 
                    
+ ' FROM [dbo].[A_Article] AS A INNER JOIN #Pager AS B'
                    
+ ' ON A.ID = B.ID '
                    
+ ' WHERE'
                    
+ ' B.IndexID > ' + RTRIM(LTRIM(CAST(@PageLowerBound AS varchar(128))))
                    
+ ' AND B.IndexID < ' + RTRIM(LTRIM(CAST(@PageUpperBound AS varchar(128))))
                    
+ ' ORDER BY B.IndexID'
                    
EXEC (@SelectSql)
RETURN 
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

/****** Object:  Stored Procedure [dbo].A_Article_GetAll    Script Date: 2005年1月22日 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A_Article_GetAll]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
drop procedure [dbo].[A_Article_GetAll]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS OFF 
GO
------------------------------------------------------------------------------------------------------------------------
--
 Date Created: 2005年1月22日
--
 Created By:   Generated by Keyss
--
----------------------------------------------------------------------------------------------------------------------
CREATE PROCEDURE [dbo].[A_Article_GetAll]
(
    @FieldsName 
nvarchar(512= '*',
    @Where 
nvarchar(512= NULL,
    @OrderBy 
nvarchar(128= NULL
)
AS
BEGIN

IF  @Where IS NULL
BEGIN
    
Set @Where = ''
END
IF  (@FieldsName IS NULLor (@FieldsName = '')
BEGIN
    
Set @FieldsName = '*'
END
IF  @OrderBy IS NULL
BEGIN
    
Set @OrderBy = ''
END

Set @FieldsName = LTRIM(RTRIM(@FieldsName))
Set @Where = LTRIM(RTRIM(@Where))
Set @OrderBy = LTRIM(RTRIM(@OrderBy))
Declare @SelectSql nvarchar(4000)

SET @SelectSql = 'SELECT ' + @FieldsName 
                    
+ ' FROM [dbo].[A_Article]'
IF @Where <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Where ' + @Where
END
IF @OrderBy <>''
BEGIN
    
SET @SelectSql = @SelectSql + ' Order By ' + @OrderBy
END

EXEC (@SelectSql)
RETURN
END
GO

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO