0

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
4

2 に答える 2

0

filestream 値を更新する公式のサンプルがあります (「FILESTREAM データの上書きの例」セクションの下)。

ところで、ファイルを手動でコピーして何を達成しようとしているのか、私にはわかりません。最初のアプローチ (ファイルが変更されていないと主張している場合) は正しく、動作するはずです。動作しない場合は、使用しているコードを提供してください。

于 2009-11-29T23:29:01.670 に答える
0

SQL ファイル ストリームに書き込む前に:

sqlFS.SetLength(1)
于 2015-06-19T08:51:25.243 に答える