1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
Скрыть объявление

Уважаемый Гость, в 23:30 по мск форум будет закрыт на профилактику на 1,5 часа до 01:00 24.10.2017

Работа с Blob

Тема в разделе "Delphi - Базы данных", создана пользователем blackswanny, 5 июл 2010.

  1. blackswanny

    blackswanny Гость

    Репутация:
    0
    имеется 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, мне подойдет любой вариант, даже прямое обращение к памяти, есть варианты?
     
  2. sinkopa

    sinkopa Well-Known Member

    Репутация:
    0
    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Пойди туда, не знаю куда... :)
    Я так понимаю исходников (от предыдущего разработчика) у Вас не имеется?
    В таком случае посоветовать сложно что нибудь толковое... разве что к экстрасенсу обратиться... :) (шутка).
    Единственное, могу сказать следующее: Если бы мне (вдруг) пришлось писать такую ДЛЛ-ку и мне потребовалось бы (пришло бы на ум) вставить такой "жесткий" метод как
    Код:
    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;
    Не пробовали покурить в таком "контексте"?
    А не проще кстати разыскать "предыдущего разработчика" и покурить с ним? ;)
     
Загрузка...

Поделиться этой страницей