public virtual async Task <int> ExecuteNonQueryAsync(string commandText, MyCatParameterCollection parameterCollection, IOBehavior ioBehavior, CancellationToken cancellationToken) { using (var reader = (MyCatDataReader)await ExecuteReaderAsync(commandText, parameterCollection, CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false)) { do { while (await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false)) { } } while (await reader.NextResultAsync(ioBehavior, cancellationToken).ConfigureAwait(false)); return(reader.RecordsAffected); } }
public virtual async Task <object> ExecuteScalarAsync(string commandText, MyCatParameterCollection parameterCollection, IOBehavior ioBehavior, CancellationToken cancellationToken) { object result = null; using (var reader = (MyCatDataReader)await ExecuteReaderAsync(commandText, parameterCollection, CommandBehavior.SingleResult | CommandBehavior.SingleRow, ioBehavior, cancellationToken).ConfigureAwait(false)) { do { if (await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false)) { result = reader.GetValue(0); } } while (await reader.NextResultAsync(ioBehavior, cancellationToken).ConfigureAwait(false)); } return(result); }
internal MyCatParameterCollection AlignParamsWithDb(MyCatParameterCollection parameterCollection) { var alignedParams = new MyCatParameterCollection(); var returnParam = parameterCollection.FirstOrDefault(x => x.Direction == ParameterDirection.ReturnValue); foreach (var cachedParam in m_parameters) { MyCatParameter alignParam; if (cachedParam.Direction == ParameterDirection.ReturnValue) { if (returnParam == null) { throw new InvalidOperationException($"Attempt to call stored function {FullyQualified} without specifying a return parameter"); } alignParam = returnParam; } else { var index = parameterCollection.NormalizedIndexOf(cachedParam.Name); if (index == -1) { throw new ArgumentException($"Parameter '{cachedParam.Name}' not found in the collection."); } alignParam = parameterCollection[index]; } if (alignParam.Direction == default(ParameterDirection)) { alignParam.Direction = cachedParam.Direction; } if (alignParam.DbType == default(DbType)) { alignParam.DbType = cachedParam.DbType; } // cached parameters are oredered by ordinal position alignedParams.Add(alignParam); } return(alignedParams); }
public override async Task <DbDataReader> ExecuteReaderAsync(string commandText, MyCatParameterCollection parameterCollection, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) { var cachedProcedure = await m_command.Connection.GetCachedProcedure(ioBehavior, commandText, cancellationToken).ConfigureAwait(false); if (cachedProcedure != null) { parameterCollection = cachedProcedure.AlignParamsWithDb(parameterCollection); } MyCatParameter returnParam = null; m_outParams = new MyCatParameterCollection(); m_outParamNames = new List <string>(); var inParams = new MyCatParameterCollection(); var argParamNames = new List <string>(); var inOutSetParams = ""; for (var i = 0; i < parameterCollection.Count; i++) { var param = parameterCollection[i]; var inName = "@inParam" + i; var outName = "@outParam" + i; switch (param.Direction) { case 0: case ParameterDirection.Input: case ParameterDirection.InputOutput: var inParam = param.WithParameterName(inName); inParams.Add(inParam); if (param.Direction == ParameterDirection.InputOutput) { inOutSetParams += $"SET {outName}={inName}; "; goto case ParameterDirection.Output; } argParamNames.Add(inName); break; case ParameterDirection.Output: m_outParams.Add(param); m_outParamNames.Add(outName); argParamNames.Add(outName); break; case ParameterDirection.ReturnValue: returnParam = param; break; } } // if a return param is set, assume it is a funciton. otherwise, assume stored procedure commandText += "(" + string.Join(", ", argParamNames) + ")"; if (returnParam == null) { commandText = inOutSetParams + "CALL " + commandText; if (m_outParams.Count > 0) { m_setParamsFlags = true; m_cancellationToken = cancellationToken; } } else { commandText = "SELECT " + commandText; } var reader = (MyCatDataReader)await base.ExecuteReaderAsync(commandText, inParams, behavior, ioBehavior, cancellationToken).ConfigureAwait(false); if (returnParam != null && await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false)) { returnParam.Value = reader.GetValue(0); } return(reader); }
public virtual async Task <DbDataReader> ExecuteReaderAsync(string commandText, MyCatParameterCollection parameterCollection, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) { m_command.VerifyValid(); var connection = m_command.Connection; connection.HasActiveReader = true; MyCatDataReader reader = null; try { m_command.LastInsertedId = -1; var statementPreparerOptions = StatementPreparerOptions.None; if (connection.AllowUserVariables || m_command.CommandType == CommandType.StoredProcedure) { statementPreparerOptions |= StatementPreparerOptions.AllowUserVariables; } if (connection.OldGuids) { statementPreparerOptions |= StatementPreparerOptions.OldGuids; } var preparer = new MyCatStatementPreparer(commandText, parameterCollection, statementPreparerOptions); var payload = new PayloadData(preparer.ParseAndBindParameters()); await connection.Session.SendAsync(payload, ioBehavior, cancellationToken).ConfigureAwait(false); reader = await MyCatDataReader.CreateAsync(m_command, behavior, ioBehavior, cancellationToken).ConfigureAwait(false); return(reader); } finally { if (reader == null) { // received an error from MySQL and never created an active reader connection.HasActiveReader = false; } } }