Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Проблема с OleDbParameter (ошибка Bind parameter e


Автор: Апрельский Ёжик 19.7.2007, 23:10
Подключаюсь к БД FireBird 1 по средствам провайдера LCPI.IBProvider.1 (IBProvider 1). Соответственно это OleDbConnection. Строка подключения выглядит следующим образом:

Код

Provider=LCPI.IBProvider.1;Password=masterkey;Persist Security Info=True;User ID=SYSDBA;Data Source=D:\Work Data\Faraon\DB\FB\Faraon.gdb;auto_commit=True


Подключаюсь через UDL файл (из которого взята строка подключения что выше) вот таким образом:

Код

public class DataModule
{
    public OleDbConnection connection;
    
    .....

    public DataModule()
    {
        this.connection = new OleDbConnection("FILE NAME=" + HttpContext.Current.Request.PhysicalApplicationPath + WebConfigurationManager.AppSettings["udlFile"]);
    }

    .....
}


Но это не особо важно. Подобный механизм обусловлен бизнес логикой. Ниже приведен пример работы:

Код

        OleDbCommand DbCmd = new OleDbCommand("Select Users.id_user, Users.id_group, Users.vname From Users where Users.id_user = 1", this.connection);
        this.connection.Open();
        OleDbDataReader DataReader = DbCmd.ExecuteReader();


Все отлично работает и извлекается на этом этапе (со статическим запросом).  

Но при использовании параметризированных запросов возникает ошибка. Пробовал задавать параметры следующим образом:

1. Вариант

Код

this.connection.Open();

OleDbCommand DbCmd = new OleDbCommand("Select Users.id_user, Users.id_group, Users.vname From Users where Users.id_user = ?", this.connection);
DbCmd.CommandType = CommandType.Text;

DbCmd.Parameters.Add(new OleDbParameter("id", OleDbType.Integer));
DbCmd.Parameters["id"].Direction = ParameterDirection.Input;
DbCmd.Parameters["id"].Value = 1; // это тестовый пример

OleDbDataReader DataReader = DbCmd.ExecuteReader();


2. Вариант

Код

DbCmd.Parameters.Add("id", OleDbType.Integer).Value = 1;


3. Вариант

Код

OleDbParameter Param1 = new OleDbParameter();
Param1.ParameterName = "id";
Param1.OleDbType = OleDbType.Integer;
Param1.Direction = ParameterDirection.Input;
Param1.Value = Convert.ToInt32(1);

DbCmd.Parameters.Add(Param1);


(упускаю ненужные подробности для сокращения кода , открываю запрос так же как и в первом примере).

Возникает ошибка:

Цитата

Bind parameter errors:
[0]:[code:0x80040E55]Incorrect parameter bind iOrdinal: 1
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.OleDb.OleDbException: Bind parameter errors:
[0]:[code:0x80040E55]Incorrect parameter bind iOrdinal: 1


Ошибка в строке открытия , куда бы я не помещал вывод , в OleDbDataReader , OleDbDataAdapter, итп, на строке извлечения неизменно эта ошибка. А именно на этой строке: [B]OleDbDataReader DataReader = DbCmd.ExecuteReader(); [/B]

Пробовал изменять SQL , задавая параметр в виде ?, ?id, @id, :id итп (уже просто перебирал варианты). Пробовал другие запросы - ничего не получается. 

Т.к. без параметров запрос прошел - соединение работает нормально. Возможно проблемы у данного проавайдера с параметрами , но я не думаю что это так. На всякий случай приведу код SQL создающий таблицу:

Код

CREATE TABLE USERS (
    ID_USER    INTEGER NOT NULL,
    VNAME      VARCHAR(50) CHARACTER SET NONE,
    VLOGIN     VARCHAR(50) CHARACTER SET NONE,
    VPASSWORD  VARCHAR(50) CHARACTER SET NONE,
    ID_GROUP   INTEGER
);


И ещё раз повторюсь, параметры работают прекрасно с этим же провайдером из Delphi, если нужна БД, то могу дать ссылку на демо версию приложения к которому я разрабатываю модуль. 

Платформа под которой все это делаю ASP.NET. Язык как понятно C#.

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

Автор: mr.DUDA 20.7.2007, 08:57
Попробуйте не указывать ParameterName при добавлении параметра.

Автор: thomas 20.7.2007, 10:39
Апрельский Ёжик, 
Привет.
Статья по http://rsdn.ru/article/db/guide_firebird2_adonet3.xml  smile 

Автор: Апрельский Ёжик 20.7.2007, 18:41
mr.DUDA , попробовал , результат тот же. Пробовал вот так (и с варианциями задания параметра :id, ?, итп):

Код

OleDbParameter Param1 = new OleDbParameter();
Param1.OleDbType = OleDbType.Integer;
Param1.Direction = ParameterDirection.Input;
Param1.Value = Convert.ToInt32(1);
DbCmd.Parameters.Add(Param1);


Ещё долго ковырялся с этой проблемой, пришёл к выводу что при задании параметра система не может увязать его со строкой запроса SQL. Как решить эту проблему пока думаю.

thomas , спасибо , я вчера тоже наткнулся на этот вариант при поиске решений. Как последняя мера видимо им воспользуюсь. Как последняя - потому что ASP.NET это только часть системы. В системе так же есть FastReport , который до этого момента в Win32 версии использовал другую версию провайдера. Неизвестно пока как он отреагирует. И не очень хорошо заставлять пользователя при развертывании приложения ставить 1 провайдер на Win32 версию , 1 провайдер под ASP.NET приложения ... Но видимо прийдется. 

Всем спасибо. 

Если у кого-либо есть ещё идеи насчёт моей проблемы - приму с благодарностью, а пока кажется придётся самому.

Автор: mr.DUDA 21.7.2007, 10:38
Вырезка из статьи по линку thomas-а:
Цитата
Параметры команд

В большинстве случаев при выполнении команды требуется задать её параметры. Параметры добавляются в коллекцию Parameters. Они могут быть именованными и позиционными. Пример команды с позиционными параметрами:

insert into country (country, currency) values(?, ?)

С именованными:

insert into country (country, currency) values(:country, :currency)


IBProvider сам умеет формировать список параметров, производя анализ SQL выражения. К сожалению, в ADO.Net необходимо вручную добавлять эти параметры, т.к. команда не запрашивает их описание у OLE DB-провайдера.

Чтобы добавить параметр, нужно воспользоваться:
- Методом AddWithValue() для добавления именованного параметра и значения.
- Перегруженным методом Add() для добавления как именованных, так и неименованных параметров.

Если не указан тип параметра, при добавлении будет использоваться OLE DB-тип VarWChar, соответствующий .Net-типу string, что кажется разумным. Об этом не стоит беспокоиться, т.к. IBProvider корректно обрабатывает приведение любых типов Firebird. 

Нельзя не сказать о существующих ограничениях при использовании именованных параметров совместно с OleDbCommand. В MSDN написано, что именованные параметры поддерживаются только для поставщиков данных MSSQL и Oracle, а для поставщиков данных OLE DB и ODBC поддерживаются только позиционные параметры. Использовать именованные параметры все же можно, но их добавление в коллекцию Parameters необходимо осуществлять в том же порядке, в каком они следуют в запросе. К примеру, если текст команды: 

update country set currency = :currency where country = :country 

то сначала необходимо добавить параметр currency, а потом country:

cmd.Parameters.AddWithValue("currency", "Rouble");
cmd.Parameters.AddWithValue("country", "Russia");

Задавать значения параметров можно уже в произвольном порядке:

cmd.Parameters["country"].Value = "Latvia";
cmd.Parameters["currency"].Value = "Lat";


Автор: Апрельский Ёжик 21.7.2007, 21:15
Проблему решил установкой IBProvider 3 Free. mr.DUDA, там действительно все именно так и работает. После некоторых исследований IBProvider 1 пришел к выводу что в строке запроса просто не находятся параметры на этапе "привязки", но т.к. параметр содержится в запросе , то они не могут быть обработаны. Подобных проблем с 3-им провайдером не возникло. Возможно если бы покапаться в настройках подключения по глубже, а именно в специфических параметрах, то можно было бы разобраться, но счел трату времени на это с учетом уже израсходованного излишней. Думаю тема закрыта. 

PS Жаль что возможностями вкладки Server Explorer в версии Free воспользоваться не удасться... Хотя в IBProvider 1 её так же воспользоваться не удалось, видимо в силу несоответствий. Хотя может я просто не очень хорошо разбираюсь в предметной области...

Всем спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)