Я пытаюсь выполнить параметризированный запрос против базы данных 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, но эта ошибка, кажется, указывает иначе. Есть ли что-то не так с предоставленным кодом?
Вы пробовали использовать? в качестве заполнителя вместо @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 (), не имеет значения, хотя по соглашению я делаю его таким же, как имя поля.
Если я правильно понимаю, что вы пытаетесь сделать, вы хотите сделать следующее:
Вы хотите добавить ОДИН параметр, и вам нужно изменить ЗНАЧЕНИЕ параметра в цикле.
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 ();
}