Consulta DB2 parametrizada do .NET
-
24-09-2019 - |
Pergunta
Estou tentando executar uma consulta parametrizada em um banco de dados DB2 do .NET usando o driver ODBC de acesso ao cliente usando o seguinte código:
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn);
db2Cmd.Parameters.AddWithValue("@LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
Quando executado, um OdbcException
é jogado:
Erro [42S22] [IBM] [ISERIES Access ODBC Driver] [DB2 UDB] SQL0206 - Coluna @lat não em tabelas especificadas.
As internets parecem sugerir que as consultas parametrizadas são suportadas pelo driver ODBC de acesso ao cliente, mas esse erro parece indicar o contrário. Há algo de errado com o código fornecido?
Solução
Você já tentou usar? Como espaço reservado em vez de @lat?
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (?)", db2Conn);
db2Cmd.Parameters.AddWithValue("LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
É isso que o MS Access exige ao usar ODBCConnection / ODBCCommand.
Você só precisa garantir que seus parâmetros.AddWithValue () estão na mesma ordem que a lista de campo na instrução Insert. O primeiro parâmetro passado para addWithValue () não parece importar, embora, por convenção, eu faça o mesmo que o nome do campo.
Outras dicas
Se eu estou supondo o que você está tentando fazer, você quer fazer isso:
Você deseja adicionar um parâmetro e precisa alterar o valor do parâmetro no loop.
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@Lat)", db2Conn);
db2Cmd.Parameters.AddWithValue("@Lat", 0);
for (int j = 0; j < reader.FieldCount; ++j)
{
db2Cmd.Parameters["@Lat"].Value = reader[j];
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
}
Adicionado
Você só tem um espaço reservado (@Lat) para o seu parâmetro no comando, então você deve adicionar apenas um parâmetro. Seu código está adicionando um novo parâmetro para cada objeto no leitor. Nenhum desses parâmetros seria nomeado "@lat", a menos que o seu leitor esteja retornando um valor de @lat.
Ainda tenho certeza de que você precisa de um parâmetro (@LAT) e preciso modificar o valor do parâmetro no loop.
Esclarecendo a sintaxe do uso de consultas parameteizadas, considere esta afirmação:
cmd.CommandText = "Inserir em Pessoa (primeiro nome, sounName) valores (@fname, @lname)
Na declaração acima, @fname e @lname não são parâmetros. Eles são espaços reservados para parâmetros.
Você precisa então adicionar explicitamente os parâmetros usando as seguintes regras:
- Os parâmetros devem ser nomeados exatamente iguais aos espaços reservados
- Os parmatores devem ser adicionados na ordem certa.
Então, um exemplo mais completo seria
cmd.CommandText = "Inserir em Pessoa (primeiro nome, sounName) valores (@fname, @lname)
cmd.parameters.addwithValue ("@fname", "David"); // Esta linha, neste contexto, diz "Repalte o parâmetro Palceholder da linha anterior com este parâmetro real. .
Então, se eu tiver um DataReader que tenha vários nomes, posso atribuir o valor do leitor ao valor do parâmetro.
while (myReader.read ()) {cmd.parameters ["@fname ']. value = myReader.getString (" primeironamefield "); cmd.parameters ["@lname']. ; cmd.executenonQuery ();
}