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 变量并调用所需的方法。使用 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),那么它也应该实现 IDisposable。这将向 DAL 的客户端指示应调用 Dispose()。然后 DAL 的 Dispose() 将调用成员变量 Dispose()。

这是实现 IDisposable 的一般指导。

顺便说一句 - 没有必要dbreader = nothing- 它一无所获。参见Eric Lippert 的帖子

于 2010-10-05T20:39:45.680 回答