Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с OleDbParameter (ошибка Bind parameter e, ошибка Incorrect parameter bind iOrdinal 
V
    Опции темы
Апрельский Ёжик
Дата 19.7.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



Подключаюсь к БД 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#.

Я много времени потратил на решение этой проблемы и зашел в тупик. Если кто-то мне может помочь , то приму любой совет с благодарностью. Спасибо за внимание.
PM MAIL   Вверх
mr.DUDA
Дата 20.7.2007, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Попробуйте не указывать ParameterName при добавлении параметра.


--------------------
user posted image
PM MAIL WWW   Вверх
thomas
Дата 20.7.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Апрельский Ёжик
Привет.
Статья по теме.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Апрельский Ёжик
Дата 20.7.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



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 приложения ... Но видимо прийдется. 

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

Если у кого-либо есть ещё идеи насчёт моей проблемы - приму с благодарностью, а пока кажется придётся самому.
PM MAIL   Вверх
mr.DUDA
Дата 21.7.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Вырезка из статьи по линку 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";




--------------------
user posted image
PM MAIL WWW   Вверх
Апрельский Ёжик
Дата 21.7.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 19.7.2007

Репутация: нет
Всего: нет



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

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

Всем спасибо за помощь.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0669 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.