0

我在 VB.Net 应用程序中实现了 SQL Server 2008 的文件流功能。

我可以插入文件,然后检索/查看它们就好了。但是,我在尝试更新文件时遇到了巨大的问题。

例如。用户从我通过 process.start 执行的网格中选择一个文件。如果该文件是 .txt 文件,则用户可以选择对其进行编辑。如果发生这种情况,我需要将更改的文件保存回数据库。到目前为止,我还没有做到这一点。

我所做的是获取检索到的文件,复制它(因为我在使用它时遇到了一些错误),然后 Process.Start 它。之后,通过 .NET 文件流,我将文件转换为字节并尝试更新记录。SQL Profiler 和 varbinary(max) 列上的手动 SELECT 告诉我该文件已正确更新,但下一次尝试检索它时,我得到一个未更改的文件。

之后,我还尝试通过更改文件系统版本来更新文件,但文件似乎仍然没有更新。有人有我如何实现此操作的代码示例吗?就像互联网上的 500 个站点有关于如何插入和检索文件的示例,但没有一个关于如何更新的示例。

这就是我第二次尝试通过文件系统更新文件的样子。插入/检索的代码非常相似,并且可以正常工作。

Public Sub UpdateFile(ByVal intGUID As Guid, ByVal strName As String)
    Dim objConnection As SqlConnection = GetConnection()
    Dim objTransaction As SqlTransaction = objConnection.BeginTransaction()
    Dim cmd As New SqlCommand("SELECT [FLE_Data].PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() " + _
                              "FROM TSKt_File " + _
                              "WHERE File_ID = @ID", objConnection)
    cmd.Transaction = objTransaction
    cmd.Parameters.Add("@ID", SqlDbType.UniqueIdentifier).Value = intGUID
    Dim rdr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)
    rdr.Read()
    Dim strFilePath As String = rdr.GetString(0)
    Dim trxID As Byte() = DirectCast(rdr(1), Byte())
    rdr.Close()

    Using fs As IO.FileStream = IO.File.OpenWrite(strName)
        Using sqlFS As New SqlTypes.SqlFileStream(strFilePath, trxID, IO.FileAccess.ReadWrite)
            Dim buffer As Byte() = New Byte(512 * 1024) {}
            Dim intPos As Integer = sqlFS.Read(buffer, 0, buffer.Length)
            Do While intPos > 0
                fs.Write(buffer, 0, intPos)
                intPos = sqlFS.Read(buffer, 0, buffer.Length)
            Loop
        End Using
    End Using
    objTransaction.Commit()
    objConnection.Close()
End Sub
4

2 回答 2

0

有一个更新文件流值的官方示例 (在覆盖 FILESTREAM 数据示例部分下)。

顺便说一句,我不清楚你想通过手动复制文件来实现什么。看起来您的第一种方法(您声称文件保持不变)是正确的并且应该可以工作 - 如果没有,请提供您正在使用的代码。

于 2009-11-29T23:29:01.670 回答
0

在写入 sql 文件流之前:

sqlFS.SetLength(1)
于 2015-06-19T08:51:25.243 回答