Сохранить бинарный файл из SQL Server - PullRequest
0 голосов
/ 12 сентября 2010

Я пытаюсь сохранить двоичный файл, сохраненный в базе данных SQL, с помощью SaveDialog, функция RetrieveFile извлекает указанный файл из базы данных в виде байтового массива, вот что у меня так далеко:

Private Shared Function RetrieveFile(ByVal filename As String) As Byte()
    Dim connection As New SqlConnection("Data Source=SERVER\SQL2008;Initial Catalog=NorthPole;Integrated Security=True")
    Dim command As New SqlCommand("SELECT pcfFile FROM Items WHERE pcfFileName=@Filename", connection)
    command.Parameters.AddWithValue("@Filename", filename)
    connection.Open()
    Dim reader As SqlDataReader = command.ExecuteReader(System.Data.CommandBehavior.SequentialAccess)
    reader.Read()
    Dim memory As New MemoryStream()
    Dim startIndex As Long = 0
    Const ChunkSize As Integer = 256
    While True
        Dim buffer As Byte() = New Byte(ChunkSize - 1) {}
        Dim retrievedBytes As Long = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize)
        memory.Write(buffer, 0, CInt(retrievedBytes))
        startIndex += retrievedBytes
        If retrievedBytes <> ChunkSize Then
            Exit While
        End If
    End While
    connection.Close()
    Dim data As Byte() = memory.ToArray()
    memory.Dispose()
    Return data


End Function


Private Sub SaveAsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveAsToolStripMenuItem.Click
    Dim saveFileDialog1 As New SaveFileDialog()
    saveFileDialog1.Filter = "PCF File|*.pcf|"
    saveFileDialog1.Title = "Save an pcf File"
    saveFileDialog1.ShowDialog()

    If saveFileDialog1.FileName <> "" Then
        Dim fs As System.IO.FileStream = CType(RetrieveFile("FakePCF.pcf"), System.IO.FileStream)
                    fs.Close()
    End If
End Sub

Файлы сохраняются как «SqlDbType.VarBinary» в базе данных. Я получаю: «Индекс был за пределами массива». на:

   Dim retrievedBytes As Long = reader.GetBytes(1, startIndex, buffer, 0, ChunkSize)

MemoryStream, похоже, не получает данные, но синтаксис SQL правильный. Что я делаю не так?

1 Ответ

0 голосов
/ 12 сентября 2010

Ну, во-первых, ваш метод возвращает byte [], и вы пытаетесь привести его к FileStream. Вы должны изменить свой обработчик следующим образом:

Private Sub SaveAsToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveAsToolStripMenuItem.Click
    Dim saveFileDialog1 As New SaveFileDialog()
    saveFileDialog1.Filter = "PCF File|*.pcf|"
    saveFileDialog1.Title = "Save an pcf File"
    saveFileDialog1.ShowDialog()

    If saveFileDialog1.FileName <> "" Then
        Dim fs As New System.IO.FileStream (saveFileDialog1.FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write)
        Dim data As Byte() = RetrieveFile("FakePCF.pcf")
        fs.Write(data, 0, data.Length)
        fs.Flush()
        fs.Close()
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...