Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

непонятный   Найти похожие ветки 

 
den777   (2004-01-27 15:31) [0]

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


 
Sandman25 ©   (2004-01-27 15:37) [1]

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


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

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


 
VAleksey ©   (2004-01-27 15:56) [3]

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


 
Sandman25 ©   (2004-01-27 15:57) [4]

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

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


 
Sandman25 ©   (2004-01-27 15:59) [5]

[4] Sandman25 © (27.01.04 15:57)

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


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

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


 
Sandman25 ©   (2004-01-27 16:28) [7]

[6] den777 (27.01.04 16:13)

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


 
Johnmen ©   (2004-01-27 16:47) [8]

>den777

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


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

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


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

Может кому пригодится.Выглядит это примерно так:
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;

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



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.024 c
6-53683
Глупый ламер
2003-12-15 16:13
2004.02.17
Как узнать свой IP адрес?


1-53458
Эдуард
2004-02-08 16:26
2004.02.17
Есть ли возможнось узнать есть ли у класса A public-свойство B?


1-53532
kirilln
2004-02-05 14:38
2004.02.17
общение delphi -> c++


7-53791
DNS
2003-11-26 22:22
2004.02.17
TRegistry and WriteBinaryData


6-53687
nyc
2003-12-15 12:09
2004.02.17
TServerSocket