Страница 1 из 1

GUID и "пустые" поля в таблице

Добавлено: 25 ноя 2005, 11:23
Ragazor
При генерации GUID в таблицу, примерно 3-5 значений на 1000(каждый раз разное ко-во) в таблице не отображаются визуально никакими символами, тоесть на вид в ячейке пусто.

В программе есть необходимость делать SAVETOFILE, (TpFIBDataSet)
При считываини LOADFROMFILE получаются глюки с "пустыми" полями.
Для тестов создал набор данных куда записываю текстовый эквивалент GUID, так вот сохранение такого набора там где эти "пустые" строки дает {00000000-0000-0000-0000-000000000000}, что значит что GUID = 0 условно.
Хотя на этапе генерции GUIDов ставил проверку:
If GUIDToStr(tmpG) = '{00000000-0000-0000-0000-000000000000}' then
MsgError('bla bla bla');
Вообщем нулевых нет. В мемку пихал, нулевых нет.(ну так и должно быть собственно)

Вызов UDF в IB (2005.04.24) CREATEGUID тоже даёт такие "пустые" поля, со всеми вытекающими отсюда последствиями.

Если это не глюки сервера, то как можно обойти данную проблему?
Может есть альтернативный вариант операций с гуидами?

Delphi6, Firebird 1.5

Добавлено: 25 ноя 2005, 13:38
Dimitry Sibiryakov
А CHARACTER SET BINARY или OCTETS для гуидного поля поставил? Что дает isql для "пустых" полей? Если он дает хоть что-то, пинай Сержа на предмет работы со значениями, включающими #0.

Добавлено: 25 ноя 2005, 13:41
Ragazor
CREATE DOMAIN FIB$GUID AS
CHAR(16) CHARACTER SET OCTETS
COLLATE OCTETS
...

>>Что дает isql для "пустых" полей?

незнаю о чем это.


Если он дает хоть что-то, пинай Сержа на предмет работы со значениями, включающими #0.

Кто такой Серж тоже незнаю :)
как его "пинать" ? :)

Добавлено: 25 ноя 2005, 14:43
Dimitry Sibiryakov
isql это такая консольная клиентская утилита, позволяющая выполнять запросы к БД. В данном случае она полезна тем, что корректно отобразает в шестнадцатиричном виде поля типа OCTETS. Если она показывает в "пустом" поле что-то кроме нулей, значит FIB+ некорректно работает с полями содержащими нулевой символ (что, впрочем, маловероятно). Если же там действительно полные нули, то виновата твоя процедура генерации GUID и занесения его в базу.
Серж Востриков - текущий разработчик FIB+. Пинать его лучше по почте. Но очень аккуратно и лучше всего с тестовым примером (или того лучше - патчем) как и любого другого разработчика.

Добавлено: 25 ноя 2005, 15:00
Ragazor
Скажем так,
QWSQL.SQL.Text := "INSERT INTO NEW_TABLE (GUID) VALUES(:G)";
for i := 1 to 5000 do begin
CreateGUID(tmpG);
QWSQL.ParamByName('G').AsGUID:= tmpG;
QWSQL.ExecQuery;
end;
QWSQL.Transaction.Commit;
ошибиться тут невозможно.

тот же результат дает вызов хранимой процедуры вида:

CREATE PROCEDURE NEW_PROCEDURE (
PTIMES INTEGER)
AS
DECLARE VARIABLE I INTEGER;
begin
i = 0;
While (i < :ptimes) do begin
INSERT INTO new_table (GUID)
VALUES (CREATEGUID(1));
i = i+1;
end
end


Где можно найти эту утилиту?
и собственно мыло господина Серж?

Добавлено: 25 ноя 2005, 15:14
Dimitry Sibiryakov
Ragazor писал(а): VALUES (CREATEGUID(1));
А вот тут я не уверен. Не факт что нулевые символы корректно передаются из UDF в движок. Помнится, Клавдий довольно долго там копался, ругаясь на чем свет стоит...
Ragazor писал(а): Где можно найти эту утилиту?
Каталог bin сервера.
Ragazor писал(а): и собственно мыло господина Серж?
Что, нынче FIB+ идет без документации или в ней нет пункта как докладывать о багах? Тогда поищи на сайте www.devrace.com

Добавлено: 25 ноя 2005, 16:01
Ragazor
>>Что, нынче FIB+ идет без документации или в ней нет пункта как докладывать о багах?

я как-то употребил слово "Баг" сервера, так меня съели с потрохами.
уже боюсь :)

Добавлено: 27 ноя 2005, 17:41
kdv
правильно боишься. Для того чтобы утверждать, что где то баг, надо сначала убедиться в том, что это действительно баг, причем в конкретном месте. До этого это не "баг" а всего лишь глюки в твоей программе.