![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с открытием pFIBDataSet по FB 1.5.1 [D7, FireBird]
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 - это таблица, вьюха или процедура?
Еще раз проверь типы данных на размерность. Что-то где-то куда-то не вмещается.