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?

Foi útil?

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

}

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top