Executando Procedure

28/02/2012

0

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

Responder

Posts

28/02/2012

Joel Rodrigues

Pra começar, qual o erro?
Responder

28/02/2012

Joel Rodrigues

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

28/02/2012

Thiago Garcez

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.
Responder

28/02/2012

Thiago Garcez

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.
Responder

28/02/2012

Joel Rodrigues

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.
Responder

28/02/2012

Thiago Garcez

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?
Responder

28/02/2012

Joel Rodrigues

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.
Responder

28/02/2012

Thiago Garcez

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.
Responder

28/02/2012

Joel Rodrigues

Se der para postar o código do procedure, talvez facilite.
Responder

28/02/2012

Thiago Garcez

Se souber em SQL e puder dar um exemplo ajuda bastante eu tento converter aqui.
Responder

28/02/2012

Joel Rodrigues

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.
Responder

28/02/2012

Thiago Garcez

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();
Responder

29/02/2012

Fabio Fim

Tem que usar os mesmos nomes de parametros que estão nas stores procedures
Responder

02/03/2012

Thiago Garcez

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
Responder

02/03/2012

Thiago Garcez


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


Ele grava mais eu fico sem a informação da resposta
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar