2010-10-01 92 views
0

我們的應用程序幾乎全部使用自定義的DataAccessLayer類,並且在其中我們使用數據訪問應用程序塊(當前版本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問題),這似乎是負載相關的,我想知道這是否是問題的一部分。

回答

1

如果DAL至少保存一個是Disposable的成員變量(實現IDisposable),那麼它也應該實現IDisposable。然後這將向DAL的客戶端指示應該調用Dispose()。 DAL的Dispose()然後會調用成員變量Dispose()。

這是實現IDisposable的一般指導。

順便說一句 - 沒有必要dbreader = nothing - 它什麼都沒有實現。見Eric Lippert's post