Параметризованный запрос DB2 от.NET

Я пытаюсь выполнить параметризированный запрос против базы данных 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] [iSeries Доступ Драйвер ODBC] [DB2 UDB] SQL0206 - Столбец @LAT не в указанных таблицах.

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

6
задан Karmic Coder 3 March 2010 в 20:45
поделиться

2 ответа

Вы пробовали использовать? в качестве заполнителя вместо @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 (), не имеет значения, хотя по соглашению я делаю его таким же, как имя поля.

10
ответ дан 10 December 2019 в 00:37
поделиться

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

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

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 = "Insert Into Person (FirstName, LastName) Values ​​(@fName, @lName)

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

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

в то время как (myReader.Read ()) { (скрытый) = myReader.GetString ("FirstNameField"); (скрытый) = myReader.GetString ("LastNameField "); cmd.ExecuteNonQuery ();

}

0
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: