Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с открытием pFIBDataSet по FB 1.5.1 [D7, FireBird]


Страницы:   1 2

wipr ©   (2007-12-08 00:49:00) 

Если используется сервер FB 1.5.4, то все работает нормально (клиентское приложение написано на ПК, на котором установлен FB 1.5.4). Как только приложение переносится клиенту (у него клиент и сервер имеет FB 1.5.1) возникает ошибка:
frm.qu2.SelectQuery:
Arithmetic overflow or division by zero has occurred. Arithmetic exception, numeric overflow, or string truncation.
Cannot transliterate character between character sets.

Сдесь qu2 - это pFIBDataSet в качестве запроса выбора используется следующий текст:
SELECT *
FROM SANCTION
WHERE USERNAME=:USERNAME

открывается запрос с помощью:
 qu2.Close;
 qu2.ParamByName('USERNAME').AsString:=trim(listUser.Text);
 qu2.Open;
где listUser - это ComboBox
Ошибка возникает в момент qu2.Open;


Desdechado   (2007-12-12 08:49:00) [1]

:USERNAME='USER'
проходит без ошибки.
В IBConsole
SELECT * FROM SANCTION WHERE USERNAME="Администратор"
ошибка есть

Это однозначнонесовпадение чарсетов.


turbouser   (2007-12-11 20:54:00) [2]


> wipr   (11.12.07 20:08) [29]

Проверял на 1.5.1.4481 - не глючит.
Где-то у тебя CHARSET все-таки не прописан.
Попробуй сделать новый проект, накидай на форму
pFibDataBase, pFibTransaction, pFibQuery - выставь
все необходимые свойства и проверь.


wipr   (2007-12-11 20:08:00) [3]


> >  DBName = 'localhost:C:\Base\OKTABR\UCHET.GDB'


> > create database 'C:\Мои документы\BASE\uchet.gdb'
>
> Может в этом дело?


Нет дело не в этом. Вытягивалось из разных скриптов. В 'C:\Мои документы\BASE\uchet.gdb' лежит исходная база. А в C:\Base\OKTABR\UCHET.GDB' рабочая. Разница только в наполнении данными, структура не менялась.
Есть еще интересное с FIBPlus
SELECT * FROM SANCTION WHERE USERNAME=:USERNAME
:USERNAME='USER'
проходит без ошибки.
В IBConsole
SELECT * FROM SANCTION WHERE USERNAME="Администратор"
ошибка есть
а в dbexplor
SELECT * FROM SANCTION WHERE USERNAME="Администратор"
ошибки нет как и при использовании TQuery от BDE
Похоже действительно глючит FB 1.5.1 без BDE


turbouser   (2007-12-11 09:44:00) [4]


> Sergey13 ©   (11.12.07 09:00) [27]

У pFIBQuery Open - это свойство.


Sergey13   (2007-12-11 09:00:00) [5]

> [18] wipr   (10.12.07 21:04)

> Ошибка причем возникает после Open

> pFIBQuery.ExecQuery;  
> Сообщение об ошибке вышло тут.
> pFIBQuery.Next;

А разве ExecQuery=Open?


Desdechado   (2007-12-10 22:53:00) [6]

> wipr   (10.12.07 21:04) [18]
Ты невнимателен. Я выделил тип CHAR и DEFAULT 0, что вообще-то разных типов. Хотя к SELECT вряд ли имеет отношение, но хорошо демонстрирует твою небрежность в мелочах.


turbouser   (2007-12-10 22:45:00) [7]


> wipr   (10.12.07 22:41) [24]
>
> А вот и сам pFIBDatabase
> object DB: TpFIBDatabase
>  DBName = 'localhost: C:\Base\OKTABR\UCHET.GDB'


> wipr   (10.12.07 21:28) [20]
>
> Тестовая БД весит 235М. Дюжа много.
> скрипт следующий
> set names WIN1251;
> SET SQL DIALECT 1;
> create database ' C:\Мои документы\BASE\uchet.gdb'

Может в этом дело?


wipr   (2007-12-10 22:41:00) [8]

А вот и сам pFIBDatabase
object DB: TpFIBDatabase
 DBName = 'localhost:C:\Base\OKTABR\UCHET.GDB'
 DBParams.Strings = (
   'user_name=SYSDBA'
   'password=masterkey'
   'lc_ctype=WIN1251'
   'sql_role_name=')
 SQLDialect = 1
 Timeout = 0
 DesignDBOptions = []
 LibraryName = 'fbclient.dll'
 WaitForRestoreConnect = 0
 Left = 25
 Top = 140
end

это pFIBDataSet
object qu2: TpFIBDataSet
 SelectSQL.Strings = (
   'SELECT *'
   'FROM SANCTION'
   'WHERE USERNAME=:USERNAME')
 Transaction = t2
 Database = frmMane.DB
 Left = 300
 Top = 80
end

а это pFIBTransaction
object t2: TpFIBTransaction
 DefaultDatabase = frmMane.DB
 TimeoutAction = TARollback
 Left = 270
 Top = 80
end


wipr   (2007-12-10 22:25:00) [9]


> Настаиваю на том, что pFIBDatabase.ConnectionParams.CharSet<>'WIN1251'


pFIBDatabase.DBParams
user_name=SYSDBA
password=masterkey
lc_ctype=WIN1251


wipr   (2007-12-10 22:17:00) [10]


> qu2.FieldByName('USERPASSWORD').AsString<>null
> - это что такое?

согласен полная чушь, но до неё дело не доходит

> Настаиваю на том, что pFIBDatabase.ConnectionParams.CharSet<>'WIN1251'

и всётаки WIN1251 (проверено)


turbouser   (2007-12-10 22:09:00) [11]


> wipr   (10.12.07 21:28) [20]

Это ни о чем не говорит.

qu2.FieldByName('USERPASSWORD').AsString<>null
- это что такое?
Должно быть
if not VarIsNull(qu2.FieldByName('USERPASSWORD').Value) then
P.S.
Настаиваю на том, что pFIBDatabase.ConnectionParams.CharSet<>'WIN1251'


wipr   (2007-12-10 21:28:00) [12]

Тестовая БД весит 235М. Дюжа много.
скрипт следующий
set names WIN1251;
SET SQL DIALECT 1;
create database 'C:\Мои документы\BASE\uchet.gdb' USER 'SYSDBA' PASSWORD 'masterkey' default character set WIN1251;
connect 'C:\Мои документы\BASE\uchet.gdb' USER 'SYSDBA' PASSWORD 'masterkey';
...............
/*ТАБЛИЦА ПОЛЬЗОВАТЕЛЕЙ*/
CREATE TABLE SANCTION
(
 KOD    INTEGER DEFAULT -1 NOT NULL,
 USERNAME    CHAR(50) CHARACTER SET WIN1251 DEFAULT '(new)' NOT NULL COLLATE PXW_CYRL,
 USERPASSWORD    CHAR(15) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
 USERTYPE    CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
 DOSTUP_PROV    CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
 NOISPOLZ    CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
 VIEW1    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW2    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW3    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW4    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW5    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW6    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW7    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW8    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW9    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW10    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW11    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW12    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW13    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW14    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW15    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW16    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW17    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW18    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW19    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW20    CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
PRIMARY KEY (KOD),
UNIQUE (USERNAME)
);

procedure TfrmLogin.OKBtnClick(Sender: TObject);
var
 s: String;
 i: Integer;
begin
 qu2.Close;
 qu2.ParamByName('USERNAME').AsString:=trim(listUser.Text);
 qu2.Open;
 
 if qu2.FieldByName('USERPASSWORD').AsString<>null
   then s:=qu2.FieldByName('USERPASSWORD').AsString
   else s:='';
 qu2.Close;
 
 if Password.Text<>s then begin
   ShowMessage('Неправильный пароль.');
   Password.Text:='';
   Password.SetFocus;
 end else ModalResult:=mrOk;
end;


turbouser   (2007-12-10 21:13:00) [13]


> wipr   (10.12.07 21:04) [18]

Скинь куда-нибудь тестовую бд и исходники, в которых воспроизводится данная ошибка.
например на webfile.ru
А то получается поиск черной кошки в темной комнате...


wipr   (2007-12-10 21:04:00) [14]


> И почему не используешь VARCHAR для имени/пароля?

По моему CHAR или VARCHAR все равно должен работать.
По моему это проблемы с FIBPlus под сервером IB 1.5.1, точнее с компонентами pFIBDataSet и pFIBQuery. Ошибка причем возникает после Open, в момент получения данных от сервера, т.е. я пробовал следующий код:
pFIBQuery.GoToFirstRecordOnExecute:=False;
pFIBQuery.SQL.Text:='SELECT * FROM SANCTION WHERE USERNAME=:USERNAME';
pFIBQuery.ParamByName('USERNAME').AsString:=trim(listUser.Text);
pFIBQuery.ExecQuery;  
Сообщение об ошибке вышло тут.
pFIBQuery.Next;


Desdechado   (2007-12-10 12:08:00) [15]

> USERTYPE CHAR(1) CHARACTER SET WIN1251 DEFAULT 0NOT NULL,
>   DOSTUP_PROV CHAR(1) CHARACTER SET WIN1251 DEFAULT 0NOT NULL,
Довольно странно.

И почему не используешь VARCHAR для имени/пароля?


wipr   (2007-12-08 22:19:00) [16]


> У самой БД точно WIN1251 ?

Да


turbouser   (2007-12-08 21:21:00) [17]


> wipr   (08.12.07 20:25) [13]

Зачем для каждого поля в отдельности указывать CHARACTER SET ?
Достаточно указать его для всей базы данных.
У самой БД точно WIN1251 ?


wipr   (2007-12-08 20:30:00) [18]

Да может быть самое главное я не сказал.
Данный код работает в старых проектах, но только с BDE/
Новый проект решил сделать с FIBPlus и тут начались непонятки.


wipr   (2007-12-08 20:25:00) [19]


> Надо взять отресторенную бд у клиента и сравнить с исходной.
>
> Все-таки даунгрейд получается и вполне возможны какие-то
> проблемы.

На одной и той же машине я менял сервер FB c 1.5.1 на 1.5.4 и обратно, при этом база была одна и таже.


> SANCTION - это таблица, вьюха или процедура?

Это таблица.

> Еще раз проверь типы данных на размерность. Что-то где-то
> куда-то не вмещается.

Я тоже понимаю чтот что-то, куда-то не помещается, только что и куда сам не пойму.


> Почему бы и клиенту не поставить 1.5.4

Если возникла такая проблема с мелочью в новом проекте, где вероятность того, что чтонибудь не вылезет с сучествующими (действующими) проектами.
> Во первых пропиши в запросе поля, * - один из главных источников
> ошибок.

Поля прописывал, результата нет.


> Во вторых где метаданные SANCTION ?

CREATE TABLE SANCTION
(
 KOD INTEGER DEFAULT -1 NOT NULL,
 USERNAME CHAR(50) CHARACTER SET WIN1251 DEFAULT '(new)' NOT NULL COLLATE PXW_CYRL,
 USERPASSWORD CHAR(15) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
 USERTYPE CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
 DOSTUP_PROV CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
 NOISPOLZ CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
 VIEW1 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW2 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW3 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW4 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW5 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW6 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW7 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW8 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW9 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW10 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW11 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW12 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW13 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW14 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW15 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW16 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW17 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW18 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW19 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
 VIEW20 CHAR(1) CHARACTER SET WIN1251 DEFAULT '1' NOT NULL,
PRIMARY KEY (KOD),
UNIQUE (USERNAME)
);


Desdechado   (2007-12-08 19:54:00) [20]

SANCTION - это таблица, вьюха или процедура?
Еще раз проверь типы данных на размерность. Что-то где-то куда-то не вмещается.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо