Subsonic 3.0.0.3 не генерирует параметры для хранимых процедур - PullRequest
8 голосов
/ 29 августа 2009

У меня есть база данных SQL Server 2008 с кучей хранимых процедур. Когда я использую шаблон ActiveRecord, поставляемый с Subsonic 3.0.0.3, он генерирует методы для всех моих хранимых процедур, но у них нет никаких параметров. Я dbo на сервере и могу выполнять хранимые процедуры без проблем из Management Studio.

Пример хранимой процедуры

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

Образец генерируемого метода

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

Если я проверю SQLServer.ttinclude, я вижу, что все методы для получения хранимых процедур есть, но по какой-то причине они не генерируются. И это не проблема наличия подчеркивания в именах хранимых процедур - это ломается с подчеркиванием и без подчеркивания.

Есть идеи или кто-нибудь знает, как отладить файл шаблона?

Ответы [ 4 ]

13 голосов
/ 01 сентября 2009

У меня была та же проблема, и мне пришлось настроить SQLServer.ttinclude, чтобы она заработала. Внутри этого файла найдите метод GetSPParams() и измените одну строку:

от

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

до

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

.

Ответ BlackMael содержит полезную ссылку, которая помогла мне выяснить, как отлаживать и выполнять код шаблона.

Теперь я не уверен на 100%, что мои изменения хороши (могут быть некоторые неблагоприятные последствия). У меня просто не было возможности тщательно его протестировать, и мне нужно прочесть еще немного о Restrictions, поскольку они относятся к GetSchema() методу. Но пока это решило мою проблему, и я могу успешно передать свой сохраненный параметр proc.

Обновление: это может иметь какое-то отношение к тому факту, что мой файл БД встроен в VS-решение в App_Data. Возможно, это лучше работает из коробки с автономным экземпляром SQL Server.

1 голос
/ 01 сентября 2009

Для отладки файла шаблона T4 ...

Учебник по T4: отладка файлов генерации кода

Используя проект в SubSonic-30-Templates, который указывает на экземпляр Northwind в SqlExpress, я добавил хранимую процедуру выше. Повторно сгенерировал StoredProcedures.tt и счастливо создал ...

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

Хотя я использую последнюю и лучшую сборку, я не заметил проблем с отсутствующими параметрами.

Можете ли вы опубликовать файл Settings.ttinclude и, возможно, SqlServer.ttinclude ? Или, может быть, ссылка на них? StoredProcedures.tt тоже может быть хорошим.

0 голосов
/ 25 февраля 2010

Другой возможной причиной этого является то, что базе данных не назначен dbo.

0 голосов
/ 16 декабря 2009

Подобно ответу Кона М, я изменил строку в SQLServer.tt на:

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

Это решило проблему для меня.

...