Usuário com melhor resposta
MYsql + Procedure + Parametro Out

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
- Editado Daniel Amorin quarta-feira, 10 de abril de 2013 20:55
Respostas
-
Para retornar o valor você deveria usar o ExecuteScalar, atualmente você está utilizando o ExecuteNonQuery e o ExecuteNonQuery não retorna dados
- Sugerido como Resposta Samuel Rodrigues dos Anjos quinta-feira, 11 de abril de 2013 16:15
- Marcado como Resposta Felipo Gonçalves sexta-feira, 12 de abril de 2013 14:48
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?
-
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();
}
}
}
-
Para retornar o valor você deveria usar o ExecuteScalar, atualmente você está utilizando o ExecuteNonQuery e o ExecuteNonQuery não retorna dados
- Sugerido como Resposta Samuel Rodrigues dos Anjos quinta-feira, 11 de abril de 2013 16:15
- Marcado como Resposta Felipo Gonçalves sexta-feira, 12 de abril de 2013 14:48
-
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
- Editado Daniel Amorin quinta-feira, 11 de abril de 2013 17:10
-
-
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
-