我们的应用程序几乎只使用自定义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问题)似乎是负载相关的,我想知道这是否是问题的一部分。
答案 0 :(得分:1)
如果DAL至少拥有一个Disposable成员变量(实现IDisposable),那么它也应该实现IDisposable。然后,这将向DAL的客户端指示应该调用Dispose()。然后,DAL的Dispose()将调用成员变量Dispose()。
这是实施IDisposable的一般指导。
BTW - 没有必要dbreader = nothing
- 它什么都没有。见Eric Lippert's post