diff --git a/ZeroLevel.SqlServer/Contracts/IDbProvider.cs b/ZeroLevel.SqlServer/Contracts/IDbProvider.cs index df9d8bc..df72029 100644 --- a/ZeroLevel.SqlServer/Contracts/IDbProvider.cs +++ b/ZeroLevel.SqlServer/Contracts/IDbProvider.cs @@ -18,5 +18,6 @@ namespace ZeroLevel.SqlServer int ExecuteNonResult(string query); int ExecuteNonResult(string query, DbParameter[] par); void LazySelect(string query, DbParameter[] par, Func readHandler, int timeout); + void LazySelectWithParameters(string query, IEnumerable> par, Func readHandler, int timeout); } } diff --git a/ZeroLevel.SqlServer/SqlDbProvider.cs b/ZeroLevel.SqlServer/SqlDbProvider.cs index a756c26..a7924ba 100644 --- a/ZeroLevel.SqlServer/SqlDbProvider.cs +++ b/ZeroLevel.SqlServer/SqlDbProvider.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; +using System.Linq; namespace ZeroLevel.SqlServer { @@ -215,6 +216,43 @@ namespace ZeroLevel.SqlServer } } } + + public void LazySelectWithParameters(string query, IEnumerable> par, Func readHandler, int timeout = Timeout) + { + using (var connection = _factory.CreateConnection()) + { + using (var cmd = CreateCommand(connection, query, null, Timeout)) + { + if (par != null && par.Any()) + { + foreach (var p in par) + { + cmd.Parameters.AddWithValue(p.Key, p.Value); + } + } + using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) + { + try + { + while (reader.Read()) + { + if (false == readHandler(reader)) + break; + } + } + catch (Exception ex) + { + Log.Error(ex, "Error executing query {0}.", cmd.CommandText); + } + finally + { + // Always call Close when done reading. + reader.Close(); + } + } + } + } + } #endregion #region ExistsTable