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

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

непонятный


den777 ©   (2004-01-27 15:31:00) 

В таблице поле объявлено как CHAR(20).Может принимать значение NULL.Если в этом поле записана пустота, т.е. не NULL а именно пустота, то BDE и FibPlus на AsString у этого поля и возвращают пустоту т.е. "", а при использовании DbExpress AsString возвращает " ", т.е. непонятно откуда взявщийся пробел. Если в поле что-то записано или оно NULL, то все работает как и должно быть.Если посмотреть по кодам Delphi, то пробел возвращается в строке 3364 файла SqlExpr.При подключении у SqlConnection параметр Trim Char установлен в True. Возникновение ненужного пробела - это ошибка конкретной реализации Dbexpressовского драйвера под Interbase(dbexpint.dll) или в чем-то другом? Есть ли какой-то разумный выход из данной ситуации.


den777   (2004-01-27 17:08:00) [1]

Может кому пригодится.Выглядит это примерно так:
TQryDbx = class(TSqlQuery)
public
function GetFieldData(FieldNo: Integer; Buffer: Pointer): Boolean; overload; override;
end;

function TQryDbx.GetFieldData(FieldNo: Integer;
Buffer: Pointer): Boolean;
begin
result:=inherited GetFieldData(FieldNo,Buffer);
if ( ( Fields[FieldNo-1].DataType=ftString ) and
( strlen(Buffer)=1 ) and ( StrPas(Buffer)=" " ) ) then
StrPcopy(buffer,"");
end;

Если где-то не прав, поправьте.


den777   (2004-01-27 16:55:00) [2]

Вопрос снят, действительно просто пробел в InterBase в поле записать нельзя, так что " " это тоже самое что и "".Остается переписать(перекрыть) нужный метод у TSqlQuery.Ступил немного.Бывает.


Johnmen   (2004-01-27 16:47:00) [3]

>den777

Если поле CHAR, то оно дополнено справа пробелами до размерности.
И какая м.б. смысловая нагрузка на пробел в конце ? :)))))


Sandman25   (2004-01-27 16:28:00) [4]

[6] den777 (27.01.04 16:13)

Вряд ли можно что-то сделать. О значении поля ничего не известно. Если бы знать длину, то можно было бы как-то выкрутиться. Но она неизвестна.


den777   (2004-01-27 16:13:00) [5]

строка 3364:Status:=FSQLCursor.GetString(FieldNo,Buffer,FBlank);
FSQLCursor = Interface и вызывает Getstring скорее всего из DbExpressовского драйвера dbexpint.dll, исходников которого у меня нет и подправить в котором я к сожалению ничего не могу. При работе с VARCHAR действительно все нормально, но база существует давно, и неизвестно всплывут ли еще какие-либо гадости если грубо переправить в базе все CHAR на VARCHAR. Но как вариант принять можно, но только в самую последнюю очередь.


Sandman25   (2004-01-27 15:59:00) [6]

[4] Sandman25 © (27.01.04 15:57)

Упс. Не посмотрел на версию Delphi. Что в строке 3364 происходит?


Sandman25   (2004-01-27 15:57:00) [7]

>Есть ли другие варианты

Изменить SqlExpr.pas и соответственно dbrtl.bpl.
Я так и сделал однажды. Правда, потом вернул все на место.
Судя по строке 3364, Вы работаете с Blob. Тогда зачем использовать AsString? Читайте из BlobStream.


VAleksey   (2004-01-27 15:56:00) [8]

не использовать char(20).
используй varchar, например.


den777   (2004-01-27 15:43:00) [9]

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


Sandman25   (2004-01-27 15:37:00) [10]

Я пишу select trim(myfield) from mytable.


Наверх

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