Example #1
0
        public static void DeriveParameters(MySqlCommand command)
        {
            if (command.CommandType != CommandType.StoredProcedure)
            {
                throw new InvalidOperationException(Resources.CanNotDeriveParametersForTextCommands);
            }
            string text = command.CommandText;

            if (text.IndexOf(".") == -1)
            {
                text = command.Connection.Database + "." + text;
            }
            try
            {
                ProcedureCacheEntry procedure = command.Connection.ProcedureCache.GetProcedure(command.Connection, text, null);
                command.Parameters.Clear();
                foreach (MySqlSchemaRow current in procedure.parameters.Rows)
                {
                    MySqlParameter mySqlParameter = new MySqlParameter();
                    mySqlParameter.ParameterName = string.Format("@{0}", current["PARAMETER_NAME"]);
                    if (current["ORDINAL_POSITION"].Equals(0) && mySqlParameter.ParameterName == "@")
                    {
                        mySqlParameter.ParameterName = "@RETURN_VALUE";
                    }
                    mySqlParameter.Direction = MySqlCommandBuilder.GetDirection(current);
                    bool unsigned    = StoredProcedure.GetFlags(current["DTD_IDENTIFIER"].ToString()).IndexOf("UNSIGNED") != -1;
                    bool realAsFloat = procedure.procedure.Rows[0]["SQL_MODE"].ToString().IndexOf("REAL_AS_FLOAT") != -1;
                    mySqlParameter.MySqlDbType = MetaData.NameToType(current["DATA_TYPE"].ToString(), unsigned, realAsFloat, command.Connection);
                    if (current["CHARACTER_MAXIMUM_LENGTH"] != null)
                    {
                        mySqlParameter.Size = (int)current["CHARACTER_MAXIMUM_LENGTH"];
                    }
                    if (current["NUMERIC_PRECISION"] != null)
                    {
                        mySqlParameter.Precision = Convert.ToByte(current["NUMERIC_PRECISION"]);
                    }
                    if (current["NUMERIC_SCALE"] != null)
                    {
                        mySqlParameter.Scale = Convert.ToByte(current["NUMERIC_SCALE"]);
                    }
                    if (mySqlParameter.MySqlDbType == MySqlDbType.Set || mySqlParameter.MySqlDbType == MySqlDbType.Enum)
                    {
                        mySqlParameter.PossibleValues = MySqlCommandBuilder.GetPossibleValues(current);
                    }
                    command.Parameters.Add(mySqlParameter);
                }
            }
            catch (InvalidOperationException ex)
            {
                throw new MySqlException(Resources.UnableToDeriveParameters, ex);
            }
        }