Использование FILESTREAM для записи и чтения изображения из базы данных - PullRequest
0 голосов
/ 14 мая 2011

Я создал базу данных в SQL SERVER 2008 и включил технику файлового потока. Теперь, как я могу сохранить изображение на SQL Server с версии 6.0. Мой запрос к базе данных для файлового потока выглядит следующим образом:

CREATE DATABASE Photo;

GO

ALTER DATABASE Photo
ADD FILEGROUP PhotoDBFS CONTAINS FILESTREAM;

GO

DECLARE @FilePath varchar(MAX) = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf',     LOWER(physical_name)) - 1)
              FROM master.sys.master_files
              WHERE database_id = 1 AND file_id = 1) + 'PhotoDBFS_Filestream';


DECLARE @SQL varchar(MAX) = '
ALTER DATABASE Photo ADD FILE (
   NAME = PhotoDBFSFile,
   FILENAME = ''' + @FilePath + ''')
TO FILEGROUP PhotoDBFS;';
EXECUTE(@SQL);

GO

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

CREATE TABLE Photos
(
PhotoId                 bigint                      NOT NULL PRIMARY KEY IDENTITY(1,1),
Title                   varchar(100)                NOT NULL DEFAULT(''),
Subject                 varchar(100)                NOT NULL DEFAULT('No Subject'),
Place                   varchar(100)                NOT NULL DEFAULT('Unknown'),
Comment                 varchar(1000)                   NULL DEFAULT(''),
Rating                  tinyint                     NOT NULL DEFAULT(0),
PhotoFile               varbinary(MAX)  FILESTREAM  NOT NULL,
CONSTRAINT PhotoRatingCheck CHECK(Rating >=0 AND Rating<=10)
);

Мой VB-код для сохранения изображения выглядит следующим образом:

'Saving in the table [Photos]
Set Rs = New Recordset
SqlString = "SELECT * FROM Photos"
Rs.Open SqlString, con, adOpenStatic, adLockOptimistic, adCmdText
Rs.AddNew
    Rs("UniqueId") = txtUniqueId.Text
    Rs("CategoryId") = tempCategoryId
    Rs("AlbumId") = tempAlbumId
    Rs("Title") = txtTitle.Text
    Rs("Subject") = txtSubject.Text
    Rs("Place") = txtPlace.Text
    Rs("Comment") = txtComment.Text
    Rs("Rating") = sliderRating.Value
    Rs("PhotoFile") = PhotoLocation
Rs.Close
Set Rs = Nothing

Я получаю эту ошибку при сохранении. Многошаговая операция OLE DB вызвала ошибки. проверьте каждое значение состояния OLE DB, если оно доступно. Работы не было сделано.

Я также хочу прочитать сохраненное изображение из базы данных. Любое предложение ???

Ответы [ 2 ]

0 голосов
/ 22 мая 2011

Чтобы таблица имела один или несколько столбцов FILESTREAM, в ней также должен быть столбец типа данных uniqueidentifier с атрибутом ROWGUIDCOL. Работает ли оператор CREATE TABLE, который вы вставили в вопрос, даже?

0 голосов
/ 14 мая 2011

Вы не можете обновить IDENTITY столбцы, поэтому удалите назначение в поле UniqueId, теперь это наверняка не удастся.

При доступе к столбцу BLOB PhotoFile иногда помогает явным образом использовать свойство Value объекта Field, т.е. Rs!PhotoFile.Value = binaryData или Rs("PhotoFile").Value = binaryData

...