Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Это то, что доступ MS требует при использовании ODBCConnection / ODBCCommand.

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

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

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

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

cmd.commandtext = "Вставить на человека (имя имен, фамилия) (@fname, @lname)

cmd.parameters.addwithValue ("@ fname", "Дэвид"); // Эта линия, в этом контексте, говорит «Repalce Параметр Palceholder из предыдущей строки с этим фактическим параметром. Cmd.parameters.addwithvalue (" @ lname "," Stratton "); // Аналогично, это заменяет заполнителей @lname Отказ

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

while (myReader.read ()) {cmd.parameters ["@ fname ']. Значение = myReader.getString (« firstnamefield »); cmd.parameters [" @ lname']. Значение = myReader.getString («LASTNAMEFIELDELD») ; cmd.executenonquery ();

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top