Проблемы обновления Sql Filestream

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

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

Например. Пользователь выбирает файл из сетки, которую я запускаю через 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

person Panos    schedule 30.10.2009    source источник


Ответы (2)


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

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

person Pawel Marciniak    schedule 29.11.2009

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

sqlFS.SetLength(1)
person george    schedule 19.06.2015