Картинка блога

Один мой добрый коллега прислал ссылку на отличный MSSQL скрипт, генерирующий класс на основе таблицы. Для меня, это внушительная экономия времени, так как даже с учетом всевозможных генераторов для LINQ и Hibernate. Предположим, что бизнес объект, после загрузки из базы, проходит через WCF, но для этого класс нужно снабдить дополнительными атрибутами DataMember. Процесс приписывания атрибута нужно будет делать каждый раз после генерации или постоянно создавать клон для WCF с общим интерфейсом. С использованием собственного механизма генерации, скрипт можно заставить это делать самому.

--**************************************
-- Name: Business Entity Class Generator
-- Description:This SP accepts a database object name (table, view) parameter and generates (C# code) custom entity class based on the object's fields. You can then copy and paste the generated code to your C# class.
-- By: Leon Tayson
--
--
-- Inputs:@ObjectName - name of your table, view
--
-- Returns:C# codes for your business entity object
--
--Assumes:None
--
--Side Effects:None
--This code is copyrighted and has limited warranties.
--Please see http://www.Planet-Source-Code.com/xq/ASP/txtCodeId.1039/lngWId.5/qx/vb/scripts/ShowCode.htm
--for details.
--**************************************

if exists (select * from dbo.sysobjects where id = object_id(N'procGenerateEntityClass') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure procGenerateEntityClass
GO
/*======================================================================
Business Entity Class Generator
This SP accepts a database object (table, view) name's parameter and
generates (C# code) custom entity class based on the object's fields
Sample Usage:
USE Northwind
EXEC procGenerateEntityClass 'Shippers'
Author:Leon C. Tayson
======================================================================*/
CREATE PROCEDURE procGenerateEntityClass
@ObjectName varchar(100)
AS
DECLARE @name varchar(20),
@type varchar(20)
DECLARE objCursor CURSOR
FOR
SELECT sc.name, st.name type FROM syscolumns sc
INNER JOIN systypes st
ON st.xusertype = sc.xusertype
WHERE Id=OBJECT_ID(@ObjectName)
DECLARE @declarationCodes varchar(8000),
@ctorCodes varchar(8000),
@propertyCodes varchar(8000)
SET @declarationCodes = ''
SET @ctorCodes = ''
SET @propertyCodes = ''
OPEN objCursor
FETCH NEXT FROM objCursor
INTO @name, @type
DECLARE @cType varchar(20)-- C# type
DECLARE @ctorParms varchar(4000)
SET @ctorParms = ''
IF @@FETCH_STATUS <> 0

    BEGIN
    CLOSE objCursor
    DEALLOCATE objCursor
    PRINT 'Error... Please check passed parameter'
    RETURN
END
WHILE @@FETCH_STATUS = 0

    BEGIN
    SET @cType =
    CASE
    WHEN @type LIKE '%char%' OR @type LIKE '%text%'
    THEN 'string'
    WHEN @type IN ('decimal', 'numeric')
    THEN 'double'
    WHEN @type = 'real'
    THEN 'float'
    WHEN @type LIKE '%money%'
    THEN 'decimal'
    WHEN @type = 'bit'
    THEN 'bool'
    WHEN @type = 'bigint'
    THEN 'long'
    WHEN @type LIKE '%int%'
    THEN 'int'
    ELSE
    @type
END
--PRINT CHAR(9) + 'private ' + @ctype + ' ' + 'm_' + @name + ';'
SET @declarationCodes = @declarationCodes + CHAR(9) + 'private ' + @ctype + ' ' + 'm_' + @name + ';' + CHAR(13)
SET @ctorCodes = @ctorCodes + CHAR(9) + CHAR(9) + 'm_' + @name + ' = ' + LOWER(LEFT(@name, 1)) + SUBSTRING(@name, 2, LEN(@name)) + ';' + CHAR(13)
SET @ctorParms = @ctorParms + @ctype + ' ' + LOWER(LEFT(@name, 1)) + SUBSTRING(@name, 2, LEN(@name)) + ', '
SET @propertyCodes = @propertyCodes + CHAR(9) + 'public ' + @ctype + ' ' + @name + CHAR(13) +
CHAR(9) + '{' + CHAR(13) +
CHAR(9) + CHAR(9) + 'get { return m_' + @name + '; }' + CHAR(13) +
CHAR(9) + CHAR(9) + 'set { m_' + @name + ' = value; }' + CHAR(13) +
CHAR(9) + '}' + CHAR(13)
FETCH NEXT FROM objCursor
INTO @name, @type
END
PRINT '[Serializable]'
PRINT 'public class ' + @ObjectName + 'Info'
PRINT '{'
PRINT @declarationCodes
PRINT ''
PRINT CHAR(9) + 'public ' + @ObjectName + 'Info(' + LEFT(@ctorParms, LEN(@ctorParms) - 1) + ')'
PRINT CHAR(9) + '{'
PRINT @ctorCodes
PRINT CHAR(9) + '}'
PRINT ''
PRINT @propertyCodes
PRINT '}'
CLOSE objCursor
DEALLOCATE objCursor

Источник:  Business Entity Class Generator by Leon Tayson.

Метки:, ,

3 комментария в “Генерация Entity классов с помощью MSSQL.”

  1. edinstvennqj nedostatok etogo scpripta to, 4to on generirujet resul`tat v output, a ne v peremennuju kotoruju mozno bqlo bq vernut` v prilozenije s posledujuwej generacijej *.cs faila. No eto porovimi 😉

    4to kasajeca LINQ, to ego generator toze mozet bqt` raswiren. Sovetuju izu4it` sledujuwuju statju
    http://www.codeproject.com/KB/.....toSQL.aspx

  2. Насколько я понимаю, речь в этой статье идет об использовании утилиты reegenerator. Добрый коллега, ты же знаешь мое отношение к продуктам, за которые надо платить 😉

  3. ..and will be implemented based on a free Visual Studio tool named Reegenerator.