Executando Procedure

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

Respostas

28/02/2012

Joel Rodrigues Currículo

Pra começar, qual o erro?
Responder Citar

28/02/2012

Joel Rodrigues Currículo

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

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 Citar

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 Citar

28/02/2012

Joel Rodrigues Currículo

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 Citar

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 Citar

28/02/2012

Joel Rodrigues Currículo

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 Citar

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 Citar

28/02/2012

Joel Rodrigues Currículo

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

28/02/2012

Thiago Garcez

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

28/02/2012

Joel Rodrigues Currículo

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 Citar

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 Citar

29/02/2012

Fabio Fim Currículo

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

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 Citar

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 Citar