使用FILESTREAM从数据库中写入和读取图像

时间:2011-05-14 06:48:05

标签: sql-server-2008 vb6 filestream

我在SQL SERVER 2008中创建了数据库并启用了文件流技术。现在,如何从vb 6.0将映像保存到SQL Server。我对文件流的数据库查询如下:

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 :(得分:0)

您无法更新IDENTITY列,因此请删除UniqueId字段上的分配,现在确定无效。

访问BLOB列时PhotoFile有时有助于明确使用Value对象的Field属性,即Rs!PhotoFile.Value = binaryDataRs("PhotoFile").Value = binaryData

答案 1 :(得分:0)

对于具有一个或多个FILESTREAM列的表,它还必须具有具有ROWGUIDCOL属性的uniqueidentifier数据类型的列。你在问题中粘贴的CREATE TABLE语句是否有效?