Пример #1
0
        /// <summary>
        /// Executes command buffers until we hit the next resultset
        /// </summary>
        /// <returns>CommandResult containing the next resultset when hit
        /// or null if no more resultsets were found</returns>
        internal CommandResult GetNextResultSet(MySqlDataReader reader)
        {
            // if  we are supposed to return only a single resultset and our reader
            // is calling us back again, then return null
            if (reader != null &&
                (reader.Behavior & CommandBehavior.SingleResult) != 0 &&
                lastResult != null)
            {
                return(null);
            }

            // if the last result we returned has more results
            if (lastResult != null && lastResult.ReadNextResult(false))
            {
                return(lastResult);
            }
            lastResult = null;

            CommandResult result = null;

            // if we haven't prepared a statement and don't have any sql buffers
            // to execute, we are done
            if (preparedStatement == null)
            {
                if (sqlBuffers == null || sqlBuffers.Count == 0)
                {
                    return(null);
                }
            }
            else if (preparedStatement.ExecutionCount > 0)
            {
                return(null);
            }


            // if we have a prepared statement, we execute it instead
            if (preparedStatement != null)
            {
                result = preparedStatement.Execute(parameters);

                if (!result.IsResultSet)
                {
                    if (updateCount == -1)
                    {
                        updateCount = 0;
                    }
                    updateCount += (long)result.AffectedRows;
                }
            }
            else
            {
                while (sqlBuffers.Count > 0)
                {
                    MemoryStream sqlStream = (MemoryStream)sqlBuffers[0];

                    using (sqlStream)
                    {
                        result = connection.driver.SendQuery(sqlStream.GetBuffer(), (int)sqlStream.Length, false);
                        sqlBuffers.RemoveAt(0);
                    }

                    if (result.AffectedRows != -1)
                    {
                        if (updateCount == -1)
                        {
                            updateCount = 0;
                        }
                        updateCount += (long)result.AffectedRows;
                    }

                    // if this is a resultset, then we break out of our execution loop
                    if (result.IsResultSet)
                    {
                        break;
                    }
                }
            }

            if (result.IsResultSet)
            {
                lastResult = result;
                return(result);
            }
            return(null);
        }