2009-08-28 9 views
8

Tengo una base de datos de SQL Server 2008 con un conjunto de procedimientos almacenados. Cuando uso la plantilla ActiveRecord provista con Subsonic 3.0.0.3, genera métodos para todos mis procedimientos almacenados, pero no tienen ningún parámetro. Estoy dbo en el servidor y puedo ejecutar los procedimientos almacenados sin problemas desde Management Studio.Subsonic 3.0.0.3 no genera parámetros para procedimientos almacenados

Ejemplo de procedimiento almacenado

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 

muestra generada Método

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

Si puedo comprobar SQLServer.ttinclude, puedo ver que todos los métodos para obtener procedimientos almacenados están allí, pero por alguna razón no están generando Y esto no es una cuestión de tener caracteres de subrayado en los nombres de procedimientos almacenados; esto se rompe con y sin guiones bajos.

¿Alguna idea o alguien sabe cómo depurar un archivo de plantilla?

+0

Tengo el mismo problema. Definitivamente puedo ver el código del archivo .tt que debería estar recorriendo los parámetros de mi proceso almacenado, pero el .cs final generado no tiene ningún código que agregue esos parámetros. Definitivamente necesita resolver esto. – Kon

+0

Mike, eliminé mi respuesta (por lo que esta aparecerá como 0 respuestas y espero que alguien pueda resolverlo. Mi respuesta y nuestra búsqueda no condujeron a ninguna solución. Gracias –

Respuesta

13

Tuve el mismo problema, y ​​tuve que modificar el SQLServer.ttinclude para que funcione. Dentro de ese archivo de encontrar el método GetSPParams() y cambiar una sola línea:

de

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

a

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

.

La respuesta de BlackMael tiene un enlace útil que me ayudó a descubrir cómo depurar y recorrer el código de la plantilla.

Ahora no estoy 100% seguro de que mi cambio sea bueno (puede haber algunos efectos adversos). Simplemente no he tenido la oportunidad de probarlo a fondo y necesito leer un poco más en Restrictions ya que pertenecen al método GetSchema(). Pero por ahora, eso resolvió mi problema y puedo pasar con éxito mi parámetro de proc almacenado.

Actualización: Esto puede tener algo que ver con el hecho de que mi archivo DB está incrustado en la solución VS en App_Data. Quizás esto funcione mejor de lo normal con una instancia independiente de SQL Server.

+0

Esto funcionó. Mi base de datos no es embebido, pero alojado en SQL Server 2008 Standard Edition Server. Utilizando Subsonic 3, he tenido que generar procedimientos almacenados para todas las otras bases de datos, excepto esta en particular. Incluso he intentado crearla desde cero como un databse 2008 y todavía resultó en este problema. Gracias de nuevo por la solución. –

1

depurar un archivo de plantilla T4 ...

T4 Tutorial: Debugging Code Generation Files

Con ayuda del proyecto en las SubSonic-30-plantillas que apunta a una instancia de Neptuno en SqlExpress añadí el procedimiento almacenado anteriormente. Re-genera la StoredProcedures.tt y felizmente creado ...

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

Aunque yo uso mejor y más nuevo de construcción, no he notado problemas con los parámetros que faltan.

Se puede publicar su Settings.ttinclude y posiblemente SqlServer.ttinclude archivo? ¿O tal vez un enlace a ellos? El StoredProcedures.tt puede ser bueno también.

0

Al igual que en la respuesta de Kon M, cambié la línea en SQLServer.tt a:

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

Esto resolvió el problema para mí.

0

Otra posible causa de esto es que la base de datos no tiene ningún dbo asignado.

Cuestiones relacionadas