我已經在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