2010-06-08 14 views
2

Pour ceux qui sont intéressés, j'ai maintenant modifié le code SubSonic 2.x pour reconnaître et supporter les types de paramètres DataTable.SubSonic 2.x supporte maintenant TVP - SqlDbType.Structure/DataTables pour SQL Server 2008

Vous pouvez en savoir plus sur SQL Server 2008 ici: http://download.microsoft.com/download/4/9/0/4906f81b-eb1a-49c3-bb05-ff3bcbb5d5ae/SQL%20SERVER%202008-RDBMS/T-SQL%20Enhancements%20with%20SQL%20Server%202008%20-%20Praveen%20Srivatsav.pdf

Qu'est-ce que cette amélioration va maintenant vous permettre de faire est de créer une classe de StoredProcedures.cs partielle, avec une méthode qui remplace la méthode d'emballage de procédure stockée. Un peu à propos de la bonne forme: Mon DAL n'a pas d'accès direct à la table, et ma base de données n'a que des droits d'exécution pour cet utilisateur sur mes sprocs. En tant que tel, SubSonic génère uniquement les classes AllStructs et StoredProcedures.

Le SPROC:

ALTER PROCEDURE [dbo].[testInsertToTestTVP] 
    @UserDetails TestTVP READONLY, 
    @Result INT OUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @Result = -1 

    --SET IDENTITY_INSERT [dbo].[tbl_TestTVP] ON 

    INSERT INTO [dbo].[tbl_TestTVP] 
      ([GroupInsertID], [FirstName], [LastName]) 
    SELECT [GroupInsertID], [FirstName], [LastName] 
    FROM @UserDetails 

    IF @@ROWCOUNT > 0 
     BEGIN 
      SET @Result = 1 
      SELECT @Result 
      RETURN @Result 
     END 
    --SET IDENTITY_INSERT [dbo].[tbl_TestTVP] OFF 

END 

Le PVT:

CREATE TYPE [dbo].[TestTVP] AS TABLE(
    [GroupInsertID] [varchar](50) NOT NULL, 
    [FirstName] [varchar](50) NOT NULL, 
    [LastName] [varchar](50) NOT NULL 
) 
GO 

L'outil gen automatique fonctionne, il crée la méthode erronée suivante:

/// <summary> 
    /// Creates an object wrapper for the testInsertToTestTVP Procedure 
    /// </summary> 
    public static StoredProcedure TestInsertToTestTVP(string UserDetails, int? Result) 
    { 
     SubSonic.StoredProcedure sp = new SubSonic.StoredProcedure("testInsertToTestTVP", DataService.GetInstance("MyDAL"), "dbo");  
     sp.Command.AddParameter("@UserDetails", UserDetails, DbType.AnsiString, null, null); 
     sp.Command.AddOutputParameter("@Result", DbType.Int32, 0, 10);    
     return sp; 
    } 

Il Définit UserDetails en tant que chaîne de caractères.

Comme il est de bon d'avoir deux dossiers pour un SubSonic DAL - Personnalisé et Generated, je créé une classe partielle dans StoredProcedures.cs personnalisée qui ressemble à ceci:

/// <summary> 
    /// Creates an object wrapper for the testInsertToTestTVP Procedure 
    /// </summary> 
    public static StoredProcedure TestInsertToTestTVP(DataTable dt, int? Result) 
    { 
     SubSonic.StoredProcedure sp = new SubSonic.StoredProcedure("testInsertToTestTVP", 
                    DataService.GetInstance("MyDAL"), 
                    "dbo"); 

     // TODO: Modify the SubSonic code base in sp.Command.AddParameter to accept 
     //  a parameter type of System.Data.SqlDbType.Structured, as it currently only accepts 
     //  System.Data.DbType. 
     //sp.Command.AddParameter("@UserDetails", dt, System.Data.SqlDbType.Structured null, null); 

     sp.Command.AddParameter("@UserDetails", dt, SqlDbType.Structured); 
     sp.Command.AddOutputParameter("@Result", DbType.Int32, 0, 10); 

     return sp; 
    } 

Comme vous pouvez le voir, la méthode signature contient maintenant un DataTable, et avec ma modification du framework SubSonic, cela fonctionne maintenant parfaitement. Je me demande si les gars de SubSonic peuvent modifier l'auto-génération pour reconnaître un TVP dans une signature sproc, pour éviter d'avoir à réécrire le wrapper?

Est-ce que SubSonic 3.x prend en charge les types de données structurés?

En outre, je suis sûr que beaucoup seront intéressés à utiliser ce code, alors où puis-je télécharger le nouveau code?

Merci.

+0

Y a-t-il une question ici? –

+1

@Sean: plusieurs questions en fait. Ils sont adressés aux responsables SubSonic, mais ce sont des questions valides. –

+0

Il est vrai que le message contient des questions. Cependant, dans sa forme actuelle, cela ressemble plus à une soumission de correctif/fonctionnalité dirigée à un petit nombre de destinataires spécifiques, par opposition à une question à usage général qui serait utile à un lecteur Stack Overflow typique. Je suppose que ça ne me semble pas vraiment "une question habituelle de Stack Overflow". Y a-t-il un moyen de réécrire ou de réorganiser cette soumission afin qu'elle soit plus proche du thème normal du site? –

Répondre

0

J'ai posté un projet CodePlex avec la solution complète, le code source et les instructions.

Le projet peut être trouvé here.

+0

Mise à jour du code sur CodePlex - Ajout du support pour les références d'objet SOAP. – ElHaix