返回顶部
首页 > 资讯 > 数据库 >怎么存取带进度的SQL Server FileStream
  • 308
分享到

怎么存取带进度的SQL Server FileStream

2024-04-02 19:04:59 308人浏览 薄情痞子
摘要

小编给大家分享一下怎么存取带进度的SQL Server FileStream,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sql

小编给大家分享一下怎么存取带进度的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.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的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么存取带进度的SQL Server FileStream

本文链接: https://lsjlt.com/news/51814.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么存取带进度的SQL Server FileStream
    小编给大家分享一下怎么存取带进度的SQL Server FileStream,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL...
    99+
    2024-04-02
  • SQL Server中FileStream的作用是什么
    SQL Server中FileStream的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、FileStream配...
    99+
    2024-04-02
  • SQL Server ceiling怎么向上取小数
    这篇文章主要介绍“SQL Server ceiling怎么向上取小数”,在日常操作中,相信很多人在SQL Server ceiling怎么向上取小数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方...
    99+
    2024-04-02
  • SQL Server中怎么优化查询速度
    这期内容当中小编将会给大家带来有关SQL Server中怎么优化查询速度,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  优化SQLServer查询速度的方法有哪些  1...
    99+
    2024-04-02
  • SQL Server怎么配置cdc进行ETL
    这篇文章给大家分享的是有关SQL Server怎么配置cdc进行ETL的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。企业核心业务系统oltp的数据需要通过ETL同步到数据仓库,原始的ETL流程通过定制化从SQL ...
    99+
    2023-06-05
  • SQL SERVER中怎么调用存储过程
    这期内容当中小编将会给大家带来有关SQL SERVER中怎么调用存储过程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、SQL SERVER中调用不带输出参数的存储过程...
    99+
    2024-04-02
  • SQL Server中怎么实现分页存储
    本篇文章给大家分享的是有关SQL Server中怎么实现分页存储,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建数据库data_Test :...
    99+
    2024-04-02
  • SQL Server中怎么执行计划缓存
    SQL Server中怎么执行计划缓存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。基础概念SQL Server 有一个用于存储执行计划和数据...
    99+
    2024-04-02
  • ADO.NET sql server存储过程怎么调用
    这篇文章主要介绍“ADO.NET sql server存储过程怎么调用”,在日常操作中,相信很多人在ADO.NET sql server存储过程怎么调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ADO.N...
    99+
    2023-06-17
  • 怎样进行SQL Server的有效安装
    今天就跟大家聊聊有关怎样进行SQL Server的有效安装,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。微软总是试图使它的软件安装尽可能地简单顺畅,...
    99+
    2024-04-02
  • 怎么获取hive执行进度
    可以通过以下方法来获取Hive执行进度: 使用Hive CLI或Beeline客户端连接到Hive服务,然后执行查询语句。在查询...
    99+
    2024-04-02
  • MFC带进度条的状态栏怎么实现
    要实现MFC带进度条的状态栏,可以按照以下步骤进行:1. 打开你的MFC应用程序的资源文件(.RC),在其中找到你想要显示进度条的状...
    99+
    2023-09-26
    MFC
  • SQL Server中怎么获取服务器时间
    这篇文章给大家介绍SQL Server中怎么获取服务器时间,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。SQL SERVER 2000用sql语句如何获得当前系统时间就是用GETDAT...
    99+
    2024-04-02
  • mysql怎么查看sql执行进度
    MySQL的执行进度可以通过SHOW PROCESSLIST命令来查看。 SHOW PROCESSLIST会显示当前MySQL服务器...
    99+
    2023-10-24
    mysql sql
  • 在SQL Server里怎么进行页级别的恢复
    这篇文章跟大家分析一下“在SQL Server里怎么进行页级别的恢复”。内容详细易懂,对“在SQL Server里怎么进行页级别的恢复”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习...
    99+
    2023-06-17
  • SQL Server中怎么创建CLR存储过程
    这篇文章将为大家详细讲解有关SQL Server中怎么创建CLR存储过程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在2005之前的版本创建存储过程都是在...
    99+
    2024-04-02
  • SQL Server 2005中怎么创建存储过程
    本篇文章给大家分享的是有关SQL Server 2005中怎么创建存储过程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。。一、首先说明如何创建...
    99+
    2024-04-02
  • SQL Server中怎么使用分页的存储过程
    本篇文章为大家展示了SQL Server中怎么使用分页的存储过程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、 以学生表为例,在数据库中有一个Student表,...
    99+
    2024-04-02
  • SQL Server中怎么查看和获取实例名
    这篇文章将为大家详细讲解有关SQL Server中怎么查看和获取实例名,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、查看實例名時可用1、服务—SQL S...
    99+
    2024-04-02
  • SQL SERVER与ACCESS、EXCEL怎么进行数据互换
    这篇文章主要介绍“SQL SERVER与ACCESS、EXCEL怎么进行数据互换”,在日常操作中,相信很多人在SQL SERVER与ACCESS、EXCEL怎么进行数据互换问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作