2009-10-30 1 views
0

Я применил функцию фильтрации для 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 

ответ

0

Там в официальном sample of updating filestream value (под секции Перезапись FILESTREAM Пример данных).

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

0

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

sqlFS.SetLength(1)