Параметризованный запрос DB2 из .NET
-
24-09-2019 - |
Вопрос
Я пытаюсь запустить параметризованный запрос против базы данных 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 ();
}