Форум: "Базы";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Внизнепонятный Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c