/* * DbExtensions.cs * Author: Josh Bush (digitalbush.com) */ using System; using System.Data; using System.Collections.Generic; namespace Bush.Data{ public static class DbExtensions{ private delegate T DbAction(IDbCommand cmd); /// /// Helper method that does the connection and paramter setup. /// private static T ExecuteDbAction(IDbConnection conn, string commandText, IDbDataParameter[] parameters,DbAction dba){ if (conn.State != ConnectionState.Open) conn.Open(); using (IDbCommand cmd = conn.CreateCommand()){ cmd.CommandText = commandText; cmd.Connection = conn; if (parameters != null){ foreach (IDbDataParameter p in parameters) cmd.Parameters.Add(p); } return dba(cmd); } } /// /// Extension method to execute a query and return the resulting records /// public static IEnumerable Query(this IDbConnection conn, string commandText, params IDbDataParameter[] parameters){ return ExecuteDbAction>( conn, commandText, parameters, queryHelper //ugh, can't use yield inside of an anonymous method ); } public static IEnumerable Query(this IDbConnection conn, string commandText){ return conn.Query(commandText, null); } private static IEnumerable queryHelper(IDbCommand cmd){ using (IDataReader r = cmd.ExecuteReader()){ while (r.Read()) yield return r; } } /// /// Extension method to execute scalar query. /// public static object QueryValue(this IDbConnection conn, string commandText, params IDbDataParameter[] parameters){ return ExecuteDbAction( conn, commandText, parameters, cmd=>cmd.ExecuteScalar() ); } public static object QueryValue(this IDbConnection conn, string commandText){ return conn.QueryValue(commandText, null); } /// /// Extension method to execute a non-query. /// public static int Execute(this IDbConnection conn, string commandText, params IDbDataParameter[] parameters){ return ExecuteDbAction( conn, commandText, parameters, cmd => cmd.ExecuteNonQuery() ); } public static int Execute(this IDbConnection conn, string commandText){ return conn.Execute(commandText, null); } } }