Я применил функцию фильтрации для SQL Server 2008 в приложении VB.Net.Проблемы с обновлением Sql Filestream
Я могу вставить файлы, а затем получить/просмотреть их просто отлично. Однако у меня возникают огромные проблемы с обновлением файла.
Например. Пользователь выбирает файл из сетки, который я выполняю через process.start. Если этот файл является TXT-файлом, пользователь может его отредактировать. В случае, если это произойдет, мне нужно сохранить измененный файл обратно в базу данных. До сих пор я этого не делал.
Что я делаю, берет извлеченный файл, копирует его (потому что у меня есть некоторые ошибки в его использовании), а затем Process.Start. После этого через .NET filestream я конвертирую файл в байты и пытаюсь обновить запись. SQL Profiler и ручной SELECT в столбце varbinary (max) говорят мне, что файл обновлен правильно, но в следующий раз попытайтесь его получить, я получаю неизменный файл.
После этого я также попытался обновить файл, изменив его версию файловой системы, но файл все равно не будет обновляться. Есть ли у кого-нибудь образец кода, как я могу добиться этой операции? Как и 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