Общие функции доступа к данным - PullRequest
0 голосов
/ 22 декабря 2008

Как лучше всего кодировать следующие общие функции доступа к данным (ADO.NET, C # или VB, SQLServer или OLEDB)

  1. Выполнить SQL для соединения
  2. Открыть DataReader
  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

Ответы [ 2 ]

1 голос
/ 22 декабря 2008

Если это все, что вы хотите, то код, который вы опубликовали, по сути достаточно. Что касается того, что лучше всего ... Хорошо, я предлагаю использовать один из этих «шаблонов доступа к данным». Но это работает, и больше ничего не скажешь. Вы можете добавить другие функции для ExecuteScalar и т. Д., Если хотите.

В основном вы просто используете строки, если вы объединяете или строите свой SQL, это очень плохо. Если вы делаете это, вам действительно следует использовать параметризованные запросы и расширять свои функции для использования коллекций параметров и т.

1 голос
/ 22 декабря 2008

Вот мой метод Fill , который, учитывая общий список и лямбду, заполняет список объектами, считанными из 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 в одну строку, как эта.

...