Текущий архив: 2008.05.18;
Скачать: CL | DM;
ВнизПроблема с открытием pFIBDataSet по FB 1.5.1 Найти похожие ветки
← →
wipr (2007-12-08 00:49) [0]Если используется сервер 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;
← →
turbouser © (2007-12-08 01:21) [1]
> wipr (08.12.07 00:49)
CHARSET надо выставить у pFDataBase тотже, что и у базы данных.
← →
Виталий Панасенко(дом) (2007-12-08 01:32) [2]старая, как сам InteBase, проблема... хоть и не проблема... заскок.. есть украинский вариант загадки: ходыть, ходыть - не заходыть... а як зайде - не выгонеш!... видповидь:за..б в голову..:-)))
← →
wipr (2007-12-08 09:52) [3]
> CHARSET надо выставить у pFDataBase тотже, что и у базы
> данных.
В том то и дело что выставлено WIN1251
← →
wipr (2007-12-08 10:03) [4]> CHARSET надо выставить у pFDataBase тотже, что и у базы
> данных.
В том то и дело что выставлено WIN1251
Но почему в FB 1.5.1 не работает, а FB 1.5.4 работает.
← →
PEAKTOP © (2007-12-08 13:45) [5]А так ?
qu2.Close;
qu2.ParamCheck := false;
qu2.SQL.Text :=
"SELECT * "+#13#10+
"FROM SANCTION "+#13#10+
"WHERE USERNAME= """+trim(listUser.Text)+""" ";
qu2.Open;
← →
turbouser © (2007-12-08 14:38) [6]
> wipr (08.12.07 10:03) [4]
БД - то одинаковая? Проверь CHARSET у той, что у себя и той, что у клиента.
← →
atruhin © (2007-12-08 15:49) [7]Во первых пропиши в запросе поля, * - один из главных источников ошибок.
Во вторых где метаданные SANCTION ?
← →
Desdechado © (2007-12-08 17:46) [8]Почитай в ReleaseNotes, может, они поменяли версию ODS для базы. Ты как переносишь ее - через backup-restore или простым копированием?
А также помни, что чарсет можно задавать не только для БД, но и для отдельных полей.
Создаешь базу ты и потом ее отдаешь или юзер ее сам делает? Если сам, то он мог просто по умолчанию для базы другой чарсет задать, чем у тебя.
Кроме того, эта ошибка может быть отArithmetic overflow or division by zero has occurred, string truncation.
, т.е. у клиента размер поля другой.
← →
wipr (2007-12-08 19:22) [9]База одна передается клиенту backup -> copy -> restore
База и поле имеют WIN1251.
Проблема в том что с FB 1.5.1 не работает, а с FB 1.5.4 работает.
← →
wipr (2007-12-08 19:25) [10]
> А так ?
>
> qu2.Close;
> qu2.ParamCheck := false;
> qu2.SQL.Text :=
> "SELECT * "+#13#10+
> "FROM SANCTION "+#13#10+
> "WHERE USERNAME= """+trim(listUser.Text)+""" ";
> qu2.Open;
Тоже не работает.
← →
turbouser © (2007-12-08 19:51) [11]
> wipr (08.12.07 19:25) [10]
Надо взять отресторенную бд у клиента и сравнить с исходной.
Все-таки даунгрейд получается и вполне возможны какие-то проблемы.
p.s.
Почему бы и клиенту не поставить 1.5.4 ?
← →
Desdechado © (2007-12-08 19:54) [12]SANCTION - это таблица, вьюха или процедура?
Еще раз проверь типы данных на размерность. Что-то где-то куда-то не вмещается.
← →
wipr (2007-12-08 20:25) [13]
> Надо взять отресторенную бд у клиента и сравнить с исходной.
>
> Все-таки даунгрейд получается и вполне возможны какие-то
> проблемы.
На одной и той же машине я менял сервер 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)
);
← →
wipr (2007-12-08 20:30) [14]Да может быть самое главное я не сказал.
Данный код работает в старых проектах, но только с BDE/
Новый проект решил сделать с FIBPlus и тут начались непонятки.
← →
turbouser © (2007-12-08 21:21) [15]
> wipr (08.12.07 20:25) [13]
Зачем для каждого поля в отдельности указывать CHARACTER SET ?
Достаточно указать его для всей базы данных.
У самой БД точно WIN1251 ?
← →
wipr (2007-12-08 22:19) [16]
> У самой БД точно WIN1251 ?
Да
← →
Desdechado © (2007-12-10 12:08) [17]> USERTYPE CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
> DOSTUP_PROV CHAR(1) CHARACTER SET WIN1251 DEFAULT 0 NOT NULL,
Довольно странно.
И почему не используешь VARCHAR для имени/пароля?
← →
wipr (2007-12-10 21:04) [18]
> И почему не используешь 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;
← →
turbouser © (2007-12-10 21:13) [19]
> wipr (10.12.07 21:04) [18]
Скинь куда-нибудь тестовую бд и исходники, в которых воспроизводится данная ошибка.
например на webfile.ru
А то получается поиск черной кошки в темной комнате...
← →
wipr (2007-12-10 21:28) [20]Тестовая БД весит 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 22:09) [21]
> 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 22:17) [22]
> qu2.FieldByName("USERPASSWORD").AsString<>null
> - это что такое?
согласен полная чушь, но до неё дело не доходит
> Настаиваю на том, что pFIBDatabase.ConnectionParams.CharSet<>"WIN1251"
и всётаки WIN1251 (проверено)
← →
wipr (2007-12-10 22:25) [23]
> Настаиваю на том, что pFIBDatabase.ConnectionParams.CharSet<>"WIN1251"
pFIBDatabase.DBParams
user_name=SYSDBA
password=masterkey
lc_ctype=WIN1251
← →
wipr (2007-12-10 22:41) [24]А вот и сам 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
← →
turbouser © (2007-12-10 22:45) [25]
> 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"
Может в этом дело?
← →
Desdechado © (2007-12-10 22:53) [26]> wipr (10.12.07 21:04) [18]
Ты невнимателен. Я выделил тип CHAR и DEFAULT 0, что вообще-то разных типов. Хотя к SELECT вряд ли имеет отношение, но хорошо демонстрирует твою небрежность в мелочах.
← →
Sergey13 © (2007-12-11 09:00) [27]> [18] wipr (10.12.07 21:04)
> Ошибка причем возникает после Open
> pFIBQuery.ExecQuery;
> Сообщение об ошибке вышло тут.
> pFIBQuery.Next;
А разве ExecQuery=Open?
← →
turbouser © (2007-12-11 09:44) [28]
> Sergey13 © (11.12.07 09:00) [27]
У pFIBQuery Open - это свойство.
← →
wipr (2007-12-11 20:08) [29]
> > 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 20:54) [30]
> wipr (11.12.07 20:08) [29]
Проверял на 1.5.1.4481 - не глючит.
Где-то у тебя CHARSET все-таки не прописан.
Попробуй сделать новый проект, накидай на форму
pFibDataBase, pFibTransaction, pFibQuery - выставь
все необходимые свойства и проверь.
← →
Desdechado © (2007-12-12 08:49) [31]:USERNAME="USER"
проходит без ошибки.
В IBConsole
SELECT * FROM SANCTION WHERE USERNAME="Администратор"
ошибка есть
Это однозначно несовпадение чарсетов.
Страницы: 1 вся ветка
Текущий архив: 2008.05.18;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.079 c