2008-12-21 63 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,那麼這是非常糟糕的。如果你這樣做,你應該真正使用參數化查詢並擴展你的函數來使用參數集合等等。