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. |