MySql.Data.MySqlClient.StoredProcedure.Resolve C# (CSharp) Method

Resolve() public method

public Resolve ( bool preparing ) : void
preparing bool
return void
        public override void Resolve(bool preparing)
        {
            // check to see if we are already resolved
            if (resolvedCommandText != null) return;

            // first retrieve the procedure definition from our
            // procedure cache
            string spName = commandText;
            if (spName.IndexOf(".") == -1 && !String.IsNullOrEmpty(Connection.Database))
                spName = Connection.Database + "." + spName;
            spName = FixProcedureName(spName);

            DataTable procTable;
            GetParameters(spName,out procTable, out parametersTable);

            if (procTable.Rows.Count == 0)
                throw new InvalidOperationException(String.Format(Resources.RoutineNotFound, spName));

            bool realAsFloat = procTable.Rows[0]["SQL_MODE"].ToString().IndexOf("REAL_AS_FLOAT") != -1;
            StringBuilder sqlStr = new StringBuilder();
            StringBuilder outSql = new StringBuilder();
            string sqlDelimiter = "";
            string outDelimiter = "";

            string retParm = GetReturnParameter();
            foreach (DataRow param in parametersTable.Rows)
            {
                MySqlParameter p = GetAndFixParameter(param, realAsFloat, retParm);
                if (p == null) continue;

                if (param["ORDINAL_POSITION"].Equals(0))
                    continue;

                string baseName = p.ParameterName;
                string pName = baseName;
                if (baseName.StartsWith("@") || baseName.StartsWith("?"))
                    baseName = baseName.Substring(1);
                else
                    pName = "@" + pName;

                string inputVar = pName;
                if (p.Direction != ParameterDirection.Input &&
                    !(Connection.driver.SupportsOutputParameters || preparing))
                {
                    // set a user variable to our current value
                    string sql = String.Format("SET @{0}{1}={2}", ParameterPrefix, baseName, pName);
                    MySqlCommand cmd = new MySqlCommand(sql, Connection);
                   
                    cmd.Parameters.Add(p);
                    cmd.ExecuteNonQuery();

                    inputVar = String.Format("@{0}{1}", ParameterPrefix, baseName);

                    outSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", outDelimiter, inputVar);
                    outDelimiter = ", ";
                }
                sqlStr.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", sqlDelimiter, inputVar);
                sqlDelimiter = ", ";
            }

            string sqlCmd = sqlStr.ToString().TrimEnd(' ', ',');
            outSelect = outSql.ToString().TrimEnd(' ', ',');

            if (procTable.Rows[0]["ROUTINE_TYPE"].Equals("PROCEDURE"))
                sqlCmd = String.Format("call {0} ({1})", spName, sqlCmd);
            else
            {
                if (retParm == null)
                    retParm = ParameterPrefix + "dummy";
                else
                    outSelect = String.Format("@{0}{1}", ParameterPrefix, retParm);
                sqlCmd = String.Format("SET @{0}{1}={2}({3})", ParameterPrefix, retParm, spName, sqlCmd);
            }

            resolvedCommandText = sqlCmd;
        }