Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.015 c
14-53768
Andryk
2004-01-27 18:46
2004.02.17
HELP! Мож кто знает или умеет сам?


1-53505
Goblinus
2004-02-05 21:20
2004.02.17
Получение доступа к свойствам формы по её имени


7-53795
revo
2003-12-02 17:14
2004.02.17
crc16 и modbus


3-53418
gedd
2004-01-24 07:41
2004.02.17
Конвертация из текстовой базы в Access mdb?


9-53354
lokid7
2003-08-03 15:57
2004.02.17
Вывод в DirectX




   Наверх