带进度的SQL Server FileStream如何存取

SQL Server FileStream 功能的详细参考联机帮助设计和实现 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.IOImports SystemImports System.Collections.GenericImports System.TextImports System.DataImports System.Data.SqlClientImports System.Data.SqlTypesModule 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    '''     ''' 将文件保存到数据库    '''     ''' 数据库连接    ''' 名称    ''' 文件名    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    '''     ''' 从数据库读取数据保存到文件    '''     ''' 数据库连接    ''' 名称    ''' 文件名    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 SubEnd Module

本文讲解了带进度的SQL Server FileStream如何存取 ,更多相关内容请关注创想鸟。

相关推荐:

当忘记 SQL Server 管理员密码该如何处理

浅析MySQL中concat以及group_concat的使用

介绍MySQL图形化管理工具

以上就是带进度的SQL Server FileStream如何存取的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/786351.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何使用 composer config –global 持久化配置?
上一篇 2025年11月26日 12:02:57
红魔10S Pro斗战胜佛版真机亮相ChinaJoy:自带24K金箍棒!
下一篇 2025年11月26日 12:02:58

相关推荐

发表回复

登录后才能评论
关注微信