Executando Procedure

.NET

28/02/2012

Pessoal estou tentando executar Procedure mais está dando erro não sei onde está o erro.


OpenConnection();

Cmd = new FbCommand(ATUALIZAAGNWEB, Con);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.AddWithValue(@DtVisita, Convert.ToDateTime(a.dtvisita));
Cmd.Parameters.AddWithValue(@Cd_clb, a.cd_clb);
Cmd.Parameters.AddWithValue(@Horario, a.horario);
Cmd.Parameters.AddWithValue(@nmcliente, a.nmcliente);
Cmd.Parameters.AddWithValue(@Telefone, a.telefone);
Dr = Cmd.ExecuteReader();
Dr.Read();


return Dr.GetInt32(0);
Thiago Garcez

Thiago Garcez

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

28/02/2012

Pra começar, qual o erro?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

28/02/2012

Esse procedure retorna uma consulta? Se não, para que o DataReader?
Use o método ExecuteNonQuery() ao invés de ExecuteReader().
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Esse procedure retorna uma consulta? Se não, para que o DataReader?
Use o método ExecuteNonQuery() ao invés de ExecuteReader().


Realmente, esqueci de botar o erro, segue abaixo.

Input parameter mismatch for procedure ATUALIZAAGNWEB

Não é consulta é pra inserir, mais ele me retorna um numero.
Vou alterar e já respondo.
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Continua o mesmo erro

Input parameter mismatch for procedure ATUALIZAAGNWEB

Como o erro mesmo diz está dando erro na entrada dos parametros, porém não tenho certeza se é realmente assim que passa os parametros.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

28/02/2012

Se retorna um resultado, seria através de uma variável de saída?
Se for, falta você definir o parâmetro de saída.
Para isso, instancie um FbParameter, informe o nome e um valor qualquer e a propriedade Direction deve ser Output.
Após o ExeuteNonQuery(), recupere o valor do parâmetro de saída.
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Se retorna um resultado, seria através de uma variável de saída?
Se for, falta você definir o parâmetro de saída.
Para isso, instancie um FbParameter, informe o nome e um valor qualquer e a propriedade Direction deve ser Output.
Após o ExeuteNonQuery(), recupere o valor do parâmetro de saída.


Bom eu não conheço isso ainda, teria como me mostrar um exemplo?

Mais ele está dando erro no Input não teria que trocar algum coisa no que passei?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

28/02/2012

Bem, usei Firebird muito pouco, mas algumas perguntas são válidas:
- O valor de retorno é através de um parâmetro de saída ou de uma consulta?
- Os tipos dos parâmetros que você está passando estão corretos?

Aparentemente não há erro na estrutura do seu código.
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Bem, usei Firebird muito pouco, mas algumas perguntas são válidas:
- O valor de retorno é através de um parâmetro de saída ou de uma consulta?
- Os tipos dos parâmetros que você está passando estão corretos?

Aparentemente não há erro na estrutura do seu código.


Por parametro de saída, as variáveis estão, não sei o comando pois é a primeira vez que estou fazendo por isso a dúvida.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

28/02/2012

Se der para postar o código do procedure, talvez facilite.
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Se souber em SQL e puder dar um exemplo ajuda bastante eu tento converter aqui.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

28/02/2012

Fiz um procedure bem básico que retorna um decimal (soma da quantidade*preco) de uma tabela de itens de vendas:

# TABELA:
CREATE TABLE ITENS_VENDA
(
VENDA INT,
PRODUTO VARCHAR(10),
QUANTIDADE DECIMAL(8,2),
PRECO DECIMAL(8,2)
)
GO

# PROCEDURE:
CREATE PROCEDURE usp_INSERIR_ITEM_VENDA
@VENDA INT,
@PRODUTO VARCHAR(10),
@QUANTIDADE DECIMAL(8,2),
@PRECO DECIMAL(8,2),
@TOTAL_VENDA DECIMAL(8,2) OUTPUT --parâmetro de saída
AS
BEGIN
INSERT INTO ITENS_VENDA (VENDA, PRODUTO, QUANTIDADE, PRECO)
VALUES (@VENDA, @PRODUTO, @QUANTIDADE, @PRECO)
--atribui um valor ao parâmetro de saída
SELECT @TOTAL_VENDA = SUM(PRECO*QUANTIDADE) FROM ITENS_VENDA WHERE VENDA = @VENDA
END
GO

# CÓDIGO C#:
using (SqlCommand comando = conexao.CreateCommand())
{
comando.CommandType = CommandType.StoredProcedure;
comando.CommandText = usp_INSERIR_ITEM_VENDA;
comando.Parameters.AddWithValue(VENDA, venda);
comando.Parameters.AddWithValue(PRODUTO, produto);
comando.Parameters.AddWithValue(QUANTIDADE, quantidade);
comando.Parameters.AddWithValue(PRECO, preco);
//criando SqlParameter do tipo output
SqlParameter parTotal = new SqlParameter(TOTAL_VENDA, venda);
parTotal.Direction = ParameterDirection.Output;
//Adicionando ao SqlCommand
comando.Parameters.Add(parTotal);
//Executando o procedure
comando.ExecuteNonQuery();
//Após executar, o parâmetro possui um valor vindo do banco
decimal total = Convert.ToDecimal(parTotal.Value);
}

Bem, é isso. Qualquer dúvida, fique à vontade para perguntar.
Boa sorte.
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Bom obrigado, funcionou e ficou assim.

Cmd = new FbCommand(ATUALIZAAGNWEB, Con);
Cmd.CommandType = CommandType.StoredProcedure;

Cmd.Parameters.Add(@PDtVisita, FbDbType.Date).Value = Convert.ToDateTime(a.dtvisita);
Cmd.Parameters.Add(@PCd_clb, FbDbType.Integer).Value = Convert.ToInt32(a.cd_clb);
Cmd.Parameters.Add(@PHorario, FbDbType.VarChar).Value = Convert.ToString(a.horario);
Cmd.Parameters.Add(@Pnmcliente, FbDbType.VarChar).Value = Convert.ToString(a.nmcliente);
Cmd.Parameters.Add(@PTelefone, FbDbType.VarChar).Value = Convert.ToString(a.telefone);
Cmd.Parameters.Add(@PBloq, FbDbType.VarChar).Value = 07:00;


Cmd.ExecuteNonQuery();
GOSTEI 0
Fabio Fim

Fabio Fim

28/02/2012

Tem que usar os mesmos nomes de parametros que estão nas stores procedures
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Estou executando a Procedure abaixo, porém ela não está gravando.

Cmd = new FbCommand(AGENDAWEBGRAVAAGN, Con);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add(@Data, FbDbType.Date).Value = Convert.ToDateTime(a.dtvisita);
Cmd.Parameters.Add(@Hora, FbDbType.VarChar).Value = Convert.ToString(a.horario);
Cmd.Parameters.Add(@Cd_cli, FbDbType.Integer).Value = Convert.ToInt32(a.cd_cli);
Cmd.Parameters.Add(@Cd_clb, FbDbType.Integer).Value = Convert.ToInt32(a.cd_clb);
Cmd.Parameters.Add(@srv1, FbDbType.Integer).Value = Convert.ToInt32(a.Srv1);



Dr = Cmd.ExecuteReader();
Dr.Read();


Executa e me retornar o falor correto, porém não grava no bando de dados.

se eu trocar o Dr = Cmd.ExecuteReader(); Dr.Read(); por
Cmd.Executenonquery();

Ele grava mais eu fico sem a informação da resposta
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012


Dr = Cmd.ExecuteReader();
Dr.Read();
return Dr.GetInt32(0);


Ele grava mais eu fico sem a informação da resposta
GOSTEI 0
Thiago Garcez

Thiago Garcez

28/02/2012

Copiei errado! O código acima pega o valor correto mais não grava!
GOSTEI 0
POSTAR