2010-10-01 8 views
0

Notre application utilise presque exclusivement une classe DataAccessLayer personnalisée, et dans ce cadre, nous utilisons Data Access Application Block (actuellement version 2). Nous recevons sporadiquement l'erreur "GetOrdinal" tristement célèbre. Nous n'utilisons pas de connexions hors-méthode. Nous sont en utilisant la version de DAAB 2. Voici un exemple typique de nos méthodes DAL:Suppression des références de couche d'accès aux données personnalisées

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 

Dans notre code, nous instanciez un DAL var et appeler la méthode souhaitée. Après avoir utilisé le DataReader, le code de référencement fermera, éliminera et mettra le lecteur à zéro. Cependant, rien n'est fait avec la référence à la DAL. Je me suis demandé si cela faisait partie de notre problème. Une méthode typique utiliserait notre DAL comme ceci:

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 

Ma principale question est de savoir si ces références DAL doivent être éliminées d'une manière ou d'une autre? C'est une classe personnalisée écrite en VB.NET, donc elle n'implémente pas IDisposable donc je ne suis pas sûr qu'il y ait quelque chose à faire ou pas, mais nous avons des erreurs et des problèmes (comme le problème GetOrdinal) qui semblent être chargés -related, et je me demande si cela fait partie du problème.

Répondre

1

Si la couche d'accès au contenu contient au moins une variable membre qui est jetable (implémente IDisposable), elle doit également implémenter IDisposable. Cela indiquerait alors au client de DAL que Dispose() devrait être appelé. La fonction Dispose() du DAL appelle alors la (les) variable (s) membre (s) Dispose().

Ceci est la directive générale pour implémenter IDisposable.

BTW - il n'y a pas besoin de dbreader = nothing - il n'atteint rien. Voir Eric Lippert's post

Questions connexes