using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace Simple.Data.Sql { public static class DbConnectionExtensions { private const string SqlEmptyOrWhitespace = "Sql statement can't be empty or whitespace."; public static IEnumerable> ToResultSets(this IDbConnection connection, string sql, IDictionary parameters) { if (connection == null) throw new ArgumentNullException("connection"); if (sql == null) throw new ArgumentNullException("sql"); if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentException(SqlEmptyOrWhitespace, "sql"); parameters = parameters ?? new Dictionary(); var cmd = new DbCommandBuilder().BuildCommand(connection, sql, parameters); return connection.WithOpenConnection(() => cmd.ToResultSets()); } public static IEnumerable> ToResultSets(this IDbConnection connection, string sql, params KeyValuePair[] parameters) { parameters = parameters ?? new KeyValuePair[0]; return connection.ToResultSets(sql, parameters.ToDictionary(kv => kv.Key, kv => kv.Value)); } public static IEnumerable ToRows(this IDbConnection connection, string sql, IDictionary parameters) { if (connection == null) throw new ArgumentNullException("connection"); if (sql == null) throw new ArgumentNullException("sql"); if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentException(SqlEmptyOrWhitespace, "sql"); parameters = parameters ?? new Dictionary(); var cmd = new DbCommandBuilder().BuildCommand(connection, sql, parameters); return connection.WithOpenConnection(() => cmd.ToRows()); } public static IEnumerable ToRows(this IDbConnection connection, string sql, params KeyValuePair[] parameters) { parameters = parameters ?? new KeyValuePair[0]; return connection.ToRows(sql, parameters.ToDictionary(kv => kv.Key, kv => kv.Value)); } public static dynamic ToRow(this IDbConnection connection, string sql, IDictionary parameters) { if (connection == null) throw new ArgumentNullException("connection"); if (sql == null) throw new ArgumentNullException("sql"); if (string.IsNullOrWhiteSpace(sql)) throw new ArgumentException(SqlEmptyOrWhitespace, "sql"); parameters = parameters ?? new Dictionary(); var cmd = new DbCommandBuilder().BuildCommand(connection, sql, parameters); return connection.WithOpenConnection(() => cmd.ToRow()); } public static dynamic ToRow(this IDbConnection connection, string sql, params KeyValuePair[] parameters) { parameters = parameters ?? new KeyValuePair[0]; return connection.ToRow(sql, parameters.ToDictionary(kv => kv.Key, kv => kv.Value)); } private static T WithOpenConnection(this IDbConnection connection, Func func) { if (connection.State != ConnectionState.Closed) return func(); try { connection.Open(); return func(); } finally { connection.Close(); } } } }