2008-12-21 52 views
0

什么是编写以下通用数据访问功能的最佳方法(ADO.NET,C#或VB,SQLServer的或OLEDB)通用数据访问功能

  1. 执行的连接
  2. 打开一个DataReader上SQL
  3. 打开一个DataSet(在这一个任何想法?)

,这样我可以从任何地方在我的程序调用这些函数。我对数据访问模式或数据访问层不感兴趣,除非他们直接适用于这些功能。 (即,图案以自动关闭连接或读取器/数据集)使用的

实例

 

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 

实施例的功能

 

    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 

回答

1

这是我的Fill方法,该方法,给定的一个通用的列表和一lambda,使用从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)); 
     } 
    } 
} 

您可以使用这样的:

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

非常方便的是能包住了那的ExecuteReader和读取环路这样的一条线。

1

如果这就是你想要的,那么你发布的代码就足够了。至于什么是最好的...嗯,我建议使用这些“数据访问模式”之一。但这确实有效,没有什么可说的。如果您愿意,可以为ExecuteScalar等添加其他功能。

你基本上只是使用字符串,如果你连接或建立你的SQL,那么这是非常糟糕的。如果你这样做,你应该真正使用参数化查询并扩展你的函数来使用参数集合等等。