我在VB.Net应用程序中实现了SQL Server 2008的文件流功能。
我可以插入文件,然后检索/查看它们就好了。但是,我在尝试更新文件时遇到了很大问题。
EG。用户从我通过process.start执行的网格中选择一个文件。如果该文件是.txt文件,则用户可以选择对其进行编辑。如果发生这种情况,我需要将更改的文件保存回数据库。到目前为止,我没有做到这一点。
我做的是获取检索到的文件,复制它(因为我得到了一些关于它的错误),然后是Process.Start它。之后,通过.NET文件流,我将文件转换为字节并尝试更新记录。 varbinary(max)列上的SQL事件探查器和手动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 :(得分:0)
有一位官员sample of updating filestream value (在覆盖FILESTREAM数据示例部分下)。
顺便说一句,我不清楚你要通过手动复制文件来实现什么。看起来你的第一种方法(你声称文件保持不变)是正确的,应该可行 - 如果没有,请提供你正在使用的代码。
答案 1 :(得分:0)
在写入sql文件流之前:
sqlFS.SetLength(1)