using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using System.Windows;
using System.Windows.Threading;
using ARLP.Common.DomainModel.DataSourceKeyResolver;
namespace ARLP.Common.DomainModel.StoredProcedure
{
public class StoredProcedureHelper
{
public void GetDataTableBySPAsync(string storedProcedureName, SqlParameter[] param,
Action<bool, string, DataTable> closeCallback,bool dispatchAutomatically = true)
{
try
{
var conn = new SqlConnection(GetConnectionString());
autoDispatch = dispatchAutomatically;
var cmd = new SqlCommand
{
CommandType = CommandType.StoredProcedure,
CommandText = storedProcedureName,
Connection = conn
};
CompletedCallbackDT = closeCallback;
if (param != null)
{
foreach (var item in param)
{
cmd.Parameters.Add(item);
}
}
conn.Open();
cmd.BeginExecuteReader(HandleCallbackDT, cmd);
}
catch (Exception ex)
{
throw ex;
}
}
public DataTable GetDataTableBySP(string storedProcedureName, SqlParameter[] param)
{
try
{
var conn = new SqlConnection(GetConnectionString());
var cmd = new SqlCommand
{
CommandType = CommandType.StoredProcedure,
CommandText = storedProcedureName,
Connection = conn
};
if (param != null)
{
foreach (var item in param)
{
cmd.Parameters.Add(item);
}
}
conn.Open();
var da = new SqlDataAdapter(cmd);
var dt = new DataTable();
da.Fill(dt);
conn.Close();
da.Dispose();
return dt;
}
catch (Exception ex)
{
throw ex;
}
}
public void ExecuteSPAsync(string storedProcedureName, SqlParameter[] param, Action<bool, string> closeCallback,
bool dispatchAutomatically = true)
{
try
{
autoDispatch = dispatchAutomatically;
var conn = new SqlConnection(GetConnectionString());
var cmd = new SqlCommand
{
CommandType = CommandType.StoredProcedure,
CommandText = storedProcedureName,
Connection = conn
};
CompletedCallback = closeCallback;
cmd.CommandTimeout = 600;
if (param != null)
foreach (var item in param)
{
cmd.Parameters.Add(item);
}
conn.Open();
cmd.BeginExecuteNonQuery(HandleCallbackNonQuery, cmd);
}
catch (Exception ex)
{
throw ex;
}
}
public void ExecuteSP(string storedProcedureName, SqlParameter[] param)
{
try
{
using (var conn = new SqlConnection(GetConnectionString()))
{
var cmd = new SqlCommand
{
CommandType = CommandType.StoredProcedure,
CommandText = storedProcedureName,
Connection = conn
};
cmd.CommandTimeout = 600;
if (param != null)
foreach (var item in param)
{
cmd.Parameters.Add(item);
}
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
}
catch (Exception ex)
{
throw ex;
}
}
public object ExecuteSPScalar(string storedProcedureName, SqlParameter[] param)
{
try
{
using (var conn = new SqlConnection(GetConnectionString()))
{
var cmd = new SqlCommand
{
CommandType = CommandType.StoredProcedure,
CommandText = storedProcedureName,
Connection = conn
};
cmd.CommandTimeout = 600;
if (param != null)
foreach (var item in param)
{
cmd.Parameters.Add(item);
}
conn.Open();
var obj = cmd.ExecuteScalar();
conn.Close();
return obj;
}
}
catch (Exception ex)
{
throw ex;
}
}
public bool DetermineDisconnected()
{
// Default to distributed
bool isDistributed = true;
// Check for local settings
var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\\AMOS");
if (key != null)
{
var value = key.GetValue("RunLocal");
bool convBool = true;
if (value == null)
{
value = string.Empty;
}
if (bool.TryParse(value.ToString(), out convBool))
{
isDistributed = !convBool;
}
}
return isDistributed;
}
public bool autoDispatch;
public T ConvertToEntity<T>(DataRow tableRow) where T : new()
{
// Create a new type of the entity I want
Type t = typeof (T);
T returnObject = new T();
foreach (DataColumn col in tableRow.Table.Columns)
{
string colName = col.ColumnName;
// Look for the object's property with the columns name, ignore case
PropertyInfo pInfo = t.GetProperty(colName.ToLower(),
BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
// did we find the property ?
if (pInfo != null)
{
object val = tableRow[colName];
// is this a Nullable<> type
bool IsNullable = (Nullable.GetUnderlyingType(pInfo.PropertyType) != null);
if (IsNullable)
{
if (val is System.DBNull)
{
val = null;
}
else
{
// Convert the db type into the T we have in our Nullable<T> type
val = Convert.ChangeType
(val, Nullable.GetUnderlyingType(pInfo.PropertyType));
}
}
else
{
// Convert the db type into the type of the property in our entity
val = Convert.ChangeType(val, pInfo.PropertyType);
}
// Set the value of the property with the value from the db
pInfo.SetValue(returnObject, val, null);
}
}
// return the entity object with values
return returnObject;
}
public Action<bool, string> CompletedCallback;
public Action<bool, string, DataTable> CompletedCallbackDT;
public void HandleCallbackDT(IAsyncResult result)
{
try
{
var command = (SqlCommand)result.AsyncState;
var reader = command.EndExecuteReader(result);
var table = new DataTable();
table.Load(reader);
if (autoDispatch)
{
Application.Current.Dispatcher.Invoke(
DispatcherPriority.Normal, new Action(() => CompletedCallbackDT(true, "", table)));
}
else
{
CompletedCallbackDT(true, "", table);
}
command.Connection.Close();
}
catch (Exception ex)
{
if (ex.InnerException != null)
{
var realerror = ex.InnerException;
while (realerror.InnerException != null)
realerror = realerror.InnerException;
if (autoDispatch)
{
Application.Current.Dispatcher.Invoke(
DispatcherPriority.Normal, new Action(() =>
CompletedCallbackDT(false, realerror.Message,
new DataTable())));
}
else
{
CompletedCallbackDT(true, "", new DataTable());
}
}
else
{
CompletedCallbackDT(false, ex.Message, new DataTable());
}
}
}
public void HandleCallbackNonQuery(IAsyncResult result)
{
try
{
var command = (SqlCommand) result.AsyncState;
command.EndExecuteNonQuery(result);
CompletedCallback(true, "");
command.Connection.Close();
}
catch (Exception ex)
{
if (ex.InnerException != null)
{
var realerror = ex.InnerException;
while (realerror.InnerException != null)
realerror = realerror.InnerException;
if (autoDispatch)
{
Application.Current.Dispatcher.Invoke(
DispatcherPriority.Normal, new Action(() =>
CompletedCallback(false, realerror.Message)));
}
else
{
CompletedCallback(false, realerror.Message);
}
}
else
{
if (autoDispatch)
{
Application.Current.Dispatcher.Invoke(
DispatcherPriority.Normal, new Action(() =>
CompletedCallback(false, ex.Message)));
}
else
{
CompletedCallback(false, ex.Message);
}
}
}
}
private string GetConnectionString()
{
var connectionStringName = DetermineDisconnected() ? ConfigurationManager.ConnectionStrings["Operation"].ConnectionString
: ConfigurationManager.ConnectionStrings["OperationTablet"].ConnectionString;
var connectionStr = CustomDataSourceKeyResolver.DecryptString(
connectionStringName,
ConfigurationManager.AppSettings.Get("Environment")) + "Async=true";
return connectionStr;
}
}
}