Проблемы с обновлением Sql Filestream - PullRequest
0 голосов
/ 30 октября 2009

Я реализовал функцию файлового потока SQL Server 2008 в приложении VB.Net.

Я могу вставлять файлы, а затем получать / просматривать их очень хорошо. Однако у меня возникают огромные проблемы при попытке обновить файл.

Например. Пользователь выбирает файл из сетки, который я выполняю через process.start. Если этот файл является TXT-файлом, пользователь может отредактировать его. В этом случае мне нужно сохранить измененный файл обратно в базу данных. Пока что мне это не удалось.

Что я делаю, так это беру извлеченный файл, копирую его (потому что у меня есть некоторые ошибки по поводу его использования), а затем обрабатываю. Запускаю его. После этого через .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

Ответы [ 2 ]

0 голосов
/ 19 июня 2015

Перед записью в поток файлов sql:

sqlFS.SetLength(1)
0 голосов
/ 30 ноября 2009

Официальный пример обновления значения файлового потока (в разделе Пример перезаписи данных FILESTREAM ).

Кстати, мне неясно, чего вы пытаетесь достичь, копируя файл вручную. Похоже, ваш первый подход (когда вы утверждаете, что файл оставлен без изменений) был верным и должен работать - если это не так, укажите код, который вы используете.

...