Générer des classes à partir de tables SQL

Lorsque vous démarrez un nouveau projet, vous devez à un moment vous atteler à créer les classes correspondants à vos tables SQL. Évidemment, si vous utilisez un ORM tel qu’Entity Framework, vous ne vous souciez pas de cela.

Cependant, si ce n’est pas le cas, j’ai une solution qui peut vous intéresser. Le problème c’est qu’on ne peut pas (du moins je n’en ai pas trouvé) se servir des ORM « juste » pour générer les classes la première fois et s’arrêter là.

J’ai trouvé une solution sur StackOverflow que j’ai modifié pour mes besoins. Il s’agit d’une requête SQL qui va générer en sortie le code de la classe correspondant à la table voulu.

Prenons en exemple cette table :
Table Client SQL

Voici le script :

DECLARE @TableName VARCHAR(MAX) = 'Client' -- Nom de la table
DECLARE @ClassName VARCHAR(MAX) = 'Client' -- Nom de la classe (peut-être différent du nom de la table)
DECLARE @TableSchema VARCHAR(MAX) = 'dbo' -- Schéma de la table
DECLARE @Namespace VARCHAR(MAX) = 'MaSociété.MonApplication.Entities' -- Namespace de la classe
DECLARE @ClassSummary VARCHAR(MAX) = 'Représente un client de notre société' -- Commentaire de la classe
 
DECLARE @RESULT VARCHAR(MAX) = ''
 
SET @RESULT = @RESULT + 'using System;' + CHAR(13) + CHAR(13) 
 
IF (@TableSchema IS NOT NULL) 
BEGIN
    SET @RESULT = @RESULT + 'namespace ' + @Namespace  + CHAR(13) + '{' + CHAR(13) 
END
 
SET @RESULT = @RESULT + '/// <summary>' + CHAR(13)
SET @RESULT = @RESULT + '/// ' + @ClassSummary + CHAR(13)
SET @RESULT = @RESULT + '/// Table [' + @TableSchema + '].[' + @TableName + ']' + CHAR(13)
SET @RESULT = @RESULT + '/// </summary>' + CHAR(13)
 
SET @RESULT = @RESULT + 'public class ' + @ClassName + CHAR(13) + '{' + CHAR(13) 
 
SELECT @RESULT = @RESULT + CHAR(13) 
+ '/// <summary>' + CHAR(13)
+ '/// TODO' + CHAR(13)
+ '/// </summary>' + CHAR(13)
    + ' public ' + ColumnType + ' ' + ColumnName + ' { get; private set; } ' + CHAR(13) 
FROM
(
    SELECT  c.COLUMN_NAME   AS ColumnName 
        , CASE c.DATA_TYPE   
            WHEN 'bigint' THEN
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'long?' ELSE 'long' END
            WHEN 'binary' THEN 'Byte[]'
            WHEN 'bit' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'bool?' ELSE 'bool' END            
            WHEN 'char' THEN 'string'
            WHEN 'date' THEN
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END                        
            WHEN 'datetime' THEN
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END                        
            WHEN 'datetime2' THEN  
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END                        
            WHEN 'datetimeoffset' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END                                    
            WHEN 'decimal' THEN  
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END                                    
            WHEN 'float' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'float?' ELSE 'float' END                                    
            WHEN 'image' THEN 'Byte[]'
            WHEN 'int' THEN  
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'int?' ELSE 'int' END
            WHEN 'money' THEN
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END                                                
            WHEN 'nchar' THEN 'string'
            WHEN 'ntext' THEN 'string'
            WHEN 'numeric' THEN
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END                                                            
            WHEN 'nvarchar' THEN 'string'
            WHEN 'real' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'double?' ELSE 'double' END                                                                        
            WHEN 'smalldatetime' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END                                    
            WHEN 'smallint' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'short?' ELSE 'short'END            
            WHEN 'smallmoney' THEN  
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'decimal?' ELSE 'decimal' END                                                                        
            WHEN 'text' THEN 'string'
            WHEN 'time' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END                                                                                    
            WHEN 'timestamp' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END                                    
            WHEN 'tinyint' THEN 
                CASE C.IS_NULLABLE
                    WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END                                                
            WHEN 'uniqueidentifier' THEN 'Guid'
            WHEN 'varbinary' THEN 'Byte[]'
            WHEN 'varchar' THEN 'string'
            ELSE 'object'
        END AS ColumnType
        , c.ORDINAL_POSITION 
FROM    INFORMATION_SCHEMA.COLUMNS c
WHERE   c.TABLE_NAME = @TableName AND ISNULL(@TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA  
) t
ORDER BY t.ORDINAL_POSITION
 
SET @RESULT = @RESULT + CHAR(13)
SET @RESULT = @RESULT + '/// <summary>' + CHAR(13)
SET @RESULT = @RESULT + '/// Initialise une nouvelle instance de la classe <see cref="T:' + @Namespace + '.' + @ClassName + '" />.' + CHAR(13)
SET @RESULT = @RESULT + '/// </summary>' + CHAR(13)
SET @RESULT = @RESULT + 'public ' + @ClassName + '()' + CHAR(13)
SET @RESULT = @RESULT + '{' + CHAR(13)
SET @RESULT = @RESULT + '}' + CHAR(13)
SET @RESULT = @RESULT + CHAR(13)
 
SET @RESULT = @RESULT  + '}' + CHAR(13)
 
IF (@TableSchema IS NOT NULL) 
BEGIN
    SET @RESULT = @RESULT + CHAR(13) + '}' 
END
 
PRINT @RESULT

Ce qui produit la classe :

using System;
 
namespace MaSociété.MonApplication.Entities
{
    /// <summary>
    /// Représente un client de notre société
    /// Table [dbo].[Client]
    /// </summary>
    public class Client
    {
        /// <summary>
        /// TODO
        /// </summary>
        public int ClientId { get; private set; }
 
        /// <summary>
        /// TODO
        /// </summary>
        public int? FournisseurId { get; private set; }
 
        /// <summary>
        /// TODO
        /// </summary>
        public string Nom { get; private set; }
 
        /// <summary>
        /// TODO
        /// </summary>
        public string Prenom { get; private set; }
 
        /// <summary>
        /// TODO
        /// </summary>
        public bool EstAbonne { get; private set; }
 
        /// <summary>
        /// Initialise une nouvelle instance de la classe <see cref="T:MaSociété.MonApplication.Entities.Client" />.
        /// </summary>
        public Client()
        {
        }
    }
}

Voilà, ça fait le job et plutôt bien. A vous d’adapter la requête à vos besoins.

En espérant que cela vous ait été utile !

[Source]


Pas encore de commentaires

Laisser un commentaire