Работа с Blob

  • Автор темы blackswanny
  • Дата начала
B

blackswanny

Гость
#1
имеется 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, мне подойдет любой вариант, даже прямое обращение к памяти, есть варианты?
 

sinkopa

Well-Known Member
17.06.2009
344
9
#2
имеется 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;
Не пробовали покурить в таком "контексте"?
А не проще кстати разыскать "предыдущего разработчика" и покурить с ним? ;)