SQL Server 2008 のファイル ストリーム機能を VB.Net アプリケーションに実装しました。
ファイルを挿入してから、問題なく取得/表示できます。ただし、ファイルを更新しようとすると大きな問題が発生します。
例えば。ユーザーはグリッドからファイルを選択し、それを process.start 経由で実行します。そのファイルが .txt ファイルの場合、ユーザーはそれを編集することを選択できます。その場合は、変更したファイルをデータベースに保存し直す必要があります。これまでのところ、私はそれを行うことができませんでした。
私がしていることは、取得したファイルを取得してコピーし (使用中にエラーが発生したため)、Process.Start を実行することです。その後、.NET ファイルストリームを介して、ファイルをバイトに変換し、レコードを更新しようとします。SQL プロファイラと varbinary(max) 列の手動 SELECT は、ファイルが適切に更新されていることを示していますが、次にそれを取得しようとすると、変更されていないファイルが取得されます。
その後、ファイルシステムのバージョンを変更してファイルを更新しようとしましたが、ファイルはまだ更新されていないようです。この操作を実現する方法のコードサンプルはありますか? インターネット上の 500 のサイトと同様に、ファイルを挿入して取得する方法の例がありますが、更新方法の例は 1 つもありません。
これは、ファイルシステムを介してファイルを更新しようとする 2 回目の試みの様子です。挿入/取得のコードは非常に似ており、適切に動作します。
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