2009-08-28 8 views
8

J'ai une base de données SQL Server 2008 avec un tas de procédures stockées. Lorsque j'utilise le modèle ActiveRecord fourni avec Subsonic 3.0.0.3, il génère des méthodes pour toutes mes procédures stockées, mais elles n'ont aucun paramètre. Je suis dbo sur le serveur et je peux exécuter les procédures stockées sans problème avec Management Studio.Subsonic 3.0.0.3 ne génère pas de paramètres pour les procédures stockées

Exemple Stored Procedure

CREATE PROCEDURE [dbo].[prc_Sample] 
    @FileName VARCHAR(50) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT * FROM Sample WHERE FileName = @FileName) 
    BEGIN 
     RETURN -1 
    END 

    RETURN 0 

END 

échantillon généré Méthode

public StoredProcedure prc_Sample(){ 
    StoredProcedure sp=new StoredProcedure("prc_Sample",this.Provider); 
    return sp; 
} 

Si je vérifie SQLServer.ttinclude, je peux voir que toutes les méthodes pour obtenir des procédures stockées sont là, mais pour une raison quelconque, ils ne génèrent pas. Et ce n'est pas un problème d'avoir des traits de soulignement dans les noms de procédures stockées - ceci est cassé avec et sans soulignement.

Des idées ou quelqu'un sait comment déboguer un fichier modèle?

+0

J'ai le même problème. Je peux certainement voir le code du fichier .tt qui devrait être en boucle à travers les paramètres de mon proc stocké, mais le .cs final généré n'a pas de code qui ajoute ces paramètres. Certainement besoin de résoudre cela. – Kon

+0

Mike, j'ai supprimé ma réponse (donc cela apparaîtra comme 0 réponses et j'espère que quelqu'un pourrait être en mesure de le comprendre.) Ma réponse et notre recherche n'ont pas abouti à une solution –

Répondre

13

J'ai eu le même problème, et j'ai dû modifier le SQLServer.ttinclude pour le faire fonctionner. A l'intérieur de ce fichier trouver la méthode GetSPParams() et changer une ligne:

de

string[] restrictions = new string[4] { DatabaseName, null, spName, null }; 

à

string[] restrictions = new string[3] { null, null, spName }; 

.

La réponse de BlackMael a un lien utile qui m'a aidé à comprendre comment déboguer et parcourir le code du modèle.

Maintenant, je ne suis pas sûr à 100% que mon changement est bon (il peut y avoir des effets indésirables). Je n'ai juste pas eu l'occasion de le tester à fond et j'ai besoin de lire un peu plus sur Restrictions car ils se rapportent à la méthode GetSchema(). Mais pour l'instant, cela a résolu mon problème et je peux passer avec succès mon paramètre proc stocké. Mise à jour: Cela peut avoir quelque chose à voir avec le fait que mon fichier DB est intégré dans la solution VS dans App_Data. Peut-être que cela fonctionne mieux hors de la boîte avec une instance SQL Server autonome.

+0

Cela a fonctionné Ma base de données n'est pas embarqué, mais seulement hébergé sur un serveur SQL Server 2008 Standard Edition En utilisant Subsonic 3, je l'ai fait générer des procédures stockées pour toutes les autres bases de données à l'exception de celui-ci particulier, j'ai même essayé de le créer à partir de zéro. encore causé ce problème Merci encore pour le correctif. –

1

Pour déboguer un fichier modèle T4 ...

T4 Tutorial: Debugging Code Generation Files

Utilisation du projet dans les SubSonic-30-modèles qui pointe vers une instance de Northwind dans SqlExpress j'ai ajouté la procédure stockée ci-dessus. Re généré le StoredProcedures.tt et heureusement créé ...

public StoredProcedure prc_Sample(string FileName){ 
    StoredProcedure sp=new StoredProcedure("prc_Sample",this.Provider); 
    sp.Command.AddParameter("FileName",FileName,DbType.AnsiString); 
    return sp; 
} 

Bien que j'utilise la plus récente et la construction, je ne l'ai pas remarqué des problèmes avec des paramètres manquants.

Pouvez-vous poster votre Settings.ttinclude et peut-être SqlServer.ttinclude fichier? Ou peut-être un lien vers eux? Le StoredProcedures.tt peut être bon aussi.

0

Similaire à la réponse de Kon M j'ai changé la ligne dans SQLServer.tt à:

string[] restrictions = new string[4] { null, null, spName, null }; 

Cela a résolu le problème pour moi.

0

Une autre cause possible est que la base de données n'a pas de dbo assigné.

Questions connexes