Some fixes added during implementation of another system.

This commit is contained in:
grzegorz.russek
2012-10-03 06:01:53 +00:00
parent 936b90ab7b
commit d9d4ef65c3
4 changed files with 100 additions and 9 deletions

View File

@@ -145,6 +145,12 @@ namespace DynamORM
/// <summary>Gets or sets a value indicating whether set parameters for null values.</summary> /// <summary>Gets or sets a value indicating whether set parameters for null values.</summary>
public bool VirtualColumn { get; set; } public bool VirtualColumn { get; set; }
/// <summary>Gets or sets schema representation of a column.</summary>
/// <remarks>Woraround to providers issues which sometimes pass wrong
/// data o schema. For example decimal has precission of 255 in sql
/// server.</remarks>
public DynamicSchemaColumn? Schema { get; set; }
#endregion Properties #endregion Properties
#region Query creation helpers #region Query creation helpers
@@ -297,6 +303,8 @@ namespace DynamORM
#endregion Order #endregion Order
#region Other
/// <summary>Helper method setting /// <summary>Helper method setting
/// <see cref="DynamicColumn.ColumnName"/> /// <see cref="DynamicColumn.ColumnName"/>
/// to provided <c>name</c>.</summary> /// to provided <c>name</c>.</summary>
@@ -330,6 +338,44 @@ namespace DynamORM
return this; return this;
} }
/// <summary>Sets the begin block flag.</summary>
/// <param name="begin">If set to <c>true</c> [begin].</param>
/// <returns>Returns self.</returns>
public DynamicColumn SetBeginBlock(bool begin)
{
BeginBlock = begin;
return this;
}
/// <summary>Sets the end block flag.</summary>
/// <param name="end">If set to <c>true</c> [end].</param>
/// <returns>Returns self.</returns>
public DynamicColumn SetEndBlock(bool end)
{
EndBlock = end;
return this;
}
/// <summary>Sets the or flag.</summary>
/// <param name="or">If set to <c>true</c> [or].</param>
/// <returns>Returns self.</returns>
public DynamicColumn SetOr(bool or)
{
Or = or;
return this;
}
/// <summary>Sets the virtual column.</summary>
/// <param name="virt">If set to <c>true</c> [virt].</param>
/// <returns>Returns self.</returns>
public DynamicColumn SetVirtualColumn(bool virt)
{
VirtualColumn = virt;
return this;
}
#endregion Other
#endregion Query creation helpers #endregion Query creation helpers
#region Parsing #region Parsing

View File

@@ -287,7 +287,7 @@ namespace DynamORM
{ {
using (var rdr = cmd using (var rdr = cmd
.SetCommand(string.Format("SELECT * FROM {0} WHERE 1 = 0", DecorateName(table))) .SetCommand(string.Format("SELECT * FROM {0} WHERE 1 = 0", DecorateName(table)))
.ExecuteReader(CommandBehavior.SchemaOnly)) .ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo))
foreach (DataRow col in rdr.GetSchemaTable().Rows) foreach (DataRow col in rdr.GetSchemaTable().Rows)
{ {
var c = col.RowToDynamicUpper(); var c = col.RowToDynamicUpper();

View File

@@ -213,15 +213,40 @@ namespace DynamORM
return cmd; return cmd;
} }
/// <summary>Extension method for adding in a bunch of parameters.</summary>
/// <param name="cmd">Command to handle.</param>
/// <param name="database">Database object required to get proper formatting.</param>
/// <param name="args">Items to add in an expando object.</param>
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, ExpandoObject args)
{
if (args != null && args.Count() > 0)
foreach (var item in args.ToDictionary())
cmd.AddParameter(database, item.Key, item.Value);
return cmd;
}
/// <summary>Extension for adding single parameter determining only type of object.</summary> /// <summary>Extension for adding single parameter determining only type of object.</summary>
/// <param name="cmd">Command to handle.</param> /// <param name="cmd">Command to handle.</param>
/// <param name="database">Database object required to get proper formatting.</param> /// <param name="database">Database object required to get proper formatting.</param>
/// <param name="item">Items to add.</param> /// <param name="item">Items to add.</param>
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns> /// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
public static IDbCommand AddParameter(this IDbCommand cmd, DynamicDatabase database, object item) public static IDbCommand AddParameter(this IDbCommand cmd, DynamicDatabase database, object item)
{
return cmd.AddParameter(database, database.GetParameterName(cmd.Parameters.Count), item);
}
/// <summary>Extension for adding single parameter determining only type of object.</summary>
/// <param name="cmd">Command to handle.</param>
/// <param name="database">Database object required to get proper formatting.</param>
/// <param name="name">Name of parameter.</param>
/// <param name="item">Items to add.</param>
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
public static IDbCommand AddParameter(this IDbCommand cmd, DynamicDatabase database, string name, object item)
{ {
var p = cmd.CreateParameter(); var p = cmd.CreateParameter();
p.ParameterName = database.GetParameterName(cmd.Parameters.Count); p.ParameterName = name;
if (item == null) if (item == null)
p.Value = DBNull.Value; p.Value = DBNull.Value;
@@ -255,7 +280,7 @@ namespace DynamORM
var p = cmd.CreateParameter(); var p = cmd.CreateParameter();
p.ParameterName = builder.DynamicTable.Database.GetParameterName(cmd.Parameters.Count); p.ParameterName = builder.DynamicTable.Database.GetParameterName(cmd.Parameters.Count);
var col = builder.Schema.TryGetNullable(item.ColumnName.ToLower()); var col = item.Schema ?? builder.Schema.TryGetNullable(item.ColumnName.ToLower());
if (col.HasValue) if (col.HasValue)
{ {
@@ -268,6 +293,7 @@ namespace DynamORM
p.Scale = col.Value.Scale; p.Scale = col.Value.Scale;
// Quick fix - review that // Quick fix - review that
// Quick fix 2 - use item.Schema in that case
if (p.Scale > p.Precision) if (p.Scale > p.Precision)
p.Scale = 4; p.Scale = 4;
} }

View File

@@ -28,6 +28,7 @@
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 DynamORM.Builders; using DynamORM.Builders;
@@ -311,8 +312,8 @@ namespace DynamORM
/// <summary>Enumerate the reader and yield the result.</summary> /// <summary>Enumerate the reader and yield the result.</summary>
/// <param name="sql">Sql query containing numered parameters in format provided by /// <param name="sql">Sql query containing numered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName"/> methods. Also names should be formated with /// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formated with
/// <see cref="DecorateName.GetParameterName"/> method.</param> /// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param> /// <param name="args">Arguments (parameters).</param>
/// <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)
@@ -354,8 +355,8 @@ namespace DynamORM
/// <summary>Returns a single result.</summary> /// <summary>Returns a single result.</summary>
/// <param name="sql">Sql query containing numered parameters in format provided by /// <param name="sql">Sql query containing numered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName"/> methods. Also names should be formated with /// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formated with
/// <see cref="DecorateName.GetParameterName"/> method.</param> /// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param> /// <param name="args">Arguments (parameters).</param>
/// <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)
@@ -383,10 +384,28 @@ namespace DynamORM
} }
} }
/// <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 = null)
{
if ((Database.Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
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>
/// <param name="sql">Sql query containing numered parameters in format provided by /// <param name="sql">Sql query containing numered parameters in format provided by
/// <see cref="DynamicDatabase.GetParameterName"/> methods. Also names should be formated with /// <see cref="DynamicDatabase.GetParameterName(object)"/> methods. Also names should be formated with
/// <see cref="DecorateName.GetParameterName"/> method.</param> /// <see cref="DynamicDatabase.DecorateName(string)"/> method.</param>
/// <param name="args">Arguments (parameters).</param> /// <param name="args">Arguments (parameters).</param>
/// <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)