У меня есть достаточно независимое приложение ADO.NET, которое подключается к ряду баз данных и может извлекать необходимую информацию для запуска. У меня возникла проблема с DB2 и с тем, как она обрабатывает именованные параметры, особенно когда я повторно использую именованный параметр в том же запросе. Я знаю несколько способов обойти это, просто добавив дополнительные параметры, но теоретически он должен работать так же, как и в других базах данных, к которым я подключаюсь, поскольку имя параметра такое же.
То, что я делаю, немного сложнее и включает в себя подзапросы и т. Д., Но для демонстрации возьмите следующий запрос:
выберите значение из test.table, где cola = @ key1 и colb = @ key1;
Именованный параметр @ key1 используется дважды.
Мой код выглядит следующим образом:
try
{
DbProviderFactory dbfFactory = DbProviderFactories.GetFactory("IBM.Data.DB2.iSeries");
using (DbConnection dbConnection = dbfFactory.CreateConnection())
{
dbConnection.ConnectionString = "DataSource=xxx.xxx.xxx.xxx;UserID=xxxxxxxx;password=xxxxxxxxx";
using (DbCommand dbCommand = dbConnection.CreateCommand())
{
IDbDataParameter iddpParameter1 = dbCommand.CreateParameter();
iddpParameter1.ParameterName = "@key1";
iddpParameter1.DbType = DbType.String;
iddpParameter1.Value = "1";
dbCommand.Parameters.Add(iddpParameter1);
dbCommand.CommandType = CommandType.Text;
dbCommand.CommandText = "select value from test.table where cola=@key1 and colb=@key1";
dbConnection.Open();
using (IDataReader idrReader = dbCommand.ExecuteReader())
{
while (idrReader.Read())
{
...
}
}
}
} // end dbConnection
} // end try
catch (Exception ex)
{
Console.Write(ex.Message);
}
Когда я запускаю это, я получаю исключение, которое говорит мне:
System.InvalidOperationException: Not enough parameters specified. The command requires 2 parameter(s), but only 1 parameter(s) exist in the parameter collection.
Я понимаю, что он мне говорит, но мне нужна помощь в выяснении того, как я могу заставить поставщик использовать именованный параметр для обоих параметров, поскольку они одинаковы. Похоже, что он выполняет слепой подсчет именованных параметров и не понимает, что они являются одними и теми же именованными параметрами. SQL Server, кажется, позволяет мне делать это с помощью того же кода, приведенного выше. Я предполагаю, что это всего лишь одно из тех различий в поставщиках, но надеюсь, что кто-то столкнулся с этим и имеет решение для DB2, которое не входит в конкретный код DB2.
Спасибо, ценю помощь.
?
маркеры параметров. Я предполагаю, что какой-то слой на стороне Windows переводит именованный параметр в вопросительный знак перед отправкой запроса на сервер. - person WarrenT   schedule 15.01.2015