-
-
Save huobazi/2a898a43c36ad68b6d5c49200ceff5ed to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections; | |
using System.Data; | |
using MySql.Data.MySqlClient; | |
using System.Linq; | |
using System.Xml; | |
namespace OBALog.Data | |
{ | |
[System.Diagnostics.DebuggerStepThrough] | |
public static class MySqlHelper | |
{ | |
internal static int Timeout = 180; | |
#region private utility methods & constructors | |
// Since this class provides only static methods, make the default constructor private to prevent | |
// instances from being created with "new SqlHelper()" | |
/// <summary> | |
/// This method is used to attach array of MySqlParameters to a MySqlCommand. | |
/// | |
/// This method will assign a value of DbNull to any parameter with a direction of | |
/// InputOutput and a value of null. | |
/// | |
/// This behavior will prevent default values from being used, but | |
/// this will be the less common case than an intended pure output parameter (derived as InputOutput) | |
/// where the user provided no input value. | |
/// </summary> | |
/// <param name="command">The command to which the parameters will be added</param> | |
/// <param name="commandParameters">An array of MySqlParameters to be added to command</param> | |
private static void AttachParameters(MySqlCommand command, MySqlParameter[] commandParameters) | |
{ | |
if (command == null) throw new ArgumentNullException("command"); | |
if (commandParameters != null) | |
{ | |
foreach (MySqlParameter p in commandParameters.Where(p => p != null)) | |
{ | |
// Check for derived output value with no value assigned | |
if ((p.Direction == ParameterDirection.InputOutput || | |
p.Direction == ParameterDirection.Input) && | |
(p.Value == null)) | |
{ | |
p.Value = DBNull.Value; | |
} | |
command.Parameters.Add(p); | |
} | |
} | |
} | |
/// <summary> | |
/// This method assigns dataRow column values to an array of MySqlParameters | |
/// </summary> | |
/// <param name="commandParameters">Array of MySqlParameters to be assigned values</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values</param> | |
private static void AssignParameterValues(MySqlParameter[] commandParameters, DataRow dataRow) | |
{ | |
if ((commandParameters == null) || (dataRow == null)) | |
{ | |
// Do nothing if we get no data | |
return; | |
} | |
int i = 0; | |
// Set the parameters values | |
foreach (MySqlParameter commandParameter in commandParameters) | |
{ | |
// Check the parameter name | |
if (commandParameter.ParameterName == null || | |
commandParameter.ParameterName.Length <= 1) | |
throw new Exception(string.Format("Please provide a valid parameter name on the parameter #{0}, the ParameterName property has the following value: '{1}'.", i, commandParameter.ParameterName)); | |
if (dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1) | |
commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)]; | |
i++; | |
} | |
} | |
/// <summary> | |
/// This method assigns an array of values to an array of MySqlParameters | |
/// </summary> | |
/// <param name="commandParameters">Array of MySqlParameters to be assigned values</param> | |
/// <param name="parameterValues">Array of objects holding the values to be assigned</param> | |
private static void AssignParameterValues(MySqlParameter[] commandParameters, object[] parameterValues) | |
{ | |
if ((commandParameters == null) || (parameterValues == null)) | |
{ | |
// Do nothing if we get no data | |
return; | |
} | |
// We must have the same number of values as we pave parameters to put them in | |
if (commandParameters.Length != parameterValues.Length) | |
{ | |
throw new ArgumentException("Parameter count does not match Parameter Value count."); | |
} | |
// Iterate through the MySqlParameters, assigning the values from the corresponding position in the | |
// value array | |
for (int i = 0, j = commandParameters.Length; i < j; i++) | |
{ | |
// If the current array value derives from IDbDataParameter, then assign its Value property | |
if (parameterValues[i] is IDbDataParameter) | |
{ | |
IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i]; | |
commandParameters[i].Value = paramInstance.Value ?? DBNull.Value; | |
} | |
else if (parameterValues[i] == null) | |
{ | |
commandParameters[i].Value = DBNull.Value; | |
} | |
else | |
{ | |
commandParameters[i].Value = parameterValues[i]; | |
} | |
} | |
} | |
/// <summary> | |
/// This method opens (if necessary) and assigns a connection, transaction, command type and parameters | |
/// to the provided command | |
/// </summary> | |
/// <param name="command">The MySqlCommand to be prepared</param> | |
/// <param name="connection">A valid MySqlConnection, on which to execute this command</param> | |
/// <param name="transaction">A valid MySqlTransaction, or 'null'</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of MySqlParameters to be associated with the command or 'null' if no parameters are required</param> | |
/// <param name="mustCloseConnection"><c>true</c> if the connection was opened by the method, otherwose is false.</param> | |
private static void PrepareCommand(MySqlCommand command, MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, MySqlParameter[] commandParameters, out bool mustCloseConnection) | |
{ | |
if (command == null) throw new ArgumentNullException("command"); | |
if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException("commandText"); | |
// If the provided connection is not open, we will open it | |
if (connection.State != ConnectionState.Open) | |
{ | |
mustCloseConnection = true; | |
connection.Open(); | |
} | |
else | |
{ | |
mustCloseConnection = false; | |
} | |
// Associate the connection with the command | |
command.Connection = connection; | |
// Set the command text (stored procedure name or SQL statement) | |
command.CommandText = commandText; | |
// If we were provided a transaction, assign it | |
if (transaction != null) | |
{ | |
if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or committed, please provide an open transaction.", "transaction"); | |
command.Transaction = transaction; | |
} | |
// Set the command type | |
command.CommandType = commandType; | |
// Attach the command parameters if they are provided | |
if (commandParameters != null) | |
{ | |
AttachParameters(command, commandParameters); | |
} | |
return; | |
} | |
#endregion private utility methods & constructors | |
#region ExecuteNonQuery | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset and takes no parameters) against the database specified in | |
/// the connection string | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteNonQuery(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset) against the database specified in the connection string | |
/// using the provided parameters | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
// Create & open a MySqlConnection, and dispose of it after we are done | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
connection.Open(); | |
// Call the overload that takes a connection in place of the connection string | |
return ExecuteNonQuery(connection, commandType, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored prcedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteNonQuery(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, connection, (MySqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Finally, execute the command | |
int retval = cmd.ExecuteNonQuery(); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
if (mustCloseConnection) | |
connection.Close(); | |
return retval; | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteNonQuery(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or committed, please provide an open transaction.", "transaction"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Finally, execute the command | |
int retval = cmd.ExecuteNonQuery(); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
return retval; | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or committed, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteNonQuery | |
#region ExecuteDataSet | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(connString, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(string connectionString, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataSet(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(connString, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
// Create & open a MySqlConnection, and dispose of it after we are done | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
connection.Open(); | |
// Call the overload that takes a connection in place of the connection string | |
return ExecuteDataSet(connection, commandType, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(connString, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(string connectionString, string spName, params object[] parameterValues) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteDataSet(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteDataSet(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(conn, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataSet(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(conn, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, connection, (MySqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Create the DataAdapter & DataSet | |
using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) | |
{ | |
DataSet ds = new DataSet(); | |
// Fill the DataSet using default values for DataTable names, etc | |
da.Fill(ds); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
if (mustCloseConnection) | |
connection.Close(); | |
// Return the dataset | |
return ds; | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(conn, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteDataSet(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteDataSet(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(trans, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataSet(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(trans, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Create the DataAdapter & DataSet | |
using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) | |
{ | |
DataSet ds = new DataSet(); | |
// Fill the DataSet using default values for DataTable names, etc | |
da.Fill(ds); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
// Return the dataset | |
return ds; | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataSet ds = ExecuteDataSet(trans, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataSet(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteDataSet(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteDataSet(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteDataSet | |
#region ExecuteDataTable | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(connString, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(string connectionString, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataTable(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(connString, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
// Create & open a MySqlConnection, and dispose of it after we are done | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
connection.Open(); | |
// Call the overload that takes a connection in place of the connection string | |
return ExecuteDataTable(connection, commandType, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(connString, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(string connectionString, string spName, params object[] parameterValues) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteDataTable(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteDataTable(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(conn, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataTable(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(conn, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, connection, (MySqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Create the DataAdapter & DataTable | |
using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) | |
{ | |
DataTable ds = new DataTable(); | |
// Fill the DataTable using default values for DataTable names, etc | |
da.Fill(ds); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
if (mustCloseConnection) | |
connection.Close(); | |
// Return the DataTable | |
return ds; | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(conn, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteDataTable(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteDataTable(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(trans, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataTable(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(trans, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Create the DataAdapter & DataTable | |
using (MySqlDataAdapter da = new MySqlDataAdapter(cmd)) | |
{ | |
DataTable ds = new DataTable(); | |
// Fill the DataTable using default values for DataTable names, etc | |
da.Fill(ds); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
// Return the DataTable | |
return ds; | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataTable ds = ExecuteDataTable(trans, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A DataTable containing the resultset generated by the command</returns> | |
public static DataTable ExecuteDataTable(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteDataTable(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteDataTable(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteDataTable | |
#region ExecuteReader | |
/// <summary> | |
/// This enum is used to indicate whether the connection was provided by the caller, or created by SqlHelper, so that | |
/// we can set the appropriate CommandBehavior when calling ExecuteReader() | |
/// </summary> | |
private enum MySqlConnectionOwnership | |
{ | |
/// <summary>Connection is owned and managed by SqlHelper</summary> | |
Internal, | |
/// <summary>Connection is owned and managed by the caller</summary> | |
External | |
} | |
/// <summary> | |
/// Create and prepare a MySqlCommand, and call ExecuteReader with the appropriate CommandBehavior. | |
/// </summary> | |
/// <remarks> | |
/// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. | |
/// | |
/// If the caller provided the connection, we want to leave it to them to manage. | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection, on which to execute this command</param> | |
/// <param name="transaction">A valid MySqlTransaction, or 'null'</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of MySqlParameters to be associated with the command or 'null' if no parameters are required</param> | |
/// <param name="connectionOwnership">Indicates whether the connection parameter was provided by the caller, or created by SqlHelper</param> | |
/// <returns>MySqlDataReader containing the results of the command</returns> | |
private static MySqlDataReader ExecuteReader(MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, MySqlParameter[] commandParameters, MySqlConnectionOwnership connectionOwnership) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
bool mustCloseConnection = false; | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
try | |
{ | |
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Create a reader | |
// Call ExecuteReader with the appropriate CommandBehavior | |
var dataReader = connectionOwnership == MySqlConnectionOwnership.External ? cmd.ExecuteReader() : cmd.ExecuteReader(CommandBehavior.CloseConnection); | |
// Detach the MySqlParameters from the command object, so they can be used again. | |
// HACK: There is a problem here, the output parameter values are fletched | |
// when the reader is closed, so if the parameters are detached from the command | |
// then the SqlReader can´t set its values. | |
// When this happen, the parameters can´t be used again in other command. | |
bool canClear = true; | |
foreach (MySqlParameter commandParameter in cmd.Parameters) | |
{ | |
if (commandParameter.Direction != ParameterDirection.Input) | |
canClear = false; | |
} | |
if (canClear) | |
{ | |
cmd.Parameters.Clear(); | |
} | |
return dataReader; | |
} | |
catch | |
{ | |
if (mustCloseConnection) | |
connection.Close(); | |
throw; | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteReader(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
MySqlConnection connection = null; | |
try | |
{ | |
connection = new MySqlConnection(connectionString); | |
connection.Open(); | |
// Call the private overload that takes an internally owned connection in place of the connection string | |
return ExecuteReader(connection, null, commandType, commandText, commandParameters, MySqlConnectionOwnership.Internal); | |
} | |
catch | |
{ | |
// If we fail to return the SqlDatReader, we need to close the connection ourselves | |
if (connection != null) connection.Close(); | |
throw; | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
AssignParameterValues(commandParameters, parameterValues); | |
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteReader(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
// Pass through the call to the private overload using a null transaction value and an externally owned connection | |
return ExecuteReader(connection, (MySqlTransaction)null, commandType, commandText, commandParameters, MySqlConnectionOwnership.External); | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
AssignParameterValues(commandParameters, parameterValues); | |
return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteReader(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteReader(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
// Pass through to private overload, indicating that the connection is owned by the caller | |
return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, MySqlConnectionOwnership.External); | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
AssignParameterValues(commandParameters, parameterValues); | |
return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteReader(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteReader | |
#region ExecuteScalar | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
// Create & open a MySqlConnection, and dispose of it after we are done | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
connection.Open(); | |
// Call the overload that takes a connection in place of the connection string | |
return ExecuteScalar(connection, commandType, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, connection, (MySqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Execute the command & return the results | |
object retval = cmd.ExecuteScalar(); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
if (mustCloseConnection) | |
connection.Close(); | |
return retval; | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteScalar(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
// Pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
// Create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand() { CommandTimeout = Timeout }; | |
bool mustCloseConnection = false; | |
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Execute the command & return the results | |
object retval = cmd.ExecuteScalar(); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
cmd.Parameters.Clear(); | |
return retval; | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// PPull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteScalar | |
#region FillDataset | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name)</param> | |
public static void FillDataset(string connectionString, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (dataSet == null) throw new ArgumentNullException("dataSet"); | |
// Create & open a MySqlConnection, and dispose of it after we are done | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
connection.Open(); | |
// Call the overload that takes a connection in place of the connection string | |
FillDataset(connection, commandType, commandText, dataSet, tableNames); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
public static void FillDataset(string connectionString, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params MySqlParameter[] commandParameters) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (dataSet == null) throw new ArgumentNullException("dataSet"); | |
// Create & open a MySqlConnection, and dispose of it after we are done | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
connection.Open(); | |
// Call the overload that takes a connection in place of the connection string | |
FillDataset(connection, commandType, commandText, dataSet, tableNames, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 24); | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
public static void FillDataset(string connectionString, string spName, DataSet dataSet, string[] tableNames, params object[] parameterValues) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (dataSet == null) throw new ArgumentNullException("dataSet"); | |
// Create & open a MySqlConnection, and dispose of it after we are done | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
connection.Open(); | |
// Call the overload that takes a connection in place of the connection string | |
FillDataset(connection, spName, dataSet, tableNames, parameterValues); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
public static void FillDataset(MySqlConnection connection, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) | |
{ | |
FillDataset(connection, commandType, commandText, dataSet, tableNames, null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
public static void FillDataset(MySqlConnection connection, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params MySqlParameter[] commandParameters) | |
{ | |
FillDataset(connection, null, commandType, commandText, dataSet, tableNames, commandParameters); | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 36); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
public static void FillDataset(MySqlConnection connection, string spName, DataSet dataSet, string[] tableNames, params object[] parameterValues) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (dataSet == null) throw new ArgumentNullException("dataSet"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
public static void FillDataset(MySqlTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) | |
{ | |
FillDataset(transaction, commandType, commandText, dataSet, tableNames, null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
public static void FillDataset(MySqlTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params MySqlParameter[] commandParameters) | |
{ | |
FillDataset(transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters); | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 36); | |
/// </remarks> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
/// <param name="parameterValues">An array of objects to be assigned as the input values of the stored procedure</param> | |
public static void FillDataset(MySqlTransaction transaction, string spName, DataSet dataSet, string[] tableNames, params object[] parameterValues) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (dataSet == null) throw new ArgumentNullException("dataSet"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
// Call the overload that takes an array of MySqlParameters | |
FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); | |
} | |
else | |
{ | |
// Otherwise we can just call the SP without params | |
FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames); | |
} | |
} | |
/// <summary> | |
/// Private helper method that execute a MySqlCommand (that returns a resultset) against the specified MySqlTransaction and MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection</param> | |
/// <param name="transaction">A valid MySqlTransaction</param> | |
/// <param name="commandType">The CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="dataSet">A dataset wich will contain the resultset generated by the command</param> | |
/// <param name="tableNames">This array will be used to create table mappings allowing the DataTables to be referenced | |
/// by a user defined name (probably the actual table name) | |
/// </param> | |
/// <param name="commandParameters">An array of SqlParamters used to execute the command</param> | |
private static void FillDataset(MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames, params MySqlParameter[] commandParameters) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (dataSet == null) throw new ArgumentNullException("dataSet"); | |
// Create a command and prepare it for execution | |
MySqlCommand command = new MySqlCommand(); | |
bool mustCloseConnection = false; | |
PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); | |
// Create the DataAdapter & DataSet | |
using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter(command)) | |
{ | |
// Add the table mappings specified by the user | |
if (tableNames != null && tableNames.Length > 0) | |
{ | |
string tableName = "Table"; | |
for (int index = 0; index < tableNames.Length; index++) | |
{ | |
if (tableNames[index] == null || tableNames[index].Length == 0) throw new ArgumentException("The tableNames parameter must contain a list of tables, a value was provided as null or empty string.", "tableNames"); | |
dataAdapter.TableMappings.Add(tableName, tableNames[index]); | |
tableName += (index + 1).ToString(); | |
} | |
} | |
// Fill the DataSet using default values for DataTable names, etc | |
dataAdapter.Fill(dataSet); | |
// Detach the MySqlParameters from the command object, so they can be used again | |
command.Parameters.Clear(); | |
} | |
if (mustCloseConnection) | |
connection.Close(); | |
} | |
#endregion | |
#region UpdateDataset | |
/// <summary> | |
/// Executes the respective command for each inserted, updated, or deleted row in the DataSet. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// UpdateDataset(conn, insertCommand, deleteCommand, updateCommand, dataSet, "Order"); | |
/// </remarks> | |
/// <param name="insertCommand">A valid transact-SQL statement or stored procedure to insert new records into the data source</param> | |
/// <param name="deleteCommand">A valid transact-SQL statement or stored procedure to delete records from the data source</param> | |
/// <param name="updateCommand">A valid transact-SQL statement or stored procedure used to update records in the data source</param> | |
/// <param name="dataSet">The DataSet used to update the data source</param> | |
/// <param name="tableName">The DataTable used to update the data source.</param> | |
public static void UpdateDataset(MySqlCommand insertCommand, MySqlCommand deleteCommand, MySqlCommand updateCommand, DataSet dataSet, string tableName) | |
{ | |
if (insertCommand == null) throw new ArgumentNullException("insertCommand"); | |
if (deleteCommand == null) throw new ArgumentNullException("deleteCommand"); | |
if (updateCommand == null) throw new ArgumentNullException("updateCommand"); | |
if (string.IsNullOrEmpty(tableName)) throw new ArgumentNullException("tableName"); | |
// Create a MySqlDataAdapter, and dispose of it after we are done | |
using (MySqlDataAdapter dataAdapter = new MySqlDataAdapter()) | |
{ | |
// Set the data adapter commands | |
dataAdapter.UpdateCommand = updateCommand; | |
dataAdapter.InsertCommand = insertCommand; | |
dataAdapter.DeleteCommand = deleteCommand; | |
// Update the dataset changes in the data source | |
dataAdapter.Update(dataSet, tableName); | |
// Commit all the changes made to the DataSet | |
dataSet.AcceptChanges(); | |
} | |
} | |
#endregion | |
#region CreateCommand | |
/// <summary> | |
/// Simplify the creation of a Sql command object by allowing | |
/// a stored procedure and optional parameters to be provided | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlCommand command = CreateCommand(conn, "AddCustomer", "CustomerID", "CustomerName"); | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="sourceColumns">An array of string to be assigned as the source columns of the stored procedure parameters</param> | |
/// <returns>A valid MySqlCommand object</returns> | |
public static MySqlCommand CreateCommand(MySqlConnection connection, string spName, params string[] sourceColumns) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// Create a MySqlCommand | |
MySqlCommand cmd = new MySqlCommand(spName, connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = Timeout }; | |
// If we receive parameter values, we need to figure out where they go | |
if ((sourceColumns != null) && (sourceColumns.Length > 0)) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Assign the provided source columns to these parameters based on parameter order | |
for (int index = 0; index < sourceColumns.Length; index++) | |
commandParameters[index].SourceColumn = sourceColumns[index]; | |
// Attach the discovered parameters to the MySqlCommand object | |
AttachParameters(cmd, commandParameters); | |
} | |
return cmd; | |
} | |
#endregion | |
#region ExecuteNonQueryTypedParams | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the database specified in | |
/// the connection string using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on row values. | |
/// </summary> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQueryTypedParams(String connectionString, String spName, DataRow dataRow) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the specified MySqlConnection | |
/// using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on row values. | |
/// </summary> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQueryTypedParams(MySqlConnection connection, String spName, DataRow dataRow) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the specified | |
/// MySqlTransaction using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on row values. | |
/// </summary> | |
/// <param name="transaction">A valid MySqlTransaction object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>An int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQueryTypedParams(MySqlTransaction transaction, String spName, DataRow dataRow) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// Sf the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion | |
#region ExecuteDatasetTypedParams | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on row values. | |
/// </summary> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDatasetTypedParams(string connectionString, String spName, DataRow dataRow) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
//If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteDataSet(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteDataSet(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the dataRow column values as the store procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on row values. | |
/// </summary> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDatasetTypedParams(MySqlConnection connection, String spName, DataRow dataRow) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteDataSet(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteDataSet(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on row values. | |
/// </summary> | |
/// <param name="transaction">A valid MySqlTransaction object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>A dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDatasetTypedParams(MySqlTransaction transaction, String spName, DataRow dataRow) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteDataSet(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteDataSet(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion | |
#region ExecuteReaderTypedParams | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReaderTypedParams(String connectionString, String spName, DataRow dataRow) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReaderTypedParams(MySqlConnection connection, String spName, DataRow dataRow) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteReader(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <param name="transaction">A valid MySqlTransaction object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>A MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReaderTypedParams(MySqlTransaction transaction, String spName, DataRow dataRow) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteReader(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion | |
#region ExecuteScalarTypedParams | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the database specified in | |
/// the connection string using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalarTypedParams(String connectionString, String spName, DataRow dataRow) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlConnection | |
/// using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalarTypedParams(MySqlConnection connection, String spName, DataRow dataRow) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteScalar(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlTransaction | |
/// using the dataRow column values as the stored procedure's parameters values. | |
/// This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <param name="transaction">A valid MySqlTransaction object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="dataRow">The dataRow used to hold the stored procedure's parameter values.</param> | |
/// <returns>An object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalarTypedParams(MySqlTransaction transaction, String spName, DataRow dataRow) | |
{ | |
if (transaction == null) throw new ArgumentNullException("transaction"); | |
if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
// If the row has values, the store procedure parameters must be initialized | |
if (dataRow != null && dataRow.ItemArray.Length > 0) | |
{ | |
// Pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); | |
// Set the parameters values | |
AssignParameterValues(commandParameters, dataRow); | |
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
else | |
{ | |
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion | |
} | |
public static class SqlHelperParameterCache | |
{ | |
internal static int Timeout = 180; | |
#region private methods, variables, and constructors | |
//Since this class provides only static methods, make the default constructor private to prevent | |
//instances from being created with "new SqlHelperParameterCache()" | |
private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); | |
/// <summary> | |
/// Resolve at run time the appropriate set of MySqlParameters for a stored procedure | |
/// </summary> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="includeReturnValueParameter">Whether or not to include their return value parameter</param> | |
/// <returns>The parameter array discovered.</returns> | |
private static MySqlParameter[] DiscoverSpParameterSet(MySqlConnection connection, string spName, bool includeReturnValueParameter) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
MySqlCommand cmd = new MySqlCommand(spName, connection) { CommandType = CommandType.StoredProcedure, CommandTimeout = Timeout }; | |
connection.Open(); | |
MySqlCommandBuilder.DeriveParameters(cmd); | |
connection.Close(); | |
if (!includeReturnValueParameter) | |
{ | |
cmd.Parameters.RemoveAt(0); | |
} | |
MySqlParameter[] discoveredParameters = new MySqlParameter[cmd.Parameters.Count]; | |
cmd.Parameters.CopyTo(discoveredParameters, 0); | |
// Init the parameters with a DBNull value | |
foreach (MySqlParameter discoveredParameter in discoveredParameters) | |
{ | |
discoveredParameter.Value = DBNull.Value; | |
} | |
return discoveredParameters; | |
} | |
/// <summary> | |
/// Deep copy of cached MySqlParameter array | |
/// </summary> | |
/// <param name="originalParameters"></param> | |
/// <returns></returns> | |
private static MySqlParameter[] CloneParameters(MySqlParameter[] originalParameters) | |
{ | |
MySqlParameter[] clonedParameters = new MySqlParameter[originalParameters.Length]; | |
for (int i = 0, j = originalParameters.Length; i < j; i++) | |
{ | |
clonedParameters[i] = (MySqlParameter)((ICloneable)originalParameters[i]).Clone(); | |
} | |
return clonedParameters; | |
} | |
#endregion private methods, variables, and constructors | |
#region caching functions | |
/// <summary> | |
/// Add parameter array to the cache | |
/// </summary> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <param name="commandParameters">An array of SqlParamters to be cached</param> | |
public static void CacheParameterSet(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException("commandText"); | |
string hashKey = connectionString + ":" + commandText; | |
paramCache[hashKey] = commandParameters; | |
} | |
/// <summary> | |
/// Retrieve a parameter array from the cache | |
/// </summary> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="commandText">The stored procedure name or T-SQL command</param> | |
/// <returns>An array of SqlParamters</returns> | |
public static MySqlParameter[] GetCachedParameterSet(string connectionString, string commandText) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(commandText)) throw new ArgumentNullException("commandText"); | |
string hashKey = connectionString + ":" + commandText; | |
MySqlParameter[] cachedParameters = paramCache[hashKey] as MySqlParameter[]; | |
return cachedParameters == null ? null : CloneParameters(cachedParameters); | |
} | |
#endregion caching functions | |
#region Parameter Discovery Functions | |
/// <summary> | |
/// Retrieves the set of MySqlParameters appropriate for the stored procedure | |
/// </summary> | |
/// <remarks> | |
/// This method will query the database for this information, and then store it in a cache for future requests. | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <returns>An array of MySqlParameters</returns> | |
public static MySqlParameter[] GetSpParameterSet(string connectionString, string spName) | |
{ | |
return GetSpParameterSet(connectionString, spName, false); | |
} | |
/// <summary> | |
/// Retrieves the set of MySqlParameters appropriate for the stored procedure | |
/// </summary> | |
/// <remarks> | |
/// This method will query the database for this information, and then store it in a cache for future requests. | |
/// </remarks> | |
/// <param name="connectionString">A valid connection string for a MySqlConnection</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="includeReturnValueParameter">A bool value indicating whether the return value parameter should be included in the results</param> | |
/// <returns>An array of MySqlParameters</returns> | |
public static MySqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) | |
{ | |
if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException("connectionString"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
using (MySqlConnection connection = new MySqlConnection(connectionString)) | |
{ | |
return GetSpParameterSetInternal(connection, spName, includeReturnValueParameter); | |
} | |
} | |
/// <summary> | |
/// Retrieves the set of MySqlParameters appropriate for the stored procedure | |
/// </summary> | |
/// <remarks> | |
/// This method will query the database for this information, and then store it in a cache for future requests. | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <returns>An array of MySqlParameters</returns> | |
internal static MySqlParameter[] GetSpParameterSet(MySqlConnection connection, string spName) | |
{ | |
return GetSpParameterSet(connection, spName, false); | |
} | |
/// <summary> | |
/// Retrieves the set of MySqlParameters appropriate for the stored procedure | |
/// </summary> | |
/// <remarks> | |
/// This method will query the database for this information, and then store it in a cache for future requests. | |
/// </remarks> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="includeReturnValueParameter">A bool value indicating whether the return value parameter should be included in the results</param> | |
/// <returns>An array of MySqlParameters</returns> | |
internal static MySqlParameter[] GetSpParameterSet(MySqlConnection connection, string spName, bool includeReturnValueParameter) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
using (MySqlConnection clonedConnection = (MySqlConnection)((ICloneable)connection).Clone()) | |
{ | |
return GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter); | |
} | |
} | |
/// <summary> | |
/// Retrieves the set of MySqlParameters appropriate for the stored procedure | |
/// </summary> | |
/// <param name="connection">A valid MySqlConnection object</param> | |
/// <param name="spName">The name of the stored procedure</param> | |
/// <param name="includeReturnValueParameter">A bool value indicating whether the return value parameter should be included in the results</param> | |
/// <returns>An array of MySqlParameters</returns> | |
private static MySqlParameter[] GetSpParameterSetInternal(MySqlConnection connection, string spName, bool includeReturnValueParameter) | |
{ | |
if (connection == null) throw new ArgumentNullException("connection"); | |
if (string.IsNullOrEmpty(spName)) throw new ArgumentNullException("spName"); | |
string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); | |
var cachedParameters = paramCache[hashKey] as MySqlParameter[]; | |
if (cachedParameters == null) | |
{ | |
MySqlParameter[] spParameters = DiscoverSpParameterSet(connection, spName, includeReturnValueParameter); | |
paramCache[hashKey] = spParameters; | |
cachedParameters = spParameters; | |
} | |
return CloneParameters(cachedParameters); | |
} | |
#endregion Parameter Discovery Functions | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Copyright � 2004, 2014, Oracle and/or its affiliates. All rights reserved. | |
// | |
// MySQL Connector/NET is licensed under the terms of the GPLv2 | |
// <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>, like most | |
// MySQL Connectors. There are special exceptions to the terms and | |
// conditions of the GPLv2 as it is applied to this software, see the | |
// FLOSS License Exception | |
// <http://www.mysql.com/about/legal/licensing/foss-exception.html>. | |
// | |
// This program is free software; you can redistribute it and/or modify | |
// it under the terms of the GNU General Public License as published | |
// by the Free Software Foundation; version 2 of the License. | |
// | |
// This program is distributed in the hope that it will be useful, but | |
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
// for more details. | |
// | |
// You should have received a copy of the GNU General Public License along | |
// with this program; if not, write to the Free Software Foundation, Inc., | |
// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
using System.Data; | |
using MySql.Data.MySqlClient; | |
using System.Text; | |
#if NET_40_OR_GREATER | |
using System.Threading.Tasks; | |
using System.Threading; | |
using System; | |
#endif | |
namespace MySql.Data.MySqlClient | |
{ | |
/// <summary> | |
/// Helper class that makes it easier to work with the provider. | |
/// </summary> | |
public sealed class MySqlHelper | |
{ | |
enum CharClass : byte | |
{ | |
None, | |
Quote, | |
Backslash | |
} | |
private static string stringOfBackslashChars = "\u005c\u00a5\u0160\u20a9\u2216\ufe68\uff3c"; | |
private static string stringOfQuoteChars = | |
"\u0022\u0027\u0060\u00b4\u02b9\u02ba\u02bb\u02bc\u02c8\u02ca\u02cb\u02d9\u0300\u0301\u2018\u2019\u201a\u2032\u2035\u275b\u275c\uff07"; | |
private static CharClass[] charClassArray = makeCharClassArray(); | |
// this class provides only static methods | |
private MySqlHelper() | |
{ | |
} | |
#region ExecuteNonQuery | |
/// <summary> | |
/// Executes a single command against a MySQL database. The <see cref="MySqlConnection"/> is assumed to be | |
/// open when the method is called and remains open after the method completes. | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">SQL command to be executed</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command.</param> | |
/// <returns></returns> | |
public static int ExecuteNonQuery(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.Connection = connection; | |
cmd.CommandText = commandText; | |
cmd.CommandType = CommandType.Text; | |
if (commandParameters != null) | |
foreach (MySqlParameter p in commandParameters) | |
cmd.Parameters.Add(p); | |
int result = cmd.ExecuteNonQuery(); | |
cmd.Parameters.Clear(); | |
return result; | |
} | |
/// <summary> | |
/// Executes a single command against a MySQL database. A new <see cref="MySqlConnection"/> is created | |
/// using the <see cref="MySqlConnection.ConnectionString"/> given. | |
/// </summary> | |
/// <param name="connectionString"><see cref="MySqlConnection.ConnectionString"/> to use</param> | |
/// <param name="commandText">SQL command to be executed</param> | |
/// <param name="parms">Array of <see cref="MySqlParameter"/> objects to use with the command.</param> | |
/// <returns></returns> | |
public static int ExecuteNonQuery(string connectionString, string commandText, params MySqlParameter[] parms) | |
{ | |
//create & open a SqlConnection, and dispose of it after we are done. | |
using (MySqlConnection cn = new MySqlConnection(connectionString)) | |
{ | |
cn.Open(); | |
//call the overload that takes a connection in place of the connection string | |
return ExecuteNonQuery(cn, commandText, parms); | |
} | |
} | |
#endregion | |
#if !WINDOWS_UWP | |
#region ExecuteDataSet | |
/// <summary> | |
/// Executes a single SQL command and returns the first row of the resultset. A new MySqlConnection object | |
/// is created, opened, and closed during this method. | |
/// </summary> | |
/// <param name="connectionString">Settings to be used for the connection</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <param name="parms">Parameters to use for the command</param> | |
/// <returns>DataRow containing the first row of the resultset</returns> | |
public static DataRow ExecuteDataRow(string connectionString, string commandText, params MySqlParameter[] parms) | |
{ | |
DataSet ds = ExecuteDataset(connectionString, commandText, parms); | |
if (ds == null) return null; | |
if (ds.Tables.Count == 0) return null; | |
if (ds.Tables[0].Rows.Count == 0) return null; | |
return ds.Tables[0].Rows[0]; | |
} | |
/// <summary> | |
/// Executes a single SQL command and returns the resultset in a <see cref="DataSet"/>. | |
/// A new MySqlConnection object is created, opened, and closed during this method. | |
/// </summary> | |
/// <param name="connectionString">Settings to be used for the connection</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static DataSet ExecuteDataset(string connectionString, string commandText) | |
{ | |
//pass through the call providing null for the set of SqlParameters | |
return ExecuteDataset(connectionString, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Executes a single SQL command and returns the resultset in a <see cref="DataSet"/>. | |
/// A new MySqlConnection object is created, opened, and closed during this method. | |
/// </summary> | |
/// <param name="connectionString">Settings to be used for the connection</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static DataSet ExecuteDataset(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create & open a SqlConnection, and dispose of it after we are done. | |
using (MySqlConnection cn = new MySqlConnection(connectionString)) | |
{ | |
cn.Open(); | |
//call the overload that takes a connection in place of the connection string | |
return ExecuteDataset(cn, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Executes a single SQL command and returns the resultset in a <see cref="DataSet"/>. | |
/// The state of the <see cref="MySqlConnection"/> object remains unchanged after execution | |
/// of this method. | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static DataSet ExecuteDataset(MySqlConnection connection, string commandText) | |
{ | |
//pass through the call providing null for the set of SqlParameters | |
return ExecuteDataset(connection, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Executes a single SQL command and returns the resultset in a <see cref="DataSet"/>. | |
/// The state of the <see cref="MySqlConnection"/> object remains unchanged after execution | |
/// of this method. | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static DataSet ExecuteDataset(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.Connection = connection; | |
cmd.CommandText = commandText; | |
cmd.CommandType = CommandType.Text; | |
if (commandParameters != null) | |
foreach (MySqlParameter p in commandParameters) | |
cmd.Parameters.Add(p); | |
//create the DataAdapter & DataSet | |
MySqlDataAdapter da = new MySqlDataAdapter(cmd); | |
DataSet ds = new DataSet(); | |
//fill the DataSet using default values for DataTable names, etc. | |
da.Fill(ds); | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
//return the dataset | |
return ds; | |
} | |
/// <summary> | |
/// Updates the given table with data from the given <see cref="DataSet"/> | |
/// </summary> | |
/// <param name="connectionString">Settings to use for the update</param> | |
/// <param name="commandText">Command text to use for the update</param> | |
/// <param name="ds"><see cref="DataSet"/> containing the new data to use in the update</param> | |
/// <param name="tablename">Tablename in the dataset to update</param> | |
public static void UpdateDataSet(string connectionString, string commandText, DataSet ds, string tablename) | |
{ | |
MySqlConnection cn = new MySqlConnection(connectionString); | |
cn.Open(); | |
MySqlDataAdapter da = new MySqlDataAdapter(commandText, cn); | |
MySqlCommandBuilder cb = new MySqlCommandBuilder(da); | |
cb.ToString(); | |
da.Update(ds, tablename); | |
cn.Close(); | |
} | |
#endregion | |
#endif | |
#region ExecuteDataReader | |
/// <summary> | |
/// Executes a single command against a MySQL database, possibly inside an existing transaction. | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use for the command</param> | |
/// <param name="transaction"><see cref="MySqlTransaction"/> object to use for the command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command</param> | |
/// <param name="ExternalConn">True if the connection should be preserved, false if not</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
private static MySqlDataReader ExecuteReader(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool ExternalConn) | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.Connection = connection; | |
cmd.Transaction = transaction; | |
cmd.CommandText = commandText; | |
cmd.CommandType = CommandType.Text; | |
if (commandParameters != null) | |
foreach (MySqlParameter p in commandParameters) | |
cmd.Parameters.Add(p); | |
//create a reader | |
MySqlDataReader dr; | |
// call ExecuteReader with the appropriate CommandBehavior | |
if (ExternalConn) | |
{ | |
dr = cmd.ExecuteReader(); | |
} | |
else | |
{ | |
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); | |
} | |
// detach the SqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
return dr; | |
} | |
/// <summary> | |
/// Executes a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connectionString">Settings to use for this command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, string commandText) | |
{ | |
//pass through the call providing null for the set of SqlParameters | |
return ExecuteReader(connectionString, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Executes a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use for the command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, string commandText) | |
{ | |
//pass through the call providing null for the set of SqlParameters | |
return ExecuteReader(connection, null, commandText, (MySqlParameter[])null, true); | |
} | |
/// <summary> | |
/// Executes a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connectionString">Settings to use for this command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create & open a SqlConnection | |
MySqlConnection cn = new MySqlConnection(connectionString); | |
cn.Open(); | |
//call the private overload that takes an internally owned connection in place of the connection string | |
return ExecuteReader(cn, null, commandText, commandParameters, false); | |
} | |
/// <summary> | |
/// Executes a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connection">Connection to use for the command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//call the private overload that takes an internally owned connection in place of the connection string | |
return ExecuteReader(connection, null, commandText, commandParameters, true); | |
} | |
#endregion | |
#region ExecuteScalar | |
/// <summary> | |
/// Execute a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connectionString">Settings to use for the update</param> | |
/// <param name="commandText">Command text to use for the update</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static object ExecuteScalar(string connectionString, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(connectionString, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connectionString">Settings to use for the command</param> | |
/// <param name="commandText">Command text to use for the command</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static object ExecuteScalar(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create & open a SqlConnection, and dispose of it after we are done. | |
using (MySqlConnection cn = new MySqlConnection(connectionString)) | |
{ | |
cn.Open(); | |
//call the overload that takes a connection in place of the connection string | |
return ExecuteScalar(cn, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command text to use for the command</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static object ExecuteScalar(MySqlConnection connection, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(connection, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a single command against a MySQL database. | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command text to use for the command</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static object ExecuteScalar(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.Connection = connection; | |
cmd.CommandText = commandText; | |
cmd.CommandType = CommandType.Text; | |
if (commandParameters != null) | |
foreach (MySqlParameter p in commandParameters) | |
cmd.Parameters.Add(p); | |
//execute the command & return the results | |
object retval = cmd.ExecuteScalar(); | |
// detach the SqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
return retval; | |
} | |
#endregion | |
#region Utility methods | |
private static CharClass[] makeCharClassArray() | |
{ | |
CharClass[] a = new CharClass[65536]; | |
foreach (char c in stringOfBackslashChars) | |
{ | |
a[c] = CharClass.Backslash; | |
} | |
foreach (char c in stringOfQuoteChars) | |
{ | |
a[c] = CharClass.Quote; | |
} | |
return a; | |
} | |
private static bool needsQuoting(string s) | |
{ | |
foreach (char c in s) | |
{ | |
if (charClassArray[c] != CharClass.None) | |
{ | |
return true; | |
} | |
} | |
return false; | |
} | |
/// <summary> | |
/// Escapes the string. | |
/// </summary> | |
/// <param name="value">The string to escape</param> | |
/// <returns>The string with all quotes escaped.</returns> | |
public static string EscapeString(string value) | |
{ | |
if (!needsQuoting(value)) | |
return value; | |
StringBuilder sb = new StringBuilder(); | |
foreach (char c in value) | |
{ | |
CharClass charClass = charClassArray[c]; | |
if (charClass != CharClass.None) | |
{ | |
sb.Append("\\"); | |
} | |
sb.Append(c); | |
} | |
return sb.ToString(); | |
} | |
public static string DoubleQuoteString(string value) | |
{ | |
if (!needsQuoting(value)) | |
return value; | |
StringBuilder sb = new StringBuilder(); | |
foreach (char c in value) | |
{ | |
CharClass charClass = charClassArray[c]; | |
if (charClass == CharClass.Quote) | |
sb.Append(c); | |
else if (charClass == CharClass.Backslash) | |
sb.Append("\\"); | |
sb.Append(c); | |
} | |
return sb.ToString(); | |
} | |
#endregion | |
#if NET_40_OR_GREATER | |
#region Async | |
#region DataRow | |
/// <summary> | |
/// Async version of ExecuteDataRow | |
/// </summary> | |
/// <param name="connectionString">Settings to be used for the connection</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <param name="parms">Parameters to use for the command</param> | |
/// <returns>DataRow containing the first row of the resultset</returns> | |
public static Task<DataRow> ExecuteDataRowAsync(string connectionString, string commandText, params MySqlParameter[] parms) | |
{ | |
return ExecuteDataRowAsync(connectionString, commandText, CancellationToken.None, parms); | |
} | |
public static Task<DataRow> ExecuteDataRowAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] parms) | |
{ | |
var result = new TaskCompletionSource<DataRow>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var row = ExecuteDataRow(connectionString, commandText, parms); | |
result.SetResult(row); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
#endregion | |
#region NonQuery | |
/// <summary> | |
/// Async version of ExecuteNonQuery | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">SQL command to be executed</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command.</param> | |
/// <returns>Rows affected</returns> | |
public static Task<int> ExecuteNonQueryAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteNonQueryAsync(connection, commandText, CancellationToken.None, commandParameters); | |
} | |
public static Task<int> ExecuteNonQueryAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
var result = new TaskCompletionSource<int>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var queryResult = ExecuteNonQuery(connection, commandText, commandParameters); | |
result.SetResult(queryResult); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
/// <summary> | |
/// Async version of ExecuteNonQuery | |
/// </summary> | |
/// <param name="connectionString"><see cref="MySqlConnection.ConnectionString"/> to use</param> | |
/// <param name="commandText">SQL command to be executed</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command.</param> | |
/// <returns>Rows affected</returns> | |
public static Task<int> ExecuteNonQueryAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteNonQueryAsync(connectionString, commandText, CancellationToken.None, commandParameters); | |
} | |
public static Task<int> ExecuteNonQueryAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
var result = new TaskCompletionSource<int>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var queryResult = ExecuteNonQuery(connectionString, commandText, commandParameters); | |
result.SetResult(queryResult); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
#endregion | |
#region DataSet | |
/// <summary> | |
/// Async version of ExecuteDataset | |
/// </summary> | |
/// <param name="connectionString">Settings to be used for the connection</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static Task<DataSet> ExecuteDatasetAsync(string connectionString, string commandText) | |
{ | |
return ExecuteDatasetAsync(connectionString, commandText, CancellationToken.None, (MySqlParameter[])null); | |
} | |
public static Task<DataSet> ExecuteDatasetAsync(string connectionString, string commandText, CancellationToken cancellationToken) | |
{ | |
return ExecuteDatasetAsync(connectionString, commandText, cancellationToken, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Async version of ExecuteDataset | |
/// </summary> | |
/// <param name="connectionString">Settings to be used for the connection</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static Task<DataSet> ExecuteDatasetAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteDatasetAsync(connectionString, commandText, CancellationToken.None, commandParameters); | |
} | |
public static Task<DataSet> ExecuteDatasetAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
var result = new TaskCompletionSource<DataSet>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var dataset = ExecuteDataset(connectionString, commandText, commandParameters); | |
result.SetResult(dataset); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
/// <summary> | |
/// Async version of ExecuteDataset | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static Task<DataSet> ExecuteDatasetAsync(MySqlConnection connection, string commandText) | |
{ | |
return ExecuteDatasetAsync(connection, commandText, CancellationToken.None, (MySqlParameter[])null); | |
} | |
public static Task<DataSet> ExecuteDatasetAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) | |
{ | |
return ExecuteDatasetAsync(connection, commandText, cancellationToken, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Async version of ExecuteDataset | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command to execute</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns><see cref="DataSet"/> containing the resultset</returns> | |
public static Task<DataSet> ExecuteDatasetAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteDatasetAsync(connection, commandText, CancellationToken.None, commandParameters); | |
} | |
public static Task<DataSet> ExecuteDatasetAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
var result = new TaskCompletionSource<DataSet>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var dataset = ExecuteDataset(connection, commandText, commandParameters); | |
result.SetResult(dataset); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
/// <summary> | |
/// Async version of UpdateDataset | |
/// </summary> | |
/// <param name="connectionString">Settings to use for the update</param> | |
/// <param name="commandText">Command text to use for the update</param> | |
/// <param name="ds"><see cref="DataSet"/> containing the new data to use in the update</param> | |
/// <param name="tablename">Tablename in the dataset to update</param> | |
public static Task UpdateDataSetAsync(string connectionString, string commandText, DataSet ds, string tablename) | |
{ | |
return UpdateDataSetAsync(connectionString, commandText, ds, tablename, CancellationToken.None); | |
} | |
public static Task UpdateDataSetAsync(string connectionString, string commandText, DataSet ds, string tablename, CancellationToken cancellationToken) | |
{ | |
var result = new TaskCompletionSource<bool>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
UpdateDataSet(connectionString, commandText, ds, tablename); | |
result.SetResult(true); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
#endregion | |
#region DataReader | |
/// <summary> | |
/// Async version of ExecuteReader | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use for the command</param> | |
/// <param name="transaction"><see cref="MySqlTransaction"/> object to use for the command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command</param> | |
/// <param name="ExternalConn">True if the connection should be preserved, false if not</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
private static Task<MySqlDataReader> ExecuteReaderAsync(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool ExternalConn) | |
{ | |
return ExecuteReaderAsync(connection, transaction, commandText, commandParameters, ExternalConn, CancellationToken.None); | |
} | |
private static Task<MySqlDataReader> ExecuteReaderAsync(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool ExternalConn, CancellationToken cancellationToken) | |
{ | |
var result = new TaskCompletionSource<MySqlDataReader>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var reader = ExecuteReader(connection, transaction, commandText, commandParameters, ExternalConn); | |
result.SetResult(reader); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
/// <summary> | |
/// Async version of ExecuteReader | |
/// </summary> | |
/// <param name="connectionString">Settings to use for this command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static Task<MySqlDataReader> ExecuteReaderAsync(string connectionString, string commandText) | |
{ | |
return ExecuteReaderAsync(connectionString, commandText, CancellationToken.None, (MySqlParameter[])null); | |
} | |
public static Task<MySqlDataReader> ExecuteReaderAsync(string connectionString, string commandText, CancellationToken cancellationToken) | |
{ | |
return ExecuteReaderAsync(connectionString, commandText, cancellationToken, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Async version of ExecuteReader | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use for the command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static Task<MySqlDataReader> ExecuteReaderAsync(MySqlConnection connection, string commandText) | |
{ | |
return ExecuteReaderAsync(connection, null, commandText, (MySqlParameter[])null, true, CancellationToken.None); | |
} | |
public static Task<MySqlDataReader> ExecuteReaderAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) | |
{ | |
return ExecuteReaderAsync(connection, null, commandText, (MySqlParameter[])null, true, cancellationToken); | |
} | |
/// <summary> | |
/// Async version of ExecuteReader | |
/// </summary> | |
/// <param name="connectionString">Settings to use for this command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static Task<MySqlDataReader> ExecuteReaderAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteReaderAsync(connectionString, commandText, CancellationToken.None, commandParameters); | |
} | |
public static Task<MySqlDataReader> ExecuteReaderAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
var result = new TaskCompletionSource<MySqlDataReader>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var reader = ExecuteReader(connectionString, commandText, commandParameters); | |
result.SetResult(reader); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
/// <summary> | |
/// Async version of ExecuteReader | |
/// </summary> | |
/// <param name="connection">Connection to use for the command</param> | |
/// <param name="commandText">Command text to use</param> | |
/// <param name="commandParameters">Array of <see cref="MySqlParameter"/> objects to use with the command</param> | |
/// <returns><see cref="MySqlDataReader"/> object ready to read the results of the command</returns> | |
public static Task<MySqlDataReader> ExecuteReaderAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteReaderAsync(connection, null, commandText, commandParameters, true, CancellationToken.None); | |
} | |
public static Task<MySqlDataReader> ExecuteReaderAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteReaderAsync(connection, null, commandText, commandParameters, true, cancellationToken); | |
} | |
#endregion | |
#region Scalar | |
/// <summary> | |
/// Async version of ExecuteScalar | |
/// </summary> | |
/// <param name="connectionString">Settings to use for the update</param> | |
/// <param name="commandText">Command text to use for the update</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static Task<object> ExecuteScalarAsync(string connectionString, string commandText) | |
{ | |
return ExecuteScalarAsync(connectionString, commandText, CancellationToken.None, (MySqlParameter[])null); | |
} | |
public static Task<object> ExecuteScalarAsync(string connectionString, string commandText, CancellationToken cancellationToken) | |
{ | |
return ExecuteScalarAsync(connectionString, commandText, cancellationToken, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Async version of ExecuteScalar | |
/// </summary> | |
/// <param name="connectionString">Settings to use for the command</param> | |
/// <param name="commandText">Command text to use for the command</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static Task<object> ExecuteScalarAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteScalarAsync(connectionString, commandText, CancellationToken.None, commandParameters); | |
} | |
public static Task<object> ExecuteScalarAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
var result = new TaskCompletionSource<object>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var scalarResult = ExecuteScalar(connectionString, commandText, commandParameters); | |
result.SetResult(scalarResult); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
/// <summary> | |
/// Async version of ExecuteScalar | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command text to use for the command</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static Task<object> ExecuteScalarAsync(MySqlConnection connection, string commandText) | |
{ | |
return ExecuteScalarAsync(connection, commandText, CancellationToken.None, (MySqlParameter[])null); | |
} | |
public static Task<object> ExecuteScalarAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) | |
{ | |
return ExecuteScalarAsync(connection, commandText, cancellationToken, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Async version of ExecuteScalar | |
/// </summary> | |
/// <param name="connection"><see cref="MySqlConnection"/> object to use</param> | |
/// <param name="commandText">Command text to use for the command</param> | |
/// <param name="commandParameters">Parameters to use for the command</param> | |
/// <returns>The first column of the first row in the result set, or a null reference if the result set is empty.</returns> | |
public static Task<object> ExecuteScalarAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
return ExecuteScalarAsync(connection, commandText, CancellationToken.None, commandParameters); | |
} | |
public static Task<object> ExecuteScalarAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) | |
{ | |
var result = new TaskCompletionSource<object>(); | |
if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) | |
{ | |
try | |
{ | |
var scalarResult = ExecuteScalar(connection, commandText, commandParameters); | |
result.SetResult(scalarResult); | |
} | |
catch (Exception ex) | |
{ | |
result.SetException(ex); | |
} | |
} | |
else | |
{ | |
result.SetCanceled(); | |
} | |
return result.Task; | |
} | |
#endregion | |
#endregion | |
#endif | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//=============================================================================== | |
// Leo Muller 2015 | |
// | |
// MySqlHelper.cs based on MySqlHelper.cs | |
// Adapted for use with MySql. | |
// | |
// .net MySql connector: | |
// http://dev.MySql.com/downloads/connector/net/ | |
// | |
//============================================================================== | |
using System; | |
using System.Data; | |
using System.Xml; | |
using MySql.Data.MySqlClient; | |
using System.Collections; | |
namespace must | |
{ | |
/// <summary> | |
/// The MySqlHelper class is intended to encapsulate high performance, scalable best practices for | |
/// common uses of MySqlClient. | |
/// </summary> | |
public sealed class MySqlHelper | |
{ | |
#region private utility methods & constructors | |
//Since this class provides only static methods, make the default constructor private to prevent | |
//instances from being created with "new MySqlHelper()". | |
private MySqlHelper() { } | |
/// <summary> | |
/// This method is used to attach array of MySqlParameters to a MySqlCommand. | |
/// | |
/// This method will assign a value of DbNull to any parameter with a direction of | |
/// InputOutput and a value of null. | |
/// | |
/// This behavior will prevent default values from being used, but | |
/// this will be the less common case than an intended pure output parameter (derived as InputOutput) | |
/// where the user provided no input value. | |
/// </summary> | |
/// <param name="command">The command to which the parameters will be added</param> | |
/// <param name="commandParameters">an array of MySqlParameters tho be added to command</param> | |
private static void AttachParameters(MySqlCommand command, MySqlParameter[] commandParameters) | |
{ | |
foreach (MySqlParameter p in commandParameters) | |
{ | |
//check for derived output value with no value assigned | |
if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null)) | |
{ | |
p.Value = DBNull.Value; | |
} | |
command.Parameters.Add(p); | |
} | |
} | |
/// <summary> | |
/// This method assigns an array of values to an array of MySqlParameters. | |
/// </summary> | |
/// <param name="commandParameters">array of MySqlParameters to be assigned values</param> | |
/// <param name="parameterValues">array of objects holding the values to be assigned</param> | |
private static void AssignParameterValues(MySqlParameter[] commandParameters, object[] parameterValues) | |
{ | |
if ((commandParameters == null) || (parameterValues == null)) | |
{ | |
//do nothing if we get no data | |
return; | |
} | |
// we must have the same number of values as we pave parameters to put them in | |
if (commandParameters.Length != parameterValues.Length) | |
{ | |
throw new ArgumentException("Parameter count does not match Parameter Value count."); | |
} | |
//iterate through the MySqlParameters, assigning the values from the corresponding position in the | |
//value array | |
for (int i = 0, j = commandParameters.Length; i < j; i++) | |
{ | |
commandParameters[i].Value = parameterValues[i]; | |
} | |
} | |
/// <summary> | |
/// This method opens (if necessary) and assigns a connection, transaction, command type and parameters | |
/// to the provided command. | |
/// </summary> | |
/// <param name="command">the MySqlCommand to be prepared</param> | |
/// <param name="connection">a valid MySqlConnection, on which to execute this command</param> | |
/// <param name="transaction">a valid MySqlTransaction, or 'null'</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParameters to be associated with the command or 'null' if no parameters are required</param> | |
private static void PrepareCommand(MySqlCommand command, MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, MySqlParameter[] commandParameters) | |
{ | |
//if the provided connection is not open, we will open it | |
if (connection.State != ConnectionState.Open) | |
{ | |
connection.Open(); | |
} | |
//associate the connection with the command | |
command.Connection = connection; | |
//set the command text (stored procedure name or MySql statement) | |
command.CommandText = commandText; | |
//if we were provided a transaction, assign it. | |
if (transaction != null) | |
{ | |
command.Transaction = transaction; | |
} | |
//set the command type | |
command.CommandType = commandType; | |
//attach the command parameters if they are provided | |
if (commandParameters != null) | |
{ | |
AttachParameters(command, commandParameters); | |
} | |
return; | |
} | |
#endregion private utility methods & constructors | |
#region ExecuteNonQuery | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteNonQuery(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create & open a MySqlConnection, and dispose of it after we are done. | |
using (MySqlConnection cn = new MySqlConnection(connectionString)) | |
{ | |
cn.Open(); | |
//call the overload that takes a connection in place of the connection string | |
return ExecuteNonQuery(cn, commandType, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="spName">the name of the stored prcedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteNonQuery(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
try | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.CommandTimeout = connection.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
PrepareCommand(cmd, connection, (MySqlTransaction)null, commandType, commandText, commandParameters); | |
//finally, execute the command. | |
int retval = cmd.ExecuteNonQuery(); | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
return retval; | |
} | |
catch (Exception ex) | |
{ | |
throw new Exception(ex.Message + Environment.NewLine + "Query: " + commandText); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteNonQuery(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns no resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
try | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.CommandTimeout = transaction.Connection.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); | |
//finally, execute the command. | |
int retval = cmd.ExecuteNonQuery(); | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
return retval; | |
} | |
catch (Exception ex) | |
{ | |
throw new Exception(ex.Message + Environment.NewLine + "Query: " + commandText); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns no resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>an int representing the number of rows affected by the command</returns> | |
public static int ExecuteNonQuery(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteNonQuery | |
#region ExecuteDataTable | |
public static DataTable GetData(string connectionString, string StoredProcedure) | |
{ | |
DataSet ds = ExecuteDataset(connectionString, CommandType.StoredProcedure, StoredProcedure); | |
return ds.Tables[0]; | |
} | |
public static DataTable GetData(string connectionString, string StoredProcedure, params MySqlParameter[] commandParameters) | |
{ | |
DataSet ds = ExecuteDataset(connectionString, CommandType.StoredProcedure, StoredProcedure, commandParameters); | |
return ds.Tables[0]; | |
} | |
#endregion ExecuteDataTable | |
#region ExecuteDataSet | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataset(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create & open a MySqlConnection, and dispose of it after we are done. | |
using (MySqlConnection cn = new MySqlConnection(connectionString)) | |
{ | |
cn.Open(); | |
//call the overload that takes a connection in place of the connection string | |
return ExecuteDataset(cn, commandType, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataset(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
try | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.CommandTimeout = connection.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
PrepareCommand(cmd, connection, (MySqlTransaction)null, commandType, commandText, commandParameters); | |
//create the DataAdapter & DataSet | |
MySqlDataAdapter da = new MySqlDataAdapter(cmd); | |
DataSet ds = new DataSet(); | |
//fill the DataSet using default values for DataTable names, etc. | |
da.Fill(ds); | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
//return the dataset | |
return ds; | |
} | |
catch (Exception ex) | |
{ | |
throw new Exception(ex.Message + Environment.NewLine + "Query: " + commandText); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteDataset(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteDataset(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
try | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.CommandTimeout = transaction.Connection.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); | |
//create the DataAdapter & DataSet | |
MySqlDataAdapter da = new MySqlDataAdapter(cmd); | |
DataSet ds = new DataSet(); | |
//fill the DataSet using default values for DataTable names, etc. | |
da.Fill(ds); | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
//return the dataset | |
return ds; | |
} | |
catch (Exception ex) | |
{ | |
throw new Exception(ex.Message + Environment.NewLine + "Query: " + commandText); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>a dataset containing the resultset generated by the command</returns> | |
public static DataSet ExecuteDataset(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteDataSet | |
#region ExecuteReader | |
/// <summary> | |
/// this enum is used to indicate whether the connection was provided by the caller, or created by MySqlHelper, so that | |
/// we can set the appropriate CommandBehavior when calling ExecuteReader() | |
/// </summary> | |
private enum MySqlConnectionOwnership | |
{ | |
/// <summary>Connection is owned and managed by MySqlHelper</summary> | |
Internal, | |
/// <summary>Connection is owned and managed by the caller</summary> | |
External | |
} | |
/// <summary> | |
/// Create and prepare a MySqlCommand, and call ExecuteReader with the appropriate CommandBehavior. | |
/// </summary> | |
/// <remarks> | |
/// If we created and opened the connection, we want the connection to be closed when the DataReader is closed. | |
/// | |
/// If the caller provided the connection, we want to leave it to them to manage. | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection, on which to execute this command</param> | |
/// <param name="transaction">a valid MySqlTransaction, or 'null'</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParameters to be associated with the command or 'null' if no parameters are required</param> | |
/// <param name="connectionOwnership">indicates whether the connection parameter was provided by the caller, or created by MySqlHelper</param> | |
/// <returns>MySqlDataReader containing the results of the command</returns> | |
private static MySqlDataReader ExecuteReader(MySqlConnection connection, MySqlTransaction transaction, CommandType commandType, string commandText, MySqlParameter[] commandParameters, MySqlConnectionOwnership connectionOwnership) | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.CommandTimeout = connection.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters); | |
//create a reader | |
MySqlDataReader dr; | |
// call ExecuteReader with the appropriate CommandBehavior | |
if (connectionOwnership == MySqlConnectionOwnership.External) | |
{ | |
dr = cmd.ExecuteReader(); | |
} | |
else | |
{ | |
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); | |
} | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
return dr; | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteReader(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create & open a MySqlConnection | |
MySqlConnection cn = new MySqlConnection(connectionString); | |
cn.Open(); | |
try | |
{ | |
//call the private overload that takes an internally owned connection in place of the connection string | |
return ExecuteReader(cn, null, commandType, commandText, commandParameters, MySqlConnectionOwnership.Internal); | |
} | |
catch | |
{ | |
//if we fail to return the MySqlDatReader, we need to close the connection ourselves | |
cn.Close(); | |
throw; | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteReader(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//pass through the call to the private overload using a null transaction value and an externally owned connection | |
return ExecuteReader(connection, (MySqlTransaction)null, commandType, commandText, commandParameters, MySqlConnectionOwnership.External); | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); | |
AssignParameterValues(commandParameters, parameterValues); | |
return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteReader(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteReader(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//pass through to private overload, indicating that the connection is owned by the caller | |
return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, MySqlConnectionOwnership.External); | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// MySqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>a MySqlDataReader containing the resultset generated by the command</returns> | |
public static MySqlDataReader ExecuteReader(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); | |
AssignParameterValues(commandParameters, parameterValues); | |
return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteReader(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteReader | |
#region ExecuteScalar | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset and takes no parameters) against the database specified in | |
/// the connection string. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(connectionString, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset) against the database specified in the connection string | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
//create & open a MySqlConnection, and dispose of it after we are done. | |
using (MySqlConnection cn = new MySqlConnection(connectionString)) | |
{ | |
cn.Open(); | |
//call the overload that takes a connection in place of the connection string | |
return ExecuteScalar(cn, commandType, commandText, commandParameters); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the database specified in | |
/// the connection string using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided MySqlConnection. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlConnection connection, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(connection, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlConnection | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlConnection connection, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
try | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.CommandTimeout = connection.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
PrepareCommand(cmd, connection, (MySqlTransaction)null, commandType, commandText, commandParameters); | |
//execute the command & return the results | |
object retval = cmd.ExecuteScalar(); | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
return retval; | |
} | |
catch (Exception ex) | |
{ | |
throw new Exception(ex.Message + Environment.NewLine + "Query: " + commandText); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlConnection | |
/// using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); | |
/// </remarks> | |
/// <param name="connection">a valid MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlConnection connection, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(connection.ConnectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteScalar(connection, CommandType.StoredProcedure, spName); | |
} | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset and takes no parameters) against the provided MySqlTransaction. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlTransaction transaction, CommandType commandType, string commandText) | |
{ | |
//pass through the call providing null for the set of MySqlParameters | |
return ExecuteScalar(transaction, commandType, commandText, (MySqlParameter[])null); | |
} | |
/// <summary> | |
/// Execute a MySqlCommand (that returns a 1x1 resultset) against the specified MySqlTransaction | |
/// using the provided parameters. | |
/// </summary> | |
/// <remarks> | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new MySqlParameter("@prodid", 24)); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters used to execute the command</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlTransaction transaction, CommandType commandType, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
try | |
{ | |
//create a command and prepare it for execution | |
MySqlCommand cmd = new MySqlCommand(); | |
cmd.CommandTimeout = transaction.Connection.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters); | |
//execute the command & return the results | |
object retval = cmd.ExecuteScalar(); | |
// detach the MySqlParameters from the command object, so they can be used again. | |
cmd.Parameters.Clear(); | |
return retval; | |
} | |
catch (Exception ex) | |
{ | |
throw new Exception(ex.Message + Environment.NewLine + "Query: " + commandText); | |
} | |
} | |
/// <summary> | |
/// Execute a stored procedure via a MySqlCommand (that returns a 1x1 resultset) against the specified | |
/// MySqlTransaction using the provided parameter values. This method will query the database to discover the parameters for the | |
/// stored procedure (the first time each stored procedure is called), and assign the values based on parameter order. | |
/// </summary> | |
/// <remarks> | |
/// This method provides no access to output parameters or the stored procedure's return value parameter. | |
/// | |
/// e.g.: | |
/// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); | |
/// </remarks> | |
/// <param name="transaction">a valid MySqlTransaction</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="parameterValues">an array of objects to be assigned as the input values of the stored procedure</param> | |
/// <returns>an object containing the value in the 1x1 resultset generated by the command</returns> | |
public static object ExecuteScalar(MySqlTransaction transaction, string spName, params object[] parameterValues) | |
{ | |
//if we receive parameter values, we need to figure out where they go | |
if ((parameterValues != null) && (parameterValues.Length > 0)) | |
{ | |
//pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache) | |
MySqlParameter[] commandParameters = MySqlHelperParameterCache.GetSpParameterSet(transaction.Connection.ConnectionString, spName); | |
//assign the provided values to these parameters based on parameter order | |
AssignParameterValues(commandParameters, parameterValues); | |
//call the overload that takes an array of MySqlParameters | |
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); | |
} | |
//otherwise we can just call the SP without params | |
else | |
{ | |
return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); | |
} | |
} | |
#endregion ExecuteScalar | |
} | |
/// <summary> | |
/// MySqlHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the | |
/// ability to discover parameters for stored procedures at run-time. | |
/// </summary> | |
public sealed class MySqlHelperParameterCache | |
{ | |
#region private methods, variables, and constructors | |
//Since this class provides only static methods, make the default constructor private to prevent | |
//instances from being created with "new MySqlHelperParameterCache()". | |
private MySqlHelperParameterCache() { } | |
private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); | |
/// <summary> | |
/// resolve at run time the appropriate set of MySqlParameters for a stored procedure | |
/// </summary> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="includeReturnValueParameter">whether or not to include their return value parameter</param> | |
/// <returns></returns> | |
private static MySqlParameter[] DiscoverSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) | |
{ | |
using (MySqlConnection cn = new MySqlConnection(connectionString)) | |
using (MySqlCommand cmd = new MySqlCommand(spName, cn)) | |
{ | |
cn.Open(); | |
cmd.CommandTimeout = cn.ConnectionTimeout; //leo - so setting the connecting timeout is all that we need. | |
cmd.CommandType = CommandType.StoredProcedure; | |
MySqlCommandBuilder.DeriveParameters(cmd); | |
if (!includeReturnValueParameter) | |
{ | |
cmd.Parameters.RemoveAt(0); | |
} | |
MySqlParameter[] discoveredParameters = new MySqlParameter[cmd.Parameters.Count]; ; | |
cmd.Parameters.CopyTo(discoveredParameters, 0); | |
return discoveredParameters; | |
} | |
} | |
//deep copy of cached MySqlParameter array | |
private static MySqlParameter[] CloneParameters(MySqlParameter[] originalParameters) | |
{ | |
MySqlParameter[] clonedParameters = new MySqlParameter[originalParameters.Length]; | |
for (int i = 0, j = originalParameters.Length; i < j; i++) | |
{ | |
clonedParameters[i] = (MySqlParameter)((ICloneable)originalParameters[i]).Clone(); | |
} | |
return clonedParameters; | |
} | |
#endregion private methods, variables, and constructors | |
#region caching functions | |
/// <summary> | |
/// add parameter array to the cache | |
/// </summary> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <param name="commandParameters">an array of MySqlParamters to be cached</param> | |
public static void CacheParameterSet(string connectionString, string commandText, params MySqlParameter[] commandParameters) | |
{ | |
string hashKey = connectionString + ":" + commandText; | |
paramCache[hashKey] = commandParameters; | |
} | |
/// <summary> | |
/// retrieve a parameter array from the cache | |
/// </summary> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="commandText">the stored procedure name or T-MySql command</param> | |
/// <returns>an array of MySqlParamters</returns> | |
public static MySqlParameter[] GetCachedParameterSet(string connectionString, string commandText) | |
{ | |
string hashKey = connectionString + ":" + commandText; | |
MySqlParameter[] cachedParameters = (MySqlParameter[])paramCache[hashKey]; | |
if (cachedParameters == null) | |
{ | |
return null; | |
} | |
else | |
{ | |
return CloneParameters(cachedParameters); | |
} | |
} | |
#endregion caching functions | |
#region Parameter Discovery Functions | |
/// <summary> | |
/// Retrieves the set of MySqlParameters appropriate for the stored procedure | |
/// </summary> | |
/// <remarks> | |
/// This method will query the database for this information, and then store it in a cache for future requests. | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <returns>an array of MySqlParameters</returns> | |
public static MySqlParameter[] GetSpParameterSet(string connectionString, string spName) | |
{ | |
return GetSpParameterSet(connectionString, spName, false); | |
} | |
/// <summary> | |
/// Retrieves the set of MySqlParameters appropriate for the stored procedure | |
/// </summary> | |
/// <remarks> | |
/// This method will query the database for this information, and then store it in a cache for future requests. | |
/// </remarks> | |
/// <param name="connectionString">a valid connection string for a MySqlConnection</param> | |
/// <param name="spName">the name of the stored procedure</param> | |
/// <param name="includeReturnValueParameter">a bool value indicating whether the return value parameter should be included in the results</param> | |
/// <returns>an array of MySqlParameters</returns> | |
public static MySqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) | |
{ | |
string hashKey = connectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); | |
MySqlParameter[] cachedParameters; | |
cachedParameters = (MySqlParameter[])paramCache[hashKey]; | |
if (cachedParameters == null) | |
{ | |
cachedParameters = (MySqlParameter[])(paramCache[hashKey] = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)); | |
} | |
return CloneParameters(cachedParameters); | |
} | |
#endregion Parameter Discovery Functions | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment