qq升级记牌工具,QQ斗地主记片工具

 

2008-12-13日更新。

 

http://files.cnblogs.com/jiang84/Project1.rar

 

http://files.cnblogs.com/jiang84/QQDDZ.rar

 

 

posted @ 2008-12-13 12:26 江Jiang0001 阅读(324) 评论(3) 编辑

代码生成工具系列--------(三)根据数据库,生成存储过程

 

该代码生成工具,目前只支持MS SQL2005。简单的把操作数据库操作全用存储过程。

操作语句有:

查询,插入,修改,新加。

 

一:查询

 

          /// <summary>
          /// 查询,sql 语句
          /// </summary>
          /// <param name="tableName">表对象</param>
          /// <returns></returns>
        public static StringBuilder ProcSelect(Jiang.CodeEasy.Model.TableProcInfo table)

          代码中没有什么,全是用StringBuilder拼成的。

 

生成的如下:

if exists (select [name] from sys.objects where object_id = object_id(N'[dbo].[$NPSP(City)s]') and type in (N'P',N'pc'))
drop proc [dbo].[$NPSP(City)s]
go


create proc [dbo].[$NPSP(City)s]
(
 @top                   INT = NULL,
 @offset                INT = NULL,
 @rows                  INT = NULL,
 @join                  NVARCHAR(2048) = NULL,
 @filter                NVARCHAR(1024) = NULL,
 @orderby               NVARCHAR(1024) = NULL,
 @page_between          INT = NULL,
 @page_end              INT = NULL,
 @page_count            INT = NULL OUTPUT
)
as

 DECLARE @fields NVARCHAR(MAX)
 DECLARE @cur_fields NVARCHAR(MAX)
 DECLARE @sql NVARCHAR(MAX)
 DECLARE @tmp_sql NVARCHAR(MAX)

 set @fields = N'~.[ZID],~.[ZUP],~.[ZName],~.[ZPostCode]'
 SET @cur_fields = replace(@fields, N'~.', N'a.')
 SET @sql = N'SELECT '

IF ISNULL(@top, 0) > 0 SET @sql = @sql + N'TOP ' + CAST(@top AS NVARCHAR) + N' '
 SET @sql = @sql + @cur_fields + N', ROW_NUMBER() OVER(ORDER BY '
IF @orderby IS NULL SET @sql = @sql + N'a.ZID' ELSE SET @sql = @sql + @orderby
 SET @sql = @sql + N') AS rownum FROM [dbo].[City]  a'
IF NOT @join IS NULL SET @sql = @sql + @join
IF NOT @filter IS NULL SET @sql = @sql + N' WHERE ' + @filter

IF ISNULL(@offset, 0) > 0
begin
 SET @sql = N'SELECT ' + @cur_fields + N', ROW_NUMBER() OVER(ORDER BY a.rownum) AS rownum FROM (' +
 @sql + N') a WHERE a.rownum '
IF ISNULL(@rows, 0) > 0 SET @sql = @sql + N' BETWEEN ' + CAST(@offset AS NVARCHAR) + N' AND ' +
 CAST(@offset + @rows - 1 AS NVARCHAR)
 ELSE SET @sql = @sql + N' >= ' + CAST(@offset AS NVARCHAR)
END
IF ISNULL(@page_between, 0) > 0 AND ISNULL(@page_end, 0) > 0
BEGIN
IF ISNULL(@top, 0) > 0 OR ISNULL(@offset, 0) > 0
BEGIN
SET @tmp_sql = N'WITH t AS(' + @sql + N') SELECT @pc = COUNT(*) FROM t'
EXECUTE sp_executesql @tmp_sql, N'@pc INT OUTPUT', @pc = @page_count OUTPUT
END
ELSE
BEGIN
SET @tmp_sql = N'SELECT @pc = COUNT(*) FROM [dbo].[City] a'
IF NOT @join IS NULL SET @tmp_sql = @tmp_sql + @join
IF NOT @filter IS NULL SET @tmp_sql = @tmp_sql + N' WHERE ' + @filter
EXECUTE sp_executesql @tmp_sql, N'@pc INT OUTPUT', @pc = @page_count OUTPUT
END
SET @tmp_sql = N'WITH t AS(' + @sql + N') SELECT * FROM t WHERE t.rownum BETWEEN @between AND @end'
EXECUTE sp_executesql @tmp_sql, N'@between INT, @end INT',
@between = @page_between, @end = @page_end
end
else
begin
EXECUTE sp_executesql @sql
end
go


 其中[dbo].[$NPSP(City)s]是存储过程名称。@join与SQL中的inner join,left join,right join差不多。 @filter就是where后面的过滤。

 

至于修改,新加,删除就更简单了:

 

if exists (select [name] from sys.objects where object_id = object_id(N'[dbo].[$NPSP(City)iu]') and type in (N'P',N'pc'))
drop proc [dbo].[$NPSP(City)iu]
go

 

create proc [dbo].[$NPSP(City)iu]
(
@ZID                 nvarchar(6) = null,
@ZUP                 nvarchar(6) = null,
@ZName                 nvarchar(10) = null,
@ZPostCode                 nvarchar(6) = null,
@NPSP_F_IS_INSERT      bit = NULL
)
as
if @NPSP_F_IS_INSERT = 1
begin
SET NOCOUNT ON
declare @table table([ZID]nvarchar(6),[ZUP]nvarchar(6),[ZName]nvarchar(10),[ZPostCode]nvarchar(6))
insert into [dbo].[City]([ZID],[ZUP],[ZName],[ZPostCode])
output inserted.[ZID],inserted.[ZUP],inserted.[ZName],inserted.[ZPostCode] into @table
values(@ZID,@ZUP,@ZName,@ZPostCode)
SET NOCOUNT OFF
SELECT * FROM @table
end
else
begin
update [dbo].[City] set [ZUP] = @ZUP,[ZName] = @ZName,[ZPostCode] = @ZPostCode where [ZID] = @ZID
end
go

 

if exists (select [name] from sys.objects where object_id = object_id(N'[dbo].[$NPSP(City)d]') and type in (N'P',N'pc'))
drop proc [dbo].[$NPSP(City)d]
go

 

create proc [dbo].[$NPSP(City)d]
(
@ZID             nvarchar(6) = NULL
)
as
 if @ZID is not null
delete from [dbo].[City] where [ZID] = @ZID
go

这就是生成的存储过程,生成过程代码也是把传入表对象字段代入就行。本人的代码写得很乱。如果谁要,可留言,不过,最好联系NIC。看看他是怎么写的。(我都觉得我的方法笨)不过也是一种思路。

posted @ 2008-11-03 20:51 江Jiang0001 阅读(554) 评论(0) 编辑
 

编写代码生成器,要从数据库中得到哪些信息呢?表名?存储过程名?

 

当然这些都是必要的。如。下面列举几个SQL语句,也不多作解,相信都能看懂。

 

1

/***************************************

得到TABLE,存储过程的

编号

Owner

表名

类型

****************************************/

select

 a.Object_id

,b.name 'Owner'

,a.name 'Table'

,'T' type

from sys.tables a

inner join sys.schemas b on b.schema_id = a.schema_id

union all

select

 a.Object_id

,b.name 'Owner'

,a.name 'Name'

,'P' type

from sys.procedures a

inner join sys.schemas b on b.schema_id = a.schema_id

where a.type = 'P' and charindex('$NPSP', a.name) = 0 and charindex('diagram', a.name) = 0

order by type desc, b.name, a.name

 

 

 

 

/**********************************************

得到表ID

字段

类型

长度

SQLTtyp

是否为空

ISIDENTITY

**********************************************/

select

 a.Object_id

,a.name 'Column'

,b.name 'Type'

,case

 when b.name in ('Text', 'NText', 'Image') then -1

 when b.name in ('NChar', 'NVarchar') then a.max_length / 2

 else a.max_length end 'Length'

,b.name + case

 when b.name in ('Char', 'VarChar', 'NChar', 'NVarChar', 'Binary', 'VarBinary') then '(' +

  case when a.max_length = -1 then 'MAX'

  when b.name in ('NChar', 'NVarchar') then cast(a.max_length / 2 as varchar)

  else cast(a.max_length as varchar) end + ')'

 when b.name in ('Numeric', 'Decimal') then '(' + cast(a.precision as varchar) + ',' + cast(a.scale as varchar) + ')'

 else '' end as 'SqlType'

 

,a.is_nullable 'IsNullable'

,a.is_identity 'IsIdentity'

from sys.columns a

inner join sys.types b on b.user_type_id = a.user_type_id

where a.object_id in (629577281,661577395,469576711,2073058421)

 

 

 

 

3

 

select

 a.object_id 'Object_id'

,c.name 'Column'

,case when is_unique = 1 then b.index_id else 0 end 'Unique'

,b.is_primary_key 'IsPrimaryKey'

,cast(case when b.type_desc = 'CLUSTERED' then 1 else 0 end as bit) 'IsClustered'

,case when a.is_descending_key = 1 then 2 when a.is_descending_key = 0 then 1 else 0 end 'IsDesc'

from sys.index_columns a

inner join sys.indexes b on b.object_id = a.object_id and b.index_id = a.index_id

left join sys.columns c on c.object_id = a.object_id and c.column_id = a.column_id

where a.object_id in (629577281,661577395,469576711,2073058421)

 

 

 

4

 

select

 b.object_id 'Object_id'

,c.name 'Column'

,referenced_object_id

,cast(1 as bit) 'IsForeignKey'

,d.name 'Referenced_Column'

from sys.foreign_key_columns a

inner join sys.tables b on b.object_id = a.parent_object_id

inner join sys.columns c on c.object_id = a.parent_object_id and c.column_id = a.parent_column_id

inner join sys.columns d on d.object_id = a.referenced_object_id and d.column_id = a.referenced_column_id

where b.object_id in (629577281,661577395,469576711,2073058421)

 

 

说明:其中IN后面的都是由第一步得到。都在SQL2005下运行,如果有谁能得到MYSQL,ORACL,SQL 2000请告诉我。(广告:请大家帮测下 http://www.onsbar.cn/ 它正是采用该工具生成)

 

                            谢绝转载

 

                                                                                        2008-10-30

posted @ 2008-10-30 15:15 江Jiang0001 阅读(167) 评论(0) 编辑
 

代码生成工具系列

代码生成工具(CodeEasy)介绍

 

       简介:CodeEasy 是本人根据NicPetshop(我一朋友写的代码生成工具,在博客园有发表,大家下载免费使用)结构改写而成。它根据MS SQL2005数据库(目前只支持该数据库)表,存储过程数据操作生成SQL语句,三层架构的类。

      

       应用:Nicpetshop已在公司项目中运用,效果比较满意。而本人的写的CodeEasy在一小网站项目中使用。大家可来看看:http://www.onsbar.cn/ 。在运用中,发现大量BUG,重要的基本更改过来。当然,本人比较懒散,只要能用的就没去改。这次代这一系列,希望能多动动,把发现的BUG全修正过来。

 

       开发技术:其实,CodeEasy用的技术很简单,简单到输出StringBuilderNicpetshop运用大大量其它技术,比如 Remoting,缓存,反射等等。

 

       好了,看张由Nicpetshop生成的项目图吧!

 

 

 

不要怀疑,这些代码全是由它生成的。包括项目的文件都是,余下要做的就是编译它。

 

特色:

1,引入System.Nullable<T>

2Model项目中,根据数据库外键关系映射类。比如:有一数据库里有用户Member表,一个分数据Socre表,Socre 通过UIDMEMBER关链一起。工具生成对应的MemberInfo类,一个SocreInfo类。在前台,可以这样写

SocreInfo socreinfo;

socreinfo.UID_MemberInfo 访问用户的信息。避免新构类或用DataTable造成的麻烦。

       3,分页查询,且引入MYSQL中的Limit方法。

 

       这节就到这,最后要说的:工具是且只是工具,希望了解下就行。把时间,精力花到底层技术上。

 

                                          谢绝转载

                                                                                           2008-10-22

posted @ 2008-10-22 16:23 江Jiang0001 阅读(289) 评论(0) 编辑

在CNBLOGS安了个家,希望多认识些朋友。

最近开发了个代友生成工具。

开发环境:VS2005 MSSQL 2005. 能生成三层结构的代码,抽时写系列文章。介绍介绍。

希望大家指教。

posted @ 2008-10-21 17:17 江Jiang0001 阅读(46) 评论(0) 编辑