Параметризованный запрос DB2 из .NET - PullRequest
6 голосов
/ 03 марта 2010

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

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 Access] [DB2 UDB] SQL0206 - Столбец @LAT отсутствует в указанных таблицах.

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

Ответы [ 2 ]

10 голосов
/ 03 марта 2010

Вы пробовали использовать? в качестве заполнителя вместо @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 голосов
/ 03 марта 2010

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

Вы хотите добавить ОДИН параметр, и вам нужно изменить ЗНАЧЕНИЕ параметра в цикле.

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) и нужно изменить значение параметра в цикле.

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

cmd.CommandText = "Значения вставки в лицо (имя, фамилия) (@fName, @lName)

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

Затем необходимо явно добавить параметры, используя следующие правила:

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

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

cmd.CommandText = "Значения вставки в лицо (имя, фамилия) (@fName, @lName)

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

Тогда, если у меня есть устройство чтения данных, которое имеет несколько имен, я могу повторно назначить ЗНАЧЕНИЕ от считывателя на ЗНАЧЕНИЕ параметра.

while (myReader.Read ()) { cmd.Parameters ["@ fName ']. Value = myReader.GetString (" FirstNameField "); cmd.Parameters ["@ lName ']. Value = myReader.GetString (" LastNameField "); cmd.ExecuteNonQuery (); * * тысяча тридцать-восемь

}

...