ОБСУЖДЕНИЕ

Работа с Blob

1 ответов 6,3 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
имеется MS SQL 2000, имеется приложение, которое используется некую библиотеку DLL, доставшуюся мне "в наследство" от предыдущего разработчика. В этой библиотеке есть класс Connector, возвращающий некий класс TRecordset при выполнении текстового запроса. Всё, что я могу, это передавать строку-SQL запрос и получать в ответ TRecordset, в которой к полям можно обращаться подобно обычным объектам ADO, т.е. есть такие методы для получения данных
function FieldValue(const Index: integer): Variant;
function Fields(const Index: integer): Variant;
function FieldByName(const FieldName: string): Variant;
function FindField(const FieldName: string): Variant;
function Field(const Index: integer): Variant; overload;
function Field(const FieldName: string): Variant; overload;
function Value(const Index: integer): Variant; overload;
function Value(const FieldName: string): Variant; overload;
function FieldIndex(const FieldName: string): integer;
function FieldExists(const FieldName: string): boolean;

я всё это время пользовался Value(const FieldName: string), обращаясь по имени к полю. Появилась задача чтения и записи данных в базу данных большого размера. Так как я могу составлять только строку запроса, без возможности передавать туда параметры типа BLOBField и т.д., я сделал запись через составление большой строки запроса, основную часть которой составляет BLOB-строка данных, теперь возникает проблема чтения этой BLOB-строки (в поле Res), например, такой способ не работает
TBlobStream.Create(( TRecordset.FieldByName('Res')) as TBlobField,bmRead);
Есть еще метод FieldAddress(const Name: ShortString): Pointer, который берется аж из стандартного System , достался от TObject.
свой Variant я никак не могу привести к типам из ADO, мне подойдет любой вариант, даже прямое обращение к памяти, есть варианты?
 
имеется MS SQL 2000
/// вырезано ///
Есть еще метод FieldAddress(const Name: ShortString): Pointer, который берется аж из стандартного System , достался от TObject.
свой Variant я никак не могу привести к типам из ADO, мне подойдет любой вариант, даже прямое обращение к памяти, есть варианты?
Пойди туда, не знаю куда... :)
Я так понимаю исходников (от предыдущего разработчика) у Вас не имеется?
В таком случае посоветовать сложно что нибудь толковое... разве что к экстрасенсу обратиться... :) (шутка).
Единственное, могу сказать следующее: Если бы мне (вдруг) пришлось писать такую ДЛЛ-ку и мне потребовалось бы (пришло бы на ум) вставить такой "жесткий" метод как
Код:
FieldAddress(const Name: ShortString): Pointer
Тем самым я бы подразумевал следующее:
1. Принять на входе (как параметр) имя поля.
2. Определить тип данных соответствущий данному полю.
3. Если поле не пустое -> вернуть адрес начала данных.
Если поле не инициализировано (nil) -> выделить память (в соответствии с типом) -> вернуть адрес начала данных.
К примеру для строкового поля длиной 10 было бы что то типа
Код:
var
SP: PChar;
//...
GetMem(SP, (10+1)*SizeOf(Char)); //под строку 10 символов + завершающий #0
Result := SP;
//...
И... в случае с блоб полем (чисто логика подсказывает) тогда я бы написал что то типа
Код:
var
BP: TBlobField;
//...
BP := TBlobField.Create(DataSet);
Result := BP;
А может пошел бы еще дальше:
Код:
var
BS: TBlobStream;
//...
BS := TBlobStream.Create(TableField, bmRead);
//...
Result := BS;
Не пробовали покурить в таком "контексте"?
А не проще кстати разыскать "предыдущего разработчика" и покурить с ним? ;)