Move not table specific methods into database, but leave old declarations for compatibility (move to extension in the future)

This commit is contained in:
grzegorz.russek
2015-05-05 21:04:34 +00:00
parent 708728cf62
commit e4e50f76ef
4 changed files with 511 additions and 298 deletions

View File

@@ -902,7 +902,7 @@ namespace DynamORM
/// to be used after a connection is opened.</summary> /// to be used after a connection is opened.</summary>
public string Database public string Database
{ {
get { throw new NotImplementedException(); } get { return Connection.Database; }
} }
/// <summary>Gets the current state of the connection.</summary> /// <summary>Gets the current state of the connection.</summary>
@@ -1767,6 +1767,247 @@ namespace DynamORM
#endregion From/Insert/Update/Delete #endregion From/Insert/Update/Delete
#region Procedure
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName)
{
return Procedure(procName, (DynamicExpando)null);
}
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <param name="args">Arguments (parameters) in form of expando object.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, params object[] args)
{
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(this, args)
.ExecuteNonQuery();
}
}
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <param name="args">Arguments (parameters) in form of expando object.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, DynamicExpando args)
{
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(this, args)
.ExecuteNonQuery();
}
}
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <param name="args">Arguments (parameters) in form of expando object.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, ExpandoObject args)
{
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(this, args)
.ExecuteNonQuery();
}
}
#endregion Procedure
#region Execute
/// <summary>Execute non query.</summary>
/// <param name="sql">SQL query containing numbered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formatted with
/// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param>
/// <returns>Number of affected rows.</returns>
public virtual int Execute(string sql, params object[] args)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(this, args)
.ExecuteNonQuery();
}
}
/// <summary>Execute non query.</summary>
/// <param name="builder">Command builder.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder builder)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
}
/// <summary>Execute non query.</summary>
/// <param name="builders">Command builders.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder[] builders)
{
int ret = 0;
using (var con = Open())
{
using (var trans = con.BeginTransaction())
{
foreach (var builder in builders)
{
using (var cmd = con.CreateCommand())
{
ret += cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
}
trans.Commit();
}
}
return ret;
}
#endregion Execute
#region Scalar
/// <summary>Returns a single result.</summary>
/// <param name="sql">SQL query containing numbered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formatted with
/// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param>
/// <returns>Result of a query.</returns>
public virtual object Scalar(string sql, params object[] args)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(this, args)
.ExecuteScalar();
}
}
/// <summary>Returns a single result.</summary>
/// <param name="builder">Command builder.</param>
/// <returns>Result of a query.</returns>
public virtual object Scalar(IDynamicQueryBuilder builder)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteScalar();
}
}
#endregion Scalar
#region Query
/// <summary>Enumerate the reader and yield the result.</summary>
/// <param name="sql">SQL query containing numbered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formatted with
/// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param>
/// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(sql)
.AddParameters(this, args)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
}
/// <summary>Enumerate the reader and yield the result.</summary>
/// <param name="builder">Command builder.</param>
/// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(builder)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
}
#endregion Query
#region Schema #region Schema
/// <summary>Builds query cache if necessary and returns it.</summary> /// <summary>Builds query cache if necessary and returns it.</summary>
@@ -4480,33 +4721,7 @@ namespace DynamORM
/// <returns>Enumerator of objects expanded from query.</returns> /// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(string sql, params object[] args) public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
{ {
using (var con = Database.Open()) return Database.Query(sql, args);
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(sql)
.AddParameters(Database, args)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
} }
/// <summary>Enumerate the reader and yield the result.</summary> /// <summary>Enumerate the reader and yield the result.</summary>
@@ -4514,32 +4729,7 @@ namespace DynamORM
/// <returns>Enumerator of objects expanded from query.</returns> /// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder) public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder)
{ {
using (var con = Database.Open()) return Database.Query(builder);
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(builder)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
} }
/// <summary>Create new <see cref="DynamicSelectQueryBuilder"/>.</summary> /// <summary>Create new <see cref="DynamicSelectQueryBuilder"/>.</summary>
@@ -4563,13 +4753,7 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual object Scalar(string sql, params object[] args) public virtual object Scalar(string sql, params object[] args)
{ {
using (var con = Database.Open()) return Database.Scalar(sql, args);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(Database, args)
.ExecuteScalar();
}
} }
/// <summary>Returns a single result.</summary> /// <summary>Returns a single result.</summary>
@@ -4577,13 +4761,7 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual object Scalar(IDynamicQueryBuilder builder) public virtual object Scalar(IDynamicQueryBuilder builder)
{ {
using (var con = Database.Open()) return Database.Scalar(builder);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteScalar();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -4591,16 +4769,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName) public virtual int Procedure(string procName)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.ExecuteNonQuery();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -4609,17 +4778,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, params object[] args) public virtual int Procedure(string procName, params object[] args)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName, args);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -4628,17 +4787,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, DynamicExpando args) public virtual int Procedure(string procName, DynamicExpando args)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName, args);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -4647,17 +4796,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, ExpandoObject args) public virtual int Procedure(string procName, ExpandoObject args)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName, args);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute non query.</summary> /// <summary>Execute non query.</summary>
@@ -4668,13 +4807,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(string sql, params object[] args) public virtual int Execute(string sql, params object[] args)
{ {
using (var con = Database.Open()) return Database.Execute(sql, args);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute non query.</summary> /// <summary>Execute non query.</summary>
@@ -4682,41 +4815,15 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder builder) public virtual int Execute(IDynamicQueryBuilder builder)
{ {
using (var con = Database.Open()) return Database.Execute(builder);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
} }
/// <summary>Execute non query.</summary> /// <summary>Execute non query.</summary>
/// <param name="builers">Command builders.</param> /// <param name="builders">Command builders.</param>
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder[] builers) public virtual int Execute(IDynamicQueryBuilder[] builders)
{ {
int ret = 0; return Database.Execute(builders);
using (var con = Database.Open())
{
using (var trans = con.BeginTransaction())
{
foreach (var builder in builers)
{
using (var cmd = con.CreateCommand())
{
ret += cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
}
trans.Commit();
}
}
return ret;
} }
#endregion Basic Queries #endregion Basic Queries

View File

@@ -148,7 +148,7 @@ namespace DynamORM
/// to be used after a connection is opened.</summary> /// to be used after a connection is opened.</summary>
public string Database public string Database
{ {
get { throw new NotImplementedException(); } get { return Connection.Database; }
} }
/// <summary>Gets the current state of the connection.</summary> /// <summary>Gets the current state of the connection.</summary>

View File

@@ -30,6 +30,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Dynamic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using DynamORM.Builders; using DynamORM.Builders;
@@ -878,6 +879,247 @@ namespace DynamORM
#endregion From/Insert/Update/Delete #endregion From/Insert/Update/Delete
#region Procedure
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName)
{
return Procedure(procName, (DynamicExpando)null);
}
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <param name="args">Arguments (parameters) in form of expando object.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, params object[] args)
{
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(this, args)
.ExecuteNonQuery();
}
}
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <param name="args">Arguments (parameters) in form of expando object.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, DynamicExpando args)
{
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(this, args)
.ExecuteNonQuery();
}
}
/// <summary>Execute stored procedure.</summary>
/// <param name="procName">Name of stored procedure to execute.</param>
/// <param name="args">Arguments (parameters) in form of expando object.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, ExpandoObject args)
{
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(this, args)
.ExecuteNonQuery();
}
}
#endregion Procedure
#region Execute
/// <summary>Execute non query.</summary>
/// <param name="sql">SQL query containing numbered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formatted with
/// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param>
/// <returns>Number of affected rows.</returns>
public virtual int Execute(string sql, params object[] args)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(this, args)
.ExecuteNonQuery();
}
}
/// <summary>Execute non query.</summary>
/// <param name="builder">Command builder.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder builder)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
}
/// <summary>Execute non query.</summary>
/// <param name="builders">Command builders.</param>
/// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder[] builders)
{
int ret = 0;
using (var con = Open())
{
using (var trans = con.BeginTransaction())
{
foreach (var builder in builders)
{
using (var cmd = con.CreateCommand())
{
ret += cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
}
trans.Commit();
}
}
return ret;
}
#endregion Execute
#region Scalar
/// <summary>Returns a single result.</summary>
/// <param name="sql">SQL query containing numbered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formatted with
/// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param>
/// <returns>Result of a query.</returns>
public virtual object Scalar(string sql, params object[] args)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(this, args)
.ExecuteScalar();
}
}
/// <summary>Returns a single result.</summary>
/// <param name="builder">Command builder.</param>
/// <returns>Result of a query.</returns>
public virtual object Scalar(IDynamicQueryBuilder builder)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteScalar();
}
}
#endregion Scalar
#region Query
/// <summary>Enumerate the reader and yield the result.</summary>
/// <param name="sql">SQL query containing numbered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formatted with
/// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param>
/// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(sql)
.AddParameters(this, args)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
}
/// <summary>Enumerate the reader and yield the result.</summary>
/// <param name="builder">Command builder.</param>
/// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder)
{
using (var con = Open())
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(builder)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
}
#endregion Query
#region Schema #region Schema
/// <summary>Builds query cache if necessary and returns it.</summary> /// <summary>Builds query cache if necessary and returns it.</summary>

View File

@@ -28,10 +28,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data;
using System.Dynamic; using System.Dynamic;
using System.Linq; using System.Linq;
using System.Text;
using DynamORM.Builders; using DynamORM.Builders;
using DynamORM.Builders.Extensions; using DynamORM.Builders.Extensions;
using DynamORM.Builders.Implementation; using DynamORM.Builders.Implementation;
@@ -348,33 +346,7 @@ namespace DynamORM
/// <returns>Enumerator of objects expanded from query.</returns> /// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(string sql, params object[] args) public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
{ {
using (var con = Database.Open()) return Database.Query(sql, args);
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(sql)
.AddParameters(Database, args)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
} }
/// <summary>Enumerate the reader and yield the result.</summary> /// <summary>Enumerate the reader and yield the result.</summary>
@@ -382,32 +354,7 @@ namespace DynamORM
/// <returns>Enumerator of objects expanded from query.</returns> /// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder) public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder)
{ {
using (var con = Database.Open()) return Database.Query(builder);
using (var cmd = con.CreateCommand())
using (var rdr = cmd
.SetCommand(builder)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catch block:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
} }
/// <summary>Create new <see cref="DynamicSelectQueryBuilder"/>.</summary> /// <summary>Create new <see cref="DynamicSelectQueryBuilder"/>.</summary>
@@ -431,13 +378,7 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual object Scalar(string sql, params object[] args) public virtual object Scalar(string sql, params object[] args)
{ {
using (var con = Database.Open()) return Database.Scalar(sql, args);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(Database, args)
.ExecuteScalar();
}
} }
/// <summary>Returns a single result.</summary> /// <summary>Returns a single result.</summary>
@@ -445,13 +386,7 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual object Scalar(IDynamicQueryBuilder builder) public virtual object Scalar(IDynamicQueryBuilder builder)
{ {
using (var con = Database.Open()) return Database.Scalar(builder);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteScalar();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -459,16 +394,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName) public virtual int Procedure(string procName)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.ExecuteNonQuery();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -477,17 +403,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, params object[] args) public virtual int Procedure(string procName, params object[] args)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName, args);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -496,17 +412,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, DynamicExpando args) public virtual int Procedure(string procName, DynamicExpando args)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName, args);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute stored procedure.</summary> /// <summary>Execute stored procedure.</summary>
@@ -515,17 +421,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Procedure(string procName, ExpandoObject args) public virtual int Procedure(string procName, ExpandoObject args)
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) return Database.Procedure(procName, args);
throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(CommandType.StoredProcedure, procName)
.AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute non query.</summary> /// <summary>Execute non query.</summary>
@@ -536,13 +432,7 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(string sql, params object[] args) public virtual int Execute(string sql, params object[] args)
{ {
using (var con = Database.Open()) return Database.Execute(sql, args);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(sql).AddParameters(Database, args)
.ExecuteNonQuery();
}
} }
/// <summary>Execute non query.</summary> /// <summary>Execute non query.</summary>
@@ -550,41 +440,15 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder builder) public virtual int Execute(IDynamicQueryBuilder builder)
{ {
using (var con = Database.Open()) return Database.Execute(builder);
using (var cmd = con.CreateCommand())
{
return cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
} }
/// <summary>Execute non query.</summary> /// <summary>Execute non query.</summary>
/// <param name="builers">Command builders.</param> /// <param name="builders">Command builders.</param>
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder[] builers) public virtual int Execute(IDynamicQueryBuilder[] builders)
{ {
int ret = 0; return Database.Execute(builders);
using (var con = Database.Open())
{
using (var trans = con.BeginTransaction())
{
foreach (var builder in builers)
{
using (var cmd = con.CreateCommand())
{
ret += cmd
.SetCommand(builder)
.ExecuteNonQuery();
}
}
trans.Commit();
}
}
return ret;
} }
#endregion Basic Queries #endregion Basic Queries