/// <summary> /// Static method to build setting arguments for a database setting helper /// </summary> /// <param name="commandText">The query or stored proc</param> /// <param name="commandType">If it's a query or stored proc</param> /// <param name="parameters">Parameters, if any</param> /// <param name="builder">The delegate method to build the object of type T</param> /// <returns>A predefined set of args</returns> public static IList <IIpArgument> GetDatabaseArg <T>(string commandText, CommandType commandType, IList <IDbDataParameter> parameters, BuildDataObject <T> builder) { var retVal = new List <IIpArgument>(); var queryArg = new IpArgument { ArgumentKey = "commandText", ArgumentValue = commandText }; var paramArg = new IpArgument { ArgumentKey = "parameters", ArgumentValue = parameters }; var builderArg = new IpArgument { ArgumentKey = "builder", ArgumentValue = builder }; queryArg.KeyValidators = new List <IIpValidator> { new IpRequiredStringValidator(queryArg.ArgumentKey), new IpStringValueValidator(queryArg.ArgumentKey, "commandText") }; queryArg.ValueValidators = new List <IIpValidator> { new IpTypeValidator <string>(queryArg.ArgumentValue), new IpRequiredStringValidator(queryArg.ArgumentValue) }; var typeArg = new IpArgument { ArgumentKey = "commandType", ArgumentValue = commandType }; typeArg.KeyValidators = new List <IIpValidator> { new IpRequiredStringValidator(typeArg.ArgumentKey), new IpStringValueValidator(typeArg.ArgumentKey, "commandType") }; typeArg.ValueValidators = new List <IIpValidator> { new IpRequiredStringValidator(queryArg.ArgumentValue), new IpTypeValidator <CommandType>(queryArg.ArgumentValue) }; paramArg.KeyValidators = new List <IIpValidator> { new IpRequiredStringValidator(typeArg.ArgumentKey), new IpStringValueValidator(typeArg.ArgumentKey, "parameters") }; paramArg.ValueValidators = new List <IIpValidator> { new IpTypeValidator <IList <IDbDataParameter> >(paramArg.ArgumentValue) }; builderArg.KeyValidators = new List <IIpValidator> { new IpRequiredStringValidator(builderArg.ArgumentKey), new IpStringValueValidator(builderArg.ArgumentKey, "builder") }; builderArg.ValueValidators = new List <IIpValidator> { new IpTypeValidator <BuildDataObject <T> >(builderArg.ArgumentValue) }; retVal.Add(queryArg); retVal.Add(typeArg); retVal.Add(paramArg); retVal.Add(builderArg); return(retVal); }
/// <summary> /// Gets a single row from a query asynchronously /// </summary> /// <typeparam name="T"></typeparam> /// <param name="commandText">The query or stored procedure to run</param> /// <param name="commandType">The type of command, text, or stored proc to run</param> /// <param name="buildObject">The delegate method that runs to build an object of type T</param> /// <param name="parameters">Optional list of parameters to use in the query</param> /// <returns>The first row returned from the Query converted to an object of type T</returns> public virtual async Task <T> GetSingleRowAsync <T>(string commandText, CommandType commandType, BuildDataObject <T> buildObject, IList <IDbDataParameter> parameters = null) { parameters = parameters ?? new List <IDbDataParameter>(); try { using (var connection = ProviderFactory.CreateConnection()) { if (connection == null) { throw new IpDataAccessException("Could not connect to the database"); } connection.ConnectionString = ConnectionString; connection.Open(); using (var command = connection.CreateCommand()) { command.CommandTimeout = QueryTimeout == 0 ? 120 : QueryTimeout; command.CommandType = commandType; command.CommandText = commandText; command.Parameters.AddRange(parameters.ToArray()); using (var reader = await command.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { return(buildObject(reader)); } } } } return(default(T)); } catch (Exception ex) { throw new IpDataAccessException(string.Format("SQL {0}: {1} failed to execute, see inner exception for more details.", commandType == CommandType.StoredProcedure ? "Stored Proc" : "Text", commandText), ex); } }