Графика и mssql
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 24.05.03 08:34
Оценка: 31 (7)
#Имя: FAQ.db.mssql.blobs
yus> Много чего написано про mssql, но ни где не могу найти как занести в базу графический файл (каритинку) и как его потом прочитать (вывести на экран).
yus> Помогите, плиз, решить эту проблему, кто уже разобрался!!!
yus> Заранее благодарен!

Да, написано не мало.
Двоичные данные в MS SQL Server'е представлены двумя типами: image и text. Первый предназначен для хранения совсем двоичных данных, второй для хранения больших массивов текстовой информации (если текст нужно хранить в unicode, используй ntext).
Не будем рассматривать как сервер хранит данные и какие функции существуют для работы с ними в T-SQL, если очень интересно, см. TEXTPTR, READTEXT и проч.
Помещать и извлекать данные будем с помощью ADO и его объекта Stream, затем рассмотрим методы GetChunk и AppendChunk объекта Field. Примеры, для простоты, на VB. Ок? Допустим поле называется img.
Запись
Dim rs as New ADODB.Recordset
Dim s as New ADODB.Stream
Dim c as New ADODB.Connection
'тут открываем соедуние с базой
'открываем рекордсет
rs.Open "select img from [table] where id = ...", c, adOpenKeyset, adLockOptimistic
'подготавливаем stream
s.Type = adTypeBinary
s.Open
s.LoadFromFile "C:\Winnt\winnt.bmp"
'связываем stream с полем
rs.Fields("img") = s.Read
'заливаем в базу
rs.Update


Для чтения blob'а выполняем примерно туже последовательность:
Dim rs as New ADODB.Recordset
Dim s as New ADODB.Stream
Dim c as New ADODB.Connection
'тут открываем соедуние с базой
'открываем рекордсет
rs.Open "select img from [table] where id = ...", c, adOpenKeyset, adLockOptimistic
'подготавливаем stream
s.Type = adTypeBinary
s.Open
s.Write rs.Fields("img")
'здесь и SaveToFile можно сделать


Так, теперь другой способ, более старый и не модный.
Dim rs as New ADODB.Recordset
Dim c as New ADODB.Connection
Dim v as Variant
'тут открываем соедуние с базой
'открываем рекордсет
rs.Open "select img from [table] where id = ...", c, adOpenKeyset, adLockOptimistic
Open "C:\winnt\winnt.bmp" For Binary Access Read as #1
'тут я могу напутать
Get #1,,v
Close #1
rs.Fields("img").AppendChunk = v
rs.Update


Вроде так. Для считывания данных применяется метод GetChunk.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.