编写以下通用数据访问函数(ADO.NET,C#或VB,SQLServer或OLEDB)的最佳编码方式是什么
这样我就可以在我的程序中的任何地方调用这些函数。我对数据访问模式或数据访问层不感兴趣,除非它们直接应用于这些功能。 (即自动关闭连接或读取器/数据集的模式)
使用示例
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
答案 0 :(得分: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和Read循环包装在一行中真的很方便。
答案 1 :(得分:1)
如果这就是你想要的,那么你发布的代码基本上就足够了。至于什么是最好的......好吧,我建议使用其中一种“数据访问模式”。但这确实有效,而且没有更多要说的。如果您愿意,可以为ExecuteScalar等添加其他功能。
你基本上只是使用字符串,如果你连接或构建你的SQL那么非常糟糕。如果您这样做,您应该使用参数化查询并扩展您的函数以使用参数集合等。