2009-10-30 50 views
0

我已经在VB.Net应用程序中实现了SQL Server 2008的文件流功能。Sql Filestream更新问题

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

例如,用户从我通过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 

回答

0

有一个官方sample of updating filestream value (下覆写FILESTREAM数据实施例部分)。

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

0

写入SQL文件流之前:

sqlFS.SetLength(1)