2009-07-21 1 views
8

Мне нужно преобразовать большое количество SQL-запросов в хранимые процедуры. У меня есть код, который обновляет примерно 20 или 30 значений за один раз в одной процедуре Delphi. Я могу справиться с созданием хранимых процедур, чтобы сделать такую ​​вещь. Проблема заключается в мой способ передать параметры хранимых процедур очень громоздким, как это:Лучший способ передачи параметров в TADOStoredProc (Delphi)

with stored_procedure do...... 
    Param := Parameters.AddParameter; 
    Param.Name := '@SSN'; 
    Param.Value := edtSSN.text; 

    Param := Parameters.AddParameter; 
    Param.Name := '@FirstName'; 
    Param.Value := edtFirstName.Text; 

    Param := Parameters.AddParameter; 
    Param.Name := '@LastName'; 
    Param.Value := edtLastName.Text; 

    Param := Parameters.AddParameter; 
    Param.Name := '@UserRID'; 
    Param.Value:= GetRIDFromCombo(cbUser); 

Я также не уверен, что вызывает утечку памяти (это нужно, чтобы освободить такие объекты TParameter?)

У кого-нибудь есть лучший способ обработки большого количества параметров? (Я не могу использовать новую библиотеку. Я должен использовать ADO, а SQL, я использую MSSQL) (также, я НЕ использую ADO.net)

ответ

11

Это не вызывает утечки памяти. stored_procedure очистит его параметры. Вы можете подтвердить это с FastMM, добавив следующие строки в .dpr:

ReportMemoryLeaksOnShutdown := True; 

Во-первых, я бы избавиться от «с» заявлением. Это может привести к большему количеству проблем и менее читаемому коду.

Я бы создал вспомогательный метод, который принимает хранимую процедуру, имя параметра и значение параметра, что сделает ваш код более управляемым.

AddParam(stored_procedure, '@SSN', edtSSN.text); 
AddParam(stored_procedure, '@FirstName', edtFirstName.Text); 
AddParam(stored_procedure, '@LastName', edtLastName.Text); 
AddParam(stored_procedure, '@UserRID', GetRIDFromCombo(cbUser)); 
19

Там в принят ответ :-), но я хочу указать вам простой и легкий способ определить и использовать параметры одной строкой:

stored_procedure.Parameters.CreateParameter('SSN',ftString,pdInput,30,edtSSN.text); 

Это простой и гибкий, потому что вы может определять входные и выходные параметры с одной и той же строкой.

и с Delphi помощью:

function CreateParameter(const Name: WideString; DataType: TDataType; 
    Direction: TParameterDirection; Size: Integer; 
    Value: OleVariant): TParameter; 
+2

Это, как представляется, быть лучшим ответом, чем у меня. –

+0

Я не знал, что это было. Спасибо, что поделился! – robsoft

+0

Спасибо, Брюс и Роб, вот в чем красота, я многому научился для Delphier и стараюсь поделиться тем, что знаю с другими :-) –

10

ADO создаст параметры для вас, нужно просто вызвать Refresh на параметры объекта:

SP.Connection := SqlConnection; // must be done before setting procedure name 
sp.ProcedureName := 'MyStoredProc'; 
sp.Parameters.Refresh; // This will create the parameters for you as defined in SQL Server 
sp.Parameters.ParamByName('@SSN'').Value := SSN; // params now exist 

и т.д.

Если какие-либо параметры вы должны будете установить их явно:

sp.Parameters.ParamByName('@ReturnValue').Direction := pdInputOutput; 
+1

Это хорошо, но работает, только если процедура находится в базе данных по умолчанию для подключения. В ADO есть ошибка, которая уничтожает параметры, если вы используете DifferentDatabase.Owner.ProcedureName – DiGi

+1

Я также обнаружил, что .Refresh не всегда работает, даже в пределах одного и того же database.owner. Я не нашел никакого шаблона, когда он работает, а когда нет, но когда этого не происходит, я получаю, и ошибка, как «Параметр» @SearchText, не найдена.«когда я использую .ParamByName. Тот же вызов работает 99,9% времени. Добавление параметров вручную, похоже, обходит проблему. – Tony

0

Это самая короткая Я знаю:

stored_procedure.Parameters.ParamByName('@SSN').Value := edtSSN.text; 

Обратите внимание, что вам нужно назначить stored_procedure.Connection и вызвать stored_procedure.Parameters.Refresh; перед выполнением этой

 Смежные вопросы

  • Нет связанных вопросов^_^