0

私たちのアプリケーションは、ほぼ例外なくカスタム DataAccessLayer クラスを使用しており、その中で Data Access Application Block (現在はバージョン 2) を使用しています。悪名高い「GetOrdinal」エラーが散発的に発生しています。方法外接続は使用していません。DAABバージョン 2使用しています。以下は、DAL メソッドの典型的な例です。

Public Function MyDALMethod(ByVal Param1 As Integer, ByVal Param2 As Integer) As System.Data.IDataReader

        Dim db As Database = DatabaseFactory.CreateDatabase()
        Dim sqlCommand As String = "usp_MyProcedure"
        Dim dbCommand As DbCommand = db.GetStoredProcCommand(sqlCommand)
        db.AddInParameter(dbCommand, "Param1", DbType.Int32, MyParam1)
        db.AddInParameter(dbCommand, "Param2", DbType.Int32, MyParam2)

        Return db.ExecuteReader(dbCommand)

End Function

このコードでは、DAL var をインスタンス化し、目的のメソッドを呼び出すだけです。DataReader を使用した後、参照コードはリーダーを閉じて破棄し、何も設定しません。ただし、DAL への参照では何も行われません。これが私たちの問題の一部なのだろうかと思いました。典型的な方法では、次のように DAL を使用します。

Dim DAL as New DataAccessLayer
Dim dbReader as system.data.idatareader

dbreader = DAL.MyDALMethod(parm1, parm2)

While dbreader.read
    i = dbreader.items("column1")
    j = dbreader.items("column2")
End While

dbreader.close()
dbreader.dispose()
dbreader = nothing

私の主な質問は、これらの DAL 参照を何らかの方法で破棄する必要があるかどうかです。これは VB.NET で記述されたカスタム クラスであるため、IDisposable を実装していないため、実行する必要があるかどうかはわかりませんが、ロードされているように見えるエラーや問題 (GetOrdinal の問題など) があります。 -関連しており、これが問題の一部であるかどうか疑問に思っています。

4

1 に答える 1

1

DALがDisposable(IDisposableを実装)である少なくとも1つのメンバー変数を保持している場合、DALもIDisposableを実装する必要があります。これは、Dispose()を呼び出す必要があることをDALのクライアントに示します。次に、DALのDispose()は、メンバー変数Dispose()を呼び出します。

これは、IDisposableを実装するための一般的なガイダンスです。

ところで-する必要はありませんdbreader = nothing-それは何も達成しません。EricLippertの投稿を参照してください

于 2010-10-05T20:39:45.680 に答える