FILESTREAM 저장소를 설계 및 구현하기 위한 SQL Server FileStream 함수에 대한 자세한 참조 온라인 도움말
다음은 Win32를 사용하여 FILESTREAM 데이터를 관리하여 더 큰 파일에 액세스하는 데 더 의미 있는 고급 액세스를 달성하는 코드를 조정한 것입니다.
FileStream을 사용하려면 먼저 SQL Server 구성 관리자에서 FileStream 옵션을 설정합니다. SQL Server 구성 관리자 – SQL Server 서비스 – SQL Server 서비스 찾기 – 속성 – FILESTREAM – 오른쪽 서비스 목록에서 필요에 따라 원격 클라이언트가 FILESTREAM 데이터에 액세스하도록 허용합니다. 다른 권장 사항을 모두 선택하고 선택하세요. 구성이 완료된 후 설정을 적용하려면 SQL Server 서비스를 다시 시작해야 합니다.
그런 다음 다음 스크립트를 사용하여 테스트 데이터베이스와 테스트 테이블을 만듭니다.
-- =========================================================-- 启用 filestream_access_level-- =========================================================EXEC sp_configure 'filestream_access_level', 2; -- 0=禁用 1=针对 T-SQL 访问启用 FILESTREAM 2=针对 T-SQL 和 WIN32 流访问启用 FILESTREAMRECONFIGURE; GO-- =========================================================-- 创建测试数据库-- =========================================================EXEC master..xp_create_subdir 'f:\temp\db\_test';CREATE DATABASE _testON PRIMARY( NAME = _test, FILENAME = 'f:\temp\db\_test\_test.mdf'), FILEGROUP FG_stream CONTAINS FILESTREAM( NAME = _test_file_stream, FILENAME = 'f:\temp\db\_test\stream') LOG ON( NAME = _test_log, FILENAME = 'f:\temp\db\_test\_test.ldf') ;GO-- =========================================================-- FileStream-- =========================================================-- =================================================-- 创建 包含 FileStream 数据的表-- -------------------------------------------------CREATE TABLE _test.dbo.tb_fs( id uniqueidentifier ROWGUIDCOL -- 必需 DEFAULT NEWSEQUENTIALID ( ) PRIMARY KEY, name nvarchar(260), content varbinary(max) FILESTREAM );GO
下面的 VB 脚本实现带进度显示的文件存(Write方法)取(Read方法)
Imports System.IO Imports System Imports System.Collections.Generic Imports System.Text Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Module Module1 Public Sub Main(ByVal args As String()) Dim sqlConnection As New SqlConnection("Integrated Security=true;server=localhost") Try sqlConnection.Open() Console.WriteLine("将文件保存到 FileStream") Write(sqlConnection, "test", "f:\temp\re.csv") Console.WriteLine("从 FileStream 读取数据保存到文件") Read(sqlConnection, "test", "f:\temp\re_1.csv") Catch ex As System.Exception Console.WriteLine(ex.ToString()) Finally sqlConnection.Close() End Try Console.WriteLine("处理结束,按 Enter 退出") Console.ReadLine() End Sub ''' <summary> ''' 将文件保存到数据库 ''' </summary> ''' <param name="conn">数据库连接</param> ''' <param name="name">名称</param> ''' <param name="file">文件名</param> Sub Write(ByVal conn As SqlConnection, ByVal name As String, ByVal file As String) Dim bufferSize As Int32 = 1024 Using sqlCmd As New SqlCommand sqlCmd.Connection = conn '事务 Dim transaction As SqlTransaction = conn.BeginTransaction("mainTranaction") sqlCmd.Transaction = transaction '1. 读取 FILESTREAM 文件路径 ( 注意函数大小写 ) sqlCmd.CommandText = " UPDATE _test.dbo.tb_fs SET content = 0x WHERE name = @name; IF @@ROWCOUNT = 0 INSERT _test.dbo.tb_fs(name, content) VALUES( @name, 0x ); SELECT content.PathName() FROM _test.dbo.tb_fs WHERE name = @name;" sqlCmd.Parameters.Add(New SqlParameter("name", name)) Dim filePath As String = Nothing Dim pathObj As Object = sqlCmd.ExecuteScalar() If Not pathObj.Equals(DBNull.Value) Then filePath = DirectCast(pathObj, String) Else Throw New System.Exception("content.PathName() failed to read the path name for the content column.") End If '2. 读取当前事务上下文 sqlCmd.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()" Dim obj As Object = sqlCmd.ExecuteScalar() Dim txContext As Byte() = Nothing Dim contextLength As UInteger If Not obj.Equals(DBNull.Value) Then txContext = DirectCast(obj, Byte()) contextLength = txContext.Length() Else Dim message As String = "GET_FILESTREAM_TRANSACTION_CONTEXT() failed" Throw New System.Exception(message) End If '3. 获取 Win32 句柄,并使用该句柄在 FILESTREAM BLOB 中读取和写入数据 Using sqlFileStream As New SqlFileStream(filePath, txContext, FileAccess.Write) Dim buffer As Byte() = New Byte(bufferSize - 1) {} Dim numBytes As Integer = 0 Using fsRead As New FileStream(file, FileMode.Open) While True numBytes = fsRead.Read(buffer, 0, bufferSize) If numBytes = 0 Then Exit While sqlFileStream.Write(buffer, 0, numBytes) Console.WriteLine(String.Format("{0} -> {1} -> {2}", fsRead.Position, sqlFileStream.Position, numBytes)) End While fsRead.Close() End Using sqlFileStream.Close() End Using sqlCmd.Transaction.Commit() End Using End Sub ''' <summary> ''' 从数据库读取数据保存到文件 ''' </summary> ''' <param name="conn">数据库连接</param> ''' <param name="name">名称</param> ''' <param name="file">文件名</param> Sub Read(ByVal conn As SqlConnection, ByVal name As String, ByVal file As String) Dim bufferSize As Int32 = 1024 Using sqlCmd As New SqlCommand sqlCmd.Connection = conn '1. 读取 FILESTREAM 文件路径 ( 注意函数大小写 ) sqlCmd.CommandText = "SELECT content.PathName() FROM _test.dbo.tb_fs WHERE name = @name;" sqlCmd.Parameters.Add(New SqlParameter("name", name)) Dim filePath As String = Nothing Dim pathObj As Object = sqlCmd.ExecuteScalar() If Not pathObj.Equals(DBNull.Value) Then filePath = DirectCast(pathObj, String) Else Throw New System.Exception("content.PathName() failed to read the path name for the content column.") End If '2. 读取当前事务上下文 Dim transaction As SqlTransaction = conn.BeginTransaction("mainTranaction") sqlCmd.Transaction = transaction sqlCmd.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()" Dim obj As Object = sqlCmd.ExecuteScalar() Dim txContext As Byte() = Nothing Dim contextLength As UInteger If Not obj.Equals(DBNull.Value) Then txContext = DirectCast(obj, Byte()) contextLength = txContext.Length() Else Dim message As String = "GET_FILESTREAM_TRANSACTION_CONTEXT() failed" Throw New System.Exception(message) End If '3. 获取 Win32 句柄,并使用该句柄在 FILESTREAM BLOB 中读取和写入数据 Using sqlFileStream As New SqlFileStream(filePath, txContext, FileAccess.Read) Dim buffer As Byte() = New Byte(bufferSize - 1) {} Dim numBytes As Integer = 0 Using fsRead As New FileStream(file, FileMode.Create) While True numBytes = sqlFileStream.Read(buffer, 0, bufferSize) If numBytes = 0 Then Exit While fsRead.Write(buffer, 0, numBytes) Console.WriteLine(String.Format("{0} -> {1} -> {2}", sqlFileStream.Position, sqlFileStream.Position, numBytes)) End While fsRead.Close() End Using sqlFileStream.Close() End Using sqlCmd.Transaction.Commit() End Using End Sub End Module
이 문서에서는 진행 상황과 함께 SQL Server FileStream에 액세스하는 방법을 설명합니다. 자세한 내용은 PHP 중국어 웹사이트를 참조하세요.
관련 권장 사항:
SQL Server 관리자 비밀번호를 잊어버린 경우 수행할 작업
MySQL의 concat 및 group_concat 사용에 대한 간략한 분석
위 내용은 진행 중인 SQL Server FileStream에 액세스하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!