Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];

Вниз

Работа с Blob   Найти похожие ветки 

 
kalinka   (2002-05-07 17:00) [0]

Расскажите мне пожалуйста, как производится считывание, запись и поиск по Blob полям. Никогда раньше с ними не работала, теперь надо в одном поле хранить большое количество информации, узнала про Blob, а с чем его едят не знаю. :)


 
TSV   (2002-05-07 20:09) [1]

Посмотрите функции по работе с типами данных ntext, text, and image в Books Online.

Удачи.


 
kalinka   (2002-05-08 17:58) [2]

Спасибо :)


 
Suntechnic   (2002-05-09 07:34) [3]

Поиска по BLOB-ам в природе не существует, так же как и не существует сравнения BLOB-ов.


 
Delirium   (2002-05-09 13:46) [4]

> Suntechnic

В общем, конечно, искать по BLOB нельзя, однако в MSSQL есть возможность поиска по полям типа text


 
Zak   (2002-05-10 09:16) [5]

А можно автогеном :))
через работу с каждой строкой Блоб поля... ниче быстро работетт между прочим :)


 
DmitryK   (2002-05-13 12:19) [6]

Я не совсем уверен, что правильно понял вопрос, но попробую ответить.

Во-первых в MSSQL нет BLOB-полей. Эти поля имеют тип TEXT. Для работы с ними через SQL запросы используются специальные функции (что бы произвести изменения в таком поле).

Если же тебе надо отсортировать записи, в которых встречаются определенные фрагменты текста то воспользуйся такой конструкцией
SELECT ... FROM ... WHERE TEXT_FIELD LIKE "%asddff%"

Ну и последнее, если тебе надо использовать эти данные в программе на Дельфе, то просто считывай эти поля в переменные типа String, и далее работай с ними как со строками.


 
Delirium   (2002-05-13 13:14) [7]

> DmitryK

"Во-первых в MSSQL нет BLOB-полей" а что-же такое Image тогда? Да и text, по структуре, тоже BLOB, просто в MSSQL добавлено немало эксклюзивных возможностей по работе с текстом, что выделяет этот тип из ряда BLOB.


 
DmitryK   (2002-05-13 14:03) [8]


> "Во-первых в MSSQL нет BLOB-полей" а что-же такое Image
> тогда? Да и text, по структуре, тоже BLOB, просто в MSSQL
> добавлено немало эксклюзивных возможностей по работе с текстом,
> что выделяет этот тип из ряда BLOB.


С таким же успехом я могу сказать что это МЕМО поля. Все зависит от того с какой базой ты привык работать и в терминах какого разработчика софта привык общаться.

В МССКЛ нет такого понятия БЛОБ, но есть ТЕКСТ и ИМАГЕ, и от того с какими именно данными человек хочет работать, можт зависить и ответ.

Поскольку девушка спросила, как работать с БЛОБ полями, я делаю вывод, что доступ ей к этим данным нужен именно из Дельфей. (т.к. в у Макрософта нет таких понятий)

Думаю, я понятно изложил свою мысль???


 
Serzhik   (2002-05-13 15:10) [9]

Но никто из вас так и не сказал как производится считывание, запись в BLOB. А мне тоже это очень интересно и актуально. :)


 
DmitryV   (2002-05-13 15:37) [10]

2 Serzhik (13.05.02 15:10):
Чтение:
Somestr:=DataSet.FieldByName("BLOBField").AsString;//or Value
запись в обратном порядке :-))

С уважением


 
Delirium   (2002-05-13 15:46) [11]

> DmitryK

"В МССКЛ нет такого понятия БЛОБ" - так, разберёмся в терминалогии, BLOB это Binary Large Object - Двоичный Большой Объект т.е. по MSSQL-вски большой varbinary коими и являются image и text, так что читай Help :)

> Serzhik

"считывание, запись в BLOB" - Help + TBLOBField


 
DmitryK   (2002-05-13 16:34) [12]


> "В МССКЛ нет такого понятия БЛОБ" - так, разберёмся в терминалогии,
> BLOB это Binary Large Object - Двоичный Большой Объект т.е.
> по MSSQL-вски большой varbinary коими и являются image и
> text, так что читай Help


Ну что ж, давай разбремся терминологии. Термин БЛОБ ввел, если не ошибаюсь Борланд, для своих баз Парадокс (возможно и ошибаюсь, но по-моему именно так). Однако задолго до парадоксовских таблиц появились DBF таблицы, где вообщем-то тоже имелись поля большого размера и назывались они МЕМО-полями. Но отличительной особенностью DBF таблиц было то, что вся информация в них хранилась в текстовом виде, даже числа, для этого при описании числовых полей указывалось сколько цифр будет в сохраняемых данных, сколько из них до запятой и сколько после.
Естественно это не совсем эффективно, и когда разрабатывались более новые СУБД, то такого рода информацию стали сохранять уже в виде набора байтов, где каждый байт описывал уже не текстовый вариант цифры, а учитывался непосредственно тот код, который он нес. Именно к таким базам относится и Парадокс (кроме всех прочих), и борландовский же Интербейз. Что бы подчеркнуть что эти поля могу содержать не только текстовую информацию, и то, что хранится она там именно в том виде как есть ее и назвали Большие Двоичные объекты.

Но что самое забавное - так то что Майкросфтовский тип VARBINARY не имеет отношения к БЛОБ полям. До версии 6.5 включительно, размер этого поля не мог превышать 255 символов, начная с 7 - 2000 символов (согласитесь - это не большой объект).



 
DmitryK   (2002-05-13 16:44) [13]

Да, кстати, на счет Help"а. В SQL Server Books Online есть возможность поиска, но на запрос BLOB выдается сообщение - The text you specified not found - что означает что такого термина в MSSQL попросту не существует.

А то, что этот термин исользутся в Делфях, так это уже совсем другая история. И для того что бы с ними работать далеко не всегда нужен TBLOBField. Все будет зависит от того, что же именно необходимо сделать, какими средствами (на каком уровне - приложение, сохраненная процедура, запрос...), версия сервера...


 
kalinka   (2002-05-13 16:44) [14]

спасибо всем, :)

вот, что я нашла:

запись в BLOB-поле большого текста (>255 байт):

var
S: TBlobStream;
B: pointer;
c: integer;
...
Table1.Edit;
S := TBlobStream.Create( Table1BlobField as TBlobField, bmWrite ); {кажется, так}
C := S.Write(B, C);
Table1.Post;
S.Destroy;

или так -

var
S: TMemoryStream;
B: pointer;
C: integer;
...
S := TMemoryStream.Create;
...
Table1.Edit;
S.Clear;
S.SetSize(C);
C := S.Write(B,C);
( Table1BlobField as TBlobField ).LoadFromStream( S );
S.Clear;
Table1.Post;
...
S.Destroy;




 
Delirium   (2002-05-13 16:49) [15]

> DmitryK

Не вдаваясь в смутные исторические дебри, обратимся к глоссарию MSSQL, и там видим :

binary large object
A piece of binary data that has an exceptionally large size (such as pictures or audio tracks stored as digital data), or any variable or table column large enough to hold such values. In Transact-SQL, a BLOB is stored in an image column. Sometimes the term BLOB is also applied to large character data values, such as those stored in text or ntext columns.

memo
A type of column containing long strings of text, typically more than 255 characters. This is the Access equivalent of a SQL Server text data type.

Таким образом, при разговоре о memo терин binary вообще не употребляется, а вот о BLOB написано много и внятно. Так что, IMHO, говорить: "В МССКЛ нет такого понятия БЛОБ" - более чем необосновано.
:)



 
Delirium   (2002-05-13 16:56) [16]

> kalinka

Можно и без Stream-а обойтись :)

Table1.Edit;
TBLOBField(Table1.FieldByName("MyField")).LoadFromFile("c:\my.mp3");
Table1.Post;


 
kalinka   (2002-05-13 17:15) [17]

Кстати, DmitryK, а не будет ли запись типа:
Somestr:=DataSet.FieldByName("BLOBField").AsString;//or Value
ошибкой?
Ведь String имеет ограниченную длину, а мне нужно считывать большой текст (более 255 символов).



 
Delirium   (2002-05-13 17:19) [18]

> kalinka

В Delphi макс.размер String-а - 2 гига.


 
kalinka   (2002-05-13 17:33) [19]

У меня конструкция Blob-поля такая:
Param1=<параметр1>;Param2=<параметр2>;Param3=<параметр3>;
Param4=<параметр4>;Param5=<параметр5>;Param6=<параметр6>;
.........................................................
ParamN=<параметрN>;
Если мне нужно исправить значение одного параметра, а остальные не трогать, то как это лучше сделать?

Сама проблема заключается в следующем:
Есть у меня множество пользователей, есть программа с которой они дружно работают. В этой программе можно настраивать всякие там дела типа размер окна, отображение кнопок, определенная последовательность полей таблицы, множественная сортировка, отборы и много еще всего. Попросили сделать так, чтобы все настройки сохранялись и при загрузке программы все настраивалось, как в последний раз. Сделала: сохранила все в *.ini Работает превосходно. Но... попросили сохранять все это непосредственно на сервере. Думала, думала, и придумала, что можно хранить это в табличке, в которой два поля:
<IdUser>, <MySettings>. Но так как настроек очень много, то и поле должно быть оч. большим. Вот и встал вопрос.
Если есть идеи получше, подскажите. :)


 
kalinka   (2002-05-13 17:36) [20]

> Delirium

Да, уже нашла. Вряд ли у меня длина текста будет длиннее 2Gb :)))


 
Delirium   (2002-05-13 17:50) [21]

Я бы сохранил INI-формат в text


 
kalinka   (2002-05-13 17:53) [22]

Скорее всего так и буду делать. Что-то другого ничего в голову не приходит.
Спасибо всем большое. :)

--- ---
(о) (о)
-оО0-(_)-0Оо-


 
kalinka   (2002-05-13 17:53) [23]

Ой :)


 
DmitryK   (2002-05-13 18:32) [24]

2Delirium - ладно, будем считать, что я безвозратно устарел и БЛОБ стало стандартом везде где можно о нем вспомнить.

2kalinka - как тут уже ответили, размер переменной типа Snring может достигать 2Гб если только ты не определила что транслятор должен оперировать по умолчанию с короткими строками (т.е. только 255 символов).

Как подсказывает мне мой опыт, вряд ли получится для такой задачи редактировать отдельные фрагменты такого поля. Значительно проще в программе полностью сфорировать новую строку (т.е. внести в старую необходимые изменения) и затем эту строку полностью пересохранить в таблице.

Я сам чаще пользуюсь компонентами типа TQuery нежели TTable и обычно рекомендую и другим делать то же самое. В таком случае запрос на сохранение новой конфигурации будет выглядеть примерно так:

Q.SQL.Add("UPDATE tab");
Q.SQL.Add("SET userparams="""+ParamsString+"""");
Q.SQL.Add("WHERE username=""XXXX"");
Q.ExecSQL;


Естественно что в переменно ParamsString все апострофы должны быть заменены на двойные апострофы.
Насколько я понимаю размер такой строки врядли будет превышать 10-20К. В таком случае этот код работает корректно - проверенно (на большИх размерах, например 0.5М такой код может работать с ошибками).

Если пользуешься компонентами типа TTable, то код ты уже сама приводила. Можно через потоки запихивать, а можно и без них обойтись, что нибудь типа ....AsString:=ParamsString;

Но я бы по другому организовывал бы сохранение данных. Насколько я понял из постановки задачи, надо что бы каждый Юзер сохранял ряд значений по размерам и положению окон. В таком случае, для каждого параметра значение будет целочисленной величеной. Может есть смысл организовать таблицу в таком виде :

User - varchar(25) - Имя пользователя
ParamName - varchar(25) - название параметра
ParamValue - int - значение параметра

Название параметра можно заменить и на код и использовать поле целочисленного типа, что в будущем сократит размеры таблицы. Но тогда надо будет помнить что каждый код значит (или просто записать где-нибудь это на бумажку).

Работать с такой структурой достаточно удобно (я отталкиваюсь от того, что работа будет вестись в первую очередь через SQL-запросы). Нет необходимости каждый раз разбирать сложную строку, а затем ее полностью пересохранять.


 
kalinka   (2002-05-14 09:47) [25]

>DmitryK

>Может есть смысл организовать таблицу в таком виде :
>User - varchar(25) - Имя пользователя
>ParamName - varchar(25) - название параметра
>ParamValue - int - значение параметра

Мне нужны настройки не только размеров и положений окон, но и полей, отображения их, порядка и уровня сортировки, отбор по полю с параметрами (пример: S.NGroup_Tvr Like "%комп%") и т.д.
А если у меня 150 пользователей, 52 поля и у каждого поля 8 параметров. Получается, что с такой структурой таблицы, которая предлагается, на каждого пользователя будет приходится 416 строк.
Можно, конечно, и так, но хотелось чего-то другого (покороче).



 
wicked   (2002-05-14 11:02) [26]


> А если у меня 150 пользователей, 52 поля и у каждого поля
> 8 параметров. Получается, что с такой структурой таблицы,
> которая предлагается, на каждого пользователя будет приходится
> 416 строк.
> Можно, конечно, и так, но хотелось чего-то другого (покороче).
>

разве это так критично?... ;)
зато у нас появилась возможность менять каждый параметр по отдельности, а концепция "настроек" программы стала резиновой - новые параметры хоть через 5 минут...
еще, в качестве полезной фишки, могу предложить сделать редактор настроек пользователя... реализовать будет достаточно просто и элегантно...


 
kalinka   (2002-05-14 12:24) [27]

> wicked

редактор настроек пользователя у меня уже реализован :)




Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.01 c
14-7227
mimino
2002-04-29 09:51
2002.06.03
спасибо ,но...


4-7268
Старик Бивис
2002-03-29 16:29
2002.06.03
Функция TreeView_GetItem - не могу добиться результата...


6-7157
Ghost.
2002-03-21 16:58
2002.06.03
Почтовая программа по умолчанию


14-7192
UDS
2002-04-23 21:07
2002.06.03
Как сделать форму не квадратной?


6-7138
torex
2002-03-19 22:32
2002.06.03
Хук как альтернатива при написании firewall`а





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский