2009-10-30 86 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)