Executando Procedure
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);
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
Curtidas 0
Respostas
Joel Rodrigues
28/02/2012
Pra começar, qual o erro?
GOSTEI 0
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().
Use o método ExecuteNonQuery() ao invés de ExecuteReader().
GOSTEI 0
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().
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
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.
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
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.
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
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.
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
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.
- 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
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.
- 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
28/02/2012
Se der para postar o código do procedure, talvez facilite.
GOSTEI 0
Thiago Garcez
28/02/2012
Se souber em SQL e puder dar um exemplo ajuda bastante eu tento converter aqui.
GOSTEI 0
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.
# 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
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();
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
28/02/2012
Tem que usar os mesmos nomes de parametros que estão nas stores procedures
GOSTEI 0
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
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
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
28/02/2012
Copiei errado! O código acima pega o valor correto mais não grava!
GOSTEI 0