none
MYsql + Procedure + Parametro Out RRS feed

  • Pergunta

  • Boa Tarde Colegas,

    Estou com um problema simples, mas que nao to conseguindo resolver.. é seguinte, tenho uma procedure de inserção e ela já me retorna o id (autoinc) que foi gravado no banco (mysql).

    Preciso conseguir recuperar esse valor sem dar o erro :


    Error: OUT or INOUT argument 33 for routine banco_db.inserir_processo is not a variable or NEW pseudo-variable in BEFORE trigger


    Estou usando a seguinte linha de código para executar a prcedure:


                DBAccess db = new DBAccess();
                db.AddParameter("p_pros_num_bo", pros_num_bo);
                db.AddParameter("p_pros_med_nome", pros_med_nome);
                db.AddParameter("p_pros_med_crm", pros_med_crm);
                db.ExecuteNonQuery("inserir_processo");


    No caso eu ja tenho uma variavel devidamente declarada como out  int32 procId;

    Agora preciso conseguir executar a procedure (que sem o parametro de saida funciona perfeitamente) e ainda pegar o valor de retorno para que eu possa continuar usando dentro do processo.

    Se alguem puder me ajudar desde já agradeço.

    Valeu ,,  inciante é uma porcaria né .. hehhe



    quarta-feira, 10 de abril de 2013 19:55

Respostas

Todas as Respostas

  • Opções

    1) Modificar sua variável de OUT ou IN para INOUT

    `inserir_processo`(INOUT procId INT,...


    2) Adicionar @ antes dos parameters

    DBAccess db = new DBAccess();
    db.AddParameter("@p_pros_num_bo", pros_num_bo);
    db.AddParameter("@p_pros_med_nome", pros_med_nome);
    db.AddParameter("@p_pros_med_crm", pros_med_crm);
    db.ExecuteNonQuery("inserir_processo");

    3) Sua classe DBAccess usa o MySqlCommand.CommandType = CommandType.StoredProcedure?

    quinta-feira, 11 de abril de 2013 04:51
  • Opa Cesar ,

    Obrigado pela tentativa, fiz todas as alterações que vc sugeriu e nada , abaixo to mandando todos os códigos, lembrando que se eu tirar o paramentro out da procedure e tbm do codigo o insert funciona perfeitamente, pois o que estou tentando fazer neste caso é obter o retorno do Id da PK, depois que o insert é executado. Fiz com o @ na frente e sem e os dois funcionam desde que nao tenha o parametro de saida.

            public static void InsertProcesso(
               string pros_num_bo,
               string pros_med_nome,
               string pros_med_crm,
               out Int32 procID)
            {

                DBAccess db = new DBAccess();
                db.AddParameter("@p_pros_num_bo", pros_num_bo);
                db.AddParameter("@p_pros_med_nome", pros_med_nome);
                db.AddParameter("@p_pros_med_crm", pros_med_crm);

                db.AddParameter("@p_ProcId", -1);


                db.ExecuteNonQuery("inserir_processo");



            }

    minha classe DBAcess

    using System;
    using System.Data;
    using MySql.Data.MySqlClient;
    using System.Configuration;

    namespace DevNews.DAL
    {

        public class DBAccess:IDisposable
        {

            private IDbCommand cmd=new MySqlCommand();
            private string strConnectionString="";
            private bool handleErrors=false;
            private string strLastError="";

            public DBAccess()
            {
                ConnectionStringSettings objConnectionStringSettings = ConfigurationManager.ConnectionStrings["NewsConnect"];
                strConnectionString = objConnectionStringSettings.ConnectionString;
                MySqlConnection cnn = new MySqlConnection();
                cnn.ConnectionString=strConnectionString;
                cmd.Connection=cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                
            }


            public IDataReader ExecuteReader()
            {
                IDataReader reader=null;
                try
                {
                    this.Open();
                    reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                }
                catch (Exception ex)
                {
                    if (handleErrors)
                        strLastError = ex.Message;
                    else
                        throw;
                }
              
                return reader;
            }

            public IDataReader ExecuteReader(string commandtext)
            {
                IDataReader reader=null;
                try
                {
                    cmd.CommandText=commandtext;
                    reader = ExecuteReader();
                }
                catch(Exception ex)
                {
                    if(handleErrors)
                        strLastError=ex.Message;
                    else
                        throw;
                }

                return reader;
            }

            public object ExecuteScalar()
            {
                object obj=null;
                try
                {
                    Open();
                    obj= cmd.ExecuteScalar();
                    Close();
                }
                catch(Exception ex)
                {
                    if(handleErrors)
                        strLastError=ex.Message;
                    else
                        throw;
                }
                

                return obj;
            }

            public object ExecuteScalar(string commandtext)
            {
                object obj=null;
                try
                {
                    cmd.CommandText=commandtext;
                    obj= ExecuteScalar();
                }
                catch(Exception ex)
                {
                    if(handleErrors)
                        strLastError=ex.Message;
                    else
                        throw;
                }
               

                return obj;
            }

            public int ExecuteNonQuery()
            {
                int i=-1;
                try
                {
                    Open();
                    i=cmd.ExecuteNonQuery();
                    Close();
                }
                catch(Exception ex)
                {
                    if(handleErrors)
                        strLastError=ex.Message;
                    else
                        throw;
                }
                

                return i;
            }


            public int ExecuteNonQuery(string commandtext)
            {
                int i=-1;
                try
                {
                    cmd.CommandText=commandtext;
                    i = ExecuteNonQuery();
                }
                catch(Exception ex)
                {
                    if(handleErrors)
                        strLastError=ex.Message;
                    else
                        throw;
                }
               
                return i;
            }


            public DataSet ExecuteDataSet()
            {
                MySqlDataAdapter da = null;
                DataSet ds=null;
                try
                {
                    da=new MySqlDataAdapter();
                    da.SelectCommand = (MySqlCommand)cmd;
                    ds=new DataSet();
                    da.Fill(ds);
                }
                catch(Exception ex)
                {
                    if(handleErrors)
                        strLastError=ex.Message;
                    else
                        throw;
                }
                

                return ds;
            }


            public DataSet ExecuteDataSet(string commandtext)
            {
                DataSet ds = null;
                try
                {
                    cmd.CommandText=commandtext;
                    ds = ExecuteDataSet();
                }
                catch(Exception ex)
                {
                    if(handleErrors)
                        strLastError=ex.Message;
                    else
                        throw;
                }
                
                return ds;
            }

            public string CommandText
            {
                get
                {
                    return cmd.CommandText;
                }
                set
                {
                    cmd.CommandText=value;
                    cmd.Parameters.Clear();
                }
            }

            public IDataParameterCollection Parameters
            {
                get
                {
                    return cmd.Parameters;
                }
            }

            public void AddParameter(string paramname,object paramvalue)
            {
                MySqlParameter param=new MySqlParameter(paramname,paramvalue);
                cmd.Parameters.Add(param);
            }

            public void AddParameter(IDataParameter param)
            {
                cmd.Parameters.Add(param);
            }


            public string ConnectionString
            {
                get
                {
                    return strConnectionString;
                }
                set
                {
                    strConnectionString=value;
                }
            }

            private void Open()
            {
                cmd.Connection.Open();
            }

            private void Close()
            {
                cmd.Connection.Close();
            }

            public bool HandleExceptions
            {
                get
                {
                    return handleErrors;
                }
                set
                {
                    handleErrors=value;
                }
            }

            public string LastError
            {
                get
                {
                    return strLastError;
                }
            }

            public void Dispose()
            {
                cmd.Dispose();
            }
        }

    }

    quinta-feira, 11 de abril de 2013 11:40
  • Para retornar o valor você deveria usar o ExecuteScalar, atualmente você está utilizando o ExecuteNonQuery e o ExecuteNonQuery não retorna dados

    http://cbsa.com.br/post/diferencas-entre-executereader-executenonquery-executescalar-quando-usar-e-qual-usar.aspx


    quinta-feira, 11 de abril de 2013 15:45
  • Caro Colega,

    No caso a minha procedure é um Insert que retorna o ID (inserido) Você tem alguma sugestão de como proceder!?

    Inclusive usei o ExecuteScalar e continua com o mesmo erro.

    Desculpe pelo incomodo mas sou novato nessa "brincadeira"

    Valeu


    quinta-feira, 11 de abril de 2013 16:11
  • Pode informar o código da procesure?
    quinta-feira, 11 de abril de 2013 17:48
  • CREATE DEFINER = 'root'@'%' PROCEDURE `inserir_processo`(
            IN p_pros_data_sinistro DATE,
            IN p_pros_natureza INTEGER,
            IN p_pros_tipo_vitima INTEGER,
            IN p_pros_num_sinistro VARCHAR(30),
            IN p_pros_analista VARCHAR(60),
            IN p_pros_data_recepcao DATE,
            IN p_pros_obs VARCHAR(300),
            IN p_ang_cod INTEGER,
            IN p_pros_qtd_bene INTEGER,
            IN p_cid_cod INTEGER,
            IN p_pros_est CHAR(2),
            IN p_pros_data_bo DATE,
            IN p_pros_seg VARCHAR(100),
            IN p_pros_laudo_iml VARCHAR(60),
            IN p_pros_valor_dams DECIMAL(18,2),
            IN p_pros_data_obito DATE,
            IN p_cid_cod_obito INTEGER,
            IN p_est_obito CHAR(2),
            IN p_pes_cod INTEGER,
            IN p_pros_sit INTEGER,
            IN p_pros_vei_tipo VARCHAR(10),
            IN p_pros_vei_cat INTEGER,
            IN p_pros_vei_placa VARCHAR(10),
            IN p_pros_del_desc VARCHAR(60),
            IN p_pros_del_est CHAR(2),
            IN p_pros_data DATE,
            IN p_pros_hora TIME,
            IN p_usu_cod INTEGER,
            IN p_pros_hora_acid TIME,
            IN p_pros_num_bo VARCHAR(20),
            IN p_pros_med_nome VARCHAR(100),
            IN p_pros_med_crm VARCHAR(50),
            INOUT p_ProcId INTEGER(11)
        )
        NOT DETERMINISTIC
        CONTAINS SQL
        SQL SECURITY DEFINER
        COMMENT ''
    BEGIN


    INSERT INTO `processo`
     (`pros_data_sinistro`, `pros_natureza`,
      `pros_tipo_vitima`, `pros_num_sinistro`, `pros_analista`,
      `pros_data_recepcao`, `pros_obs`, `ang_cod`, `pros_qtd_bene`,
      `cid_cod`, `pros_est`, `pros_data_bo`, `pros_seg`,
      `pros_laudo_iml`, `pros_valor_dams`, `pros_data_obito`,
      `cid_cod_obito`, `est_obito`,
      `pes_cod`, `pros_sit`,
      `pros_vei_tipo`, `pros_vei_cat`, `pros_vei_placa`, `pros_del_desc`,
      `pros_del_est`, `pros_data`, `pros_hora`, `usu_cod`,
      `pros_hora_acid`,
      `pros_num_bo`, `pros_med_nome`,
      `pros_med_crm`)
    VALUES   
    (p_pros_data_sinistro, p_pros_natureza,
     p_pros_tipo_vitima, p_pros_num_sinistro, p_pros_analista,
     p_pros_data_recepcao, p_pros_obs, p_ang_cod, p_pros_qtd_bene,
     p_cid_cod, p_pros_est, p_pros_data_bo, p_pros_seg, p_pros_laudo_iml,
     p_pros_valor_dams, p_pros_data_obito, p_cid_cod_obito, p_est_obito,   
     p_pes_cod, p_pros_sit, p_pros_vei_tipo, p_pros_vei_cat,
     p_pros_vei_placa, p_pros_del_desc, p_pros_del_est, p_pros_data,
     p_pros_hora, p_usu_cod,
     p_pros_hora_acid, p_pros_num_bo,
     p_pros_med_nome, p_pros_med_crm);

      SELECT `processo`.`pros_cod`  FROM PROCESSO WHERE `processo`.`pros_cod` = LAST_INSERT_ID() INTO p_ProcId;

    END;

    sem problemas meu amigo.. tudo pela resolução hehehe

         
    quinta-feira, 11 de abril de 2013 18:01
  • Pode tentar substituir

    SELECT `processo`.`pros_cod`  FROM PROCESSO WHERE `processo`.`pros_cod` = LAST_INSERT_ID() INTO p_ProcId;

    por

    SELECT LAST_INSERT_ID();

    ou por

    SET p_ProcId = LAST_INSERT_ID();

    sexta-feira, 12 de abril de 2013 00:35