2008-12-21 13 views
0

Quelle est la meilleure façon de coder les fonctions d'accès aux données génériques suivants (ADO.NET, C# ou VB, SQL Server ou OLEDB)Data Access générique fonctionne

  1. Exécuter SQL sur une connexion
  2. Ouvrir un DataReader
  3. Ouvrir un DataSet (des idées sur celui-ci?)

ce que je peux appeler ces fonctions partout dans mon programme. Les modèles d'accès aux données ou les couches d'accès aux données ne m'intéressent pas, à moins qu'ils ne s'appliquent directement à ces fonctions. (Soit un motif pour fermer automatiquement la connexion ou le lecteur/jeu de données)

Exemples d'utilisation

 

ExecuteSQL("UPDATE tblTest SET x = 5 WHERE [ID] = 4") 

Using rdr As OleDb.OleDbDataReader = OpenReader("SELECT * FROM tblExecute") 
    While rdr.Read() 

    End While 
End Using 

Exemple Fonctions

 

    Public Function ExecuteSQL(ByVal strSQL As String) As Boolean 
     Using cn As New OleDb.OleDbConnection(strConn) 
      cn.Open() 
      Using cmd As New OleDb.OleDbCommand(strSQL, cn) 
       Return cmd.ExecuteNonQuery() > 0 
      End Using 
     End Using 
     Return False 
    End Function 

    Public Function OpenReader(ByVal strSQL As String) As OleDb.OleDbDataReader 
     Dim cn As New OleDb.OleDbConnection(strConn) 
     cn.Open() 
     If cn.State = ConnectionState.Open Then 
      Dim cmd As New OleDb.OleDbCommand(strSQL, cn) 
      Return cmd.ExecuteReader(CommandBehavior.CloseConnection) 
     Else 
      Throw New Exception("Unable to connect to database.") 
     End If 
    End Function 

Répondre

1

Voici ma méthode Fill qui, étant donné une liste générique et lambda, remplit la liste avec les objets lus à partir d'un IDataReader:

public static void Fill<T>(this IDbCommand cmd, 
    IList<T> list, Func<IDataReader, T> rowConverter) 
{ 
    using (var rdr = cmd.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      list.Add(rowConverter(rdr)); 
     } 
    } 
} 

Vous pouvez l'utiliser comme ceci:

// var cmd = new SqlCommand(...); 
// var things = new List<Thing>(); 
cmd.Fill(things, r => new Thing { ID = r.GetInt32(0), Name = r.GetString(1) }); 

vraiment à portée de main pour pouvoir envelopper cette boucle ExecuteReader et lire dans une ligne comme ça.

1

Si c'est tout ce que vous voulez, le code que vous avez posté est essentiellement suffisant. Quant à ce qui est le meilleur ... Eh bien, je suggère d'utiliser l'un de ces "modèles d'accès aux données". Mais cela fonctionne et il n'y a pas grand chose à dire. Vous ajoutez d'autres fonctions pour ExecuteScalar et ainsi de suite si vous le souhaitez.

Vous n'utilisez essentiellement que des chaînes, si vous concaténéz ou construisez votre SQL alors c'est très mauvais. Si vous faites cela, vous devriez vraiment utiliser les requêtes paramétrées et étendre vos fonctions pour utiliser les collections de paramètres et autres.