2010-03-03 2 views
4

Я пытаюсь запустить параметризованный запрос к базе данных DB2 из .NET с помощью драйвера ODBC Client Access, используя следующий код:Параметризованная DB2 Query С .NET

var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn); 
db2Cmd.Parameters.AddWithValue("@LAT", insertValue); 
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery()); 

При выполнении OdbcException брошено:

ОШИБКА [42S22] [IBM] [Драйвер ODBC доступа iSeries] [DB2 UDB] SQL0206 - Столбец @LAT не указан в указанных таблицах.

The internets, похоже, подразумевает, что параметризованные запросы поддерживаются драйвером ODBC доступа клиента, но эта ошибка, как представляется, указывает на другое. Что-то не так с поставляемым кодом?

ответ

8

Вы пытались использовать? как заполнитель вместо @LAT?

var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (?)", db2Conn); 

db2Cmd.Parameters.AddWithValue("LAT", insertValue); 

Console.Out.WriteLine(db2Cmd.ExecuteNonQuery()); 

Это то, что требуется MS Access при использовании OdbcConnection/OdbcCommand.

Вам просто нужно убедиться, что операторы Parameters.AddWithValue() находятся в том же порядке, что и список полей в инструкции INSERT. Первый параметр, переданный AddWithValue(), кажется, не имеет значения, хотя по соглашению я делаю его таким же, как имя поля.

+0

Возьмите это сработало? Иногда простые решения работают лучше всего :-) – tomfanning

+0

+1 для в одном порядке – walterhuang

0

Если я угадал право на то, что вы пытаетесь сделать, вы хотите сделать это:

Вы хотите добавить еще один параметр, и необходимо изменить значение параметра в петле.

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

Добавлено

У вас есть только один заполнитель (@Lat) для вашего параметра в команде, так что вы должны добавлять только один параметр. Ваш код добавляет новый параметр для каждого объекта в читателе . Ни один из этих параметров не будет называться «@Lat», если только ваш читатель не возвращает значение @Lat.

Я все еще довольно уверен, что вам нужен один параметр (@Lat), и вам нужно изменить значение параметра в цикле.

Разъяснение синтаксис использования parameteized запросов, рассмотрим это утверждение:

cmd.CommandText = «Вставьте в лицо (FirstName, LastName) Значения (@fName, @lName)

В приведенном выше заявлении, @fName и @lName НЕ являются параметрами Они заполнители для параметров

Вы должны затем явно добавлять используя Счетчик следующих правил:..

  • Параметры должны быть указаны точно так же, как и заполнители
  • Парматеры должны быть добавлены в правильном порядке.

Так более полный пример будет

cmd.CommandText = "Вставьте в Person (FirstName, LastName) Значения (@fName, @lName)

cmd.Parameters.AddWithValue (" @ fName "," David "); // Эта строка в этом контексте говорит:« Отмените параметр palceholder из предыдущей строки этим фактическим параметром. cmd.Parameters.AddWithValue ("@ lName", "Stratton"); // аналогичным образом это заменяет местозаполнитель @lname.

Тогда, если у меня есть datareader, у которого есть куча имен, я могу повторно назначить VALUE от читателя к VALUE параметра.

в то время как (myReader.Read()) { cmd.Parameters [ "@ Fname '] Значение = myReader.GetString. ("FirstNameField"); cmd.Parameters [" @ LName'.] Значение = MyReader .GetString ("LastNameField"); cmd.ExecuteNonQuery();

+0

Команда и ее параметры верны, но пример скрывает некоторый код и не делает это ясным. Я уточню это. –

+0

ОК. Новый код делает недействительным даже мой добавленный текст. – David

Смежные вопросы