Помогите, пожалуйста, те кто знает и кто пробовал.
Возникла необходимость сохранять в базу FireBird1/ODBC JPEG-картинки. Все это легко делать через BLOB-поля, но нужно сохранять эти картинки в поля типа VARCHAR(32000). И не только сохранять, но и соответственно извлекать.
Проблема одна, в JPEG-файле присутствуют нулевые символы CHR(0), а Delphi7 воспринимет первый же нулевой символ, как кнец строки и прекращает обработку хвоста строки. Вопрос, как добиться чтобы Delphi записал в базу данных длинную строку с нулевыми символами в середине, и как извлечь эту строку из базы данных в файл?
Помогите кто сталкивался с этим. Пожалуйста, приведите конкретный пример кода. Я уже многое перепробовал, но ничего не получается.
Re: символ CHR(0) в середине длинной строки, FireBird1/ODBC
Вообще необходимость странная — имхо, проще найти способ сделать правильно.
Если таки хочется в лоб — полагаю, надо плясать от того факта, что в AnsiString в принципе можно впихнуть нулевые символы. У AnsiString есть длина (которая устанавливается, например, SetLength) и есть содержимое (которое, в принципе, может содержать нули внутри). Вопрос в том — как идет работа с этими данными; код, который ориентируется на результат функции Length — работает. То есть, если Вы сформируете строку через SetLength/Move, а потом присвоите ее полю — может сработать.
Re[2]: символ CHR(0) в середине длинной строки, FireBird1/OD
Здравствуйте, Softwarer, Вы писали:
S>Здравствуйте, Grinin, Вы писали:
S>Вообще необходимость странная — имхо, проще найти способ сделать правильно.
S>Если таки хочется в лоб — полагаю, надо плясать от того факта, что в AnsiString в принципе можно впихнуть нулевые символы. У AnsiString есть длина (которая устанавливается, например, SetLength) и есть содержимое (которое, в принципе, может содержать нули внутри). Вопрос в том — как идет работа с этими данными; код, который ориентируется на результат функции Length — работает. То есть, если Вы сформируете строку через SetLength/Move, а потом присвоите ее полю — может сработать.
не в ту сторону копаем имхо...
насколько я помню ODBC, там есть 2 варианта как передавать строку
БиндЧегоТоТам(ХендлСтейтмента, НомерПараметра, Тип, ...., УказательНаДанные,
а вот дальше:
1. -3 (мо-моему) до нул-терминейта
2. длина строки
ну или там 0 — это и есть нулл-валюе... (т.е. для того чтобы указать нул, не нужно чтобы данные были нул — нужна нулевая длина)...
так что тут делфи ни при чем впрочем как и птица и ODBC.
смотри свою реализацию Bind....
Best regards,
Oleg A. Bachin
Re: символ CHR(0) в середине длинной строки, FireBird1/ODBC
От:
Аноним
Дата:
21.12.04 15:05
Оценка:
Как вариант можно вручную перекодировать в строковое представление.
тогда 2 байта 0xFF,0x00
будут сконвертированы в 4-х символьную строку "FF00"
Re: символ CHR(0) в середине длинной строки, FireBird1/ODBC
Здравствуйте, Grinin, Вы писали:
G>Проблема одна, в JPEG-файле присутствуют нулевые символы CHR(0), а Delphi7 воспринимет первый же нулевой символ, как кнец строки и прекращает обработку хвоста строки. Вопрос, как добиться чтобы Delphi записал в базу данных длинную строку с нулевыми символами в середине, и как извлечь эту строку из базы данных в файл?
Для этого в e-mail давно уже придумано решение- кодировать бинарные файлы например в MIME BASE64 или UUE, на выходе получается обычный текст. Процедуры легко можно найти на google.