通用数据访问功能

时间:2008-12-21 23:27:13

标签: sql-server function oledb data-access

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

  1. 在连接上执行SQL
  2. 打开DataReader
  3. 打开一个DataSet(关于这个的任何想法?)
  4. 这样我就可以在我的程序中的任何地方调用这些函数。我对数据访问模式或数据访问层不感兴趣,除非它们直接应用于这些功能。 (即自动关闭连接或读取器/数据集的模式)

    使用示例

    
    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
    
    

2 个答案:

答案 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那么非常糟糕。如果您这样做,您应该使用参数化查询并扩展您的函数以使用参数集合等。