хранение файлов в sql server 2008 с использованием опции filestream - PullRequest
1 голос
/ 24 июня 2011

Я использую приложение asp.net mvc 2 для загрузки файлов и их хранения на сервере SQL Server 2008 г. дБ. Я хотел бы использовать опцию файлового потока. У кого-нибудь есть примеры кода для этого?

1 Ответ

2 голосов
/ 24 июня 2011

SQL часть:

-- Enable the FileStream Feature
EXEC sp_configure filestream_access_level, 2
GO
RECONFIGURE
GO


--Create a special file group and mark it as a stream
CREATE DATABASE FileStreamExample
ON
PRIMARY ( 
    NAME = FileStreamExample_Primary,
    FILENAME = 'c:\Data\FileStreamExample.mdf'),
FILEGROUP FileStreamGroup CONTAINS  FILESTREAM ( 
    NAME = FileStreamExample_FileGroup,
    FILENAME = 'c:\Data\FileStreamExample')
LOG ON ( NAME = FileStreamExample_Log,
    FILENAME = 'c:\Data\FileStreamExample.ldf')
GO

USE FileStreamExample
GO

CREATE TABLE Product
(
  ProductID INT  NOT NULL  PRIMARY KEY,
  Name VARCHAR(50) NOT NULL,
  Picture VARBINARY(MAX) FILESTREAM  NULL,
  RowGuid UNIQUEIDENTIFIER  NOT NULL  ROWGUIDCOL
  UNIQUE DEFAULT NEWID()
)
GO

Insert into Product
Values(1, 'Bicycle', 0x00, default)
GO

Select * From Product

Часть C #: напишите файл

   string connectionString = ConfigurationManager.ConnectionStrings["fileStreamDB"].ConnectionString;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        //Get the PathName of the File from the database
        command.CommandText = "SELECT Picture.PathName(), "
        + "GET_FILESTREAM_TRANSACTION_CONTEXT() FROM Product WHERE ProductID = 1";
        SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
        command.Transaction = transaction;
        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                string path = reader.GetString(0);
                SqlFileStream stream = new SqlFileStream(path,
                    (byte[])reader.GetValue(1), FileAccess.Write,
                    FileOptions.SequentialScan, 0);                        
                string contents = txtInput.Text;                        
                stream.Write((System.Text.Encoding.ASCII.GetBytes(contents)), 0, contents.Length);
                stream.Close();
            }
        }
        transaction.Commit();
    }

Часть C #: чтение файла

      string connectionString = ConfigurationManager.ConnectionStrings["fileStreamDB"].ConnectionString;                
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            SqlCommand command = new SqlCommand();
            command.Connection = connection;
            //Get the PathName of the File from the database
            command.CommandText = "SELECT Picture.PathName(), "
            + "GET_FILESTREAM_TRANSACTION_CONTEXT() FROM Product WHERE ProductID = 1";
            SqlTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
            command.Transaction = transaction;
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {                        
                    string path = reader.GetString(0);                        
                    SqlFileStream stream = new SqlFileStream(path,
                        (byte[])reader.GetValue(1),FileAccess.Read,FileOptions.SequentialScan, 0);                        
                    lstResults.Items.Clear();
                    int length = (int) stream.Length;
                    byte[] contents = new byte[length];
                    stream.Read(contents,0,length);                     
                    string results = System.Text.Encoding.ASCII.GetString(contents);
                    lstResults.Items.Add(results);
                    stream.Close();
                }
            }
            transaction.Commit();
        }
...