2009-07-21 27 views
8

大量のSQLクエリをストアドプロシージャに変換する必要があります。私は1つのデルファイ手順で一度に約20または30の値を更新するいくつかのコードを持っています。私はそのようなことをするストアドプロシージャの作成を処理できます。問題は、ストアドプロシージャにパラメータを渡すための私の方法である。このような非常にかさばるです:(?それは、このようなのTParameterオブジェクトを解放する必要がある)パラメータを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); 

私もそれが原因となる場合は、メモリリークがわからない

誰でも大量のパラメータを扱うより良い方法はありますか? (私は新しいライブラリを使用することはできません.ADOを使用する必要がありますし、使用するSQLはMSSQLです)(また、私はADO.netを使用していません)

答えて

11

これはメモリリークを引き起こしません。 stored_procedureはそのパラメータをクリーンアップします。あなたは.dprに以下を追加してFastMMでこれを確認できます:

ReportMemoryLeaksOnShutdown := True; 

まず、「with」ステートメントを削除します。より多くの問題と読みにくいコードにつながる可能性があります。

私は、ストアドプロシージャ、パラメータ名、およびパラメータ値を受け入れるヘルパーメソッドを作成して、コードをより管理しやすくします。

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

あり受け入れ回答:-)だが、私は1行でパラメータを定義し、使用するための単純で簡単な方法にあなたを指すようにしたい:

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

ますので、それは、シンプルで柔軟なのです入力と出力のパラメータを同じ行で定義できます。

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

を行う前stored_procedure.Parameters.Refresh;を呼び出す必要があります。 –

+0

私はその存在を知らなかった。共有ありがとう! – robsoft

+0

おかげさまでブルース&ロブ、それはSOの美しさです、私はここでデルフィアの多くのことを学び、私が他人と知っていることを共有しようとしています:-) –

10

ADOがあなたのために、あなただけのパラメータの更新を呼び出すために必要なパラメータを作成するオブジェクト:

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 

など

任意のパラメータであれば

とDelphiのヘルプから

出力する場合は、明示的に設定する必要があります。

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

これはいいですが、プロシージャが接続のデフォルトデータベースにある場合にのみ機能します。 DifferentDatabase.Owner.ProcedureNameを使用するとパラメータを破棄するバグがADOにあります – DiGi

+1

同じdatabase.owner内であっても.Refreshが常に機能するとは限りません。私はそれが動作していないときにはパターンを見つけられませんでしたが、それが得られないときには "Parameter '@SearchText'のようなエラーが見つかりませんでした。".ParamByNameを使用すると、同じ呼び出しが99.9%の時間で実行されます。手動でパラメータを追加すると、問題が回避されるようです。 – Tony

0

これは私が知っている最も短いです:

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

注意、あなたはstored_procedure.Connectionを割り当てて、これが私より良い答えように見えるこの

関連する問題