2010-09-11 7 views
0

J'essaie d'enregistrer un fichier binaire stocké dans une base de données SQL avec un SaveDialog, la fonction RetrieveFile récupère le fichier spécifié de la base de données en tant que tableau Byte, voici ce que j'ai jusqu'à présent:Enregistrer le fichier binaire de SQL Server

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 [email protected]", 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 

Les fichiers sont enregistrés en tant que "SqlDbType.VarBinary" dans la base de données. Je reçois: "Index était en dehors des limites de la matrice." sur:

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

Le MemoryStream semble ne pas récupérer les données mais la syntaxe SQL est correcte. Qu'est-ce que je fais de mal?

+0

Vous devez nous indiquer les erreurs que vous rencontrez lorsque vous essayez d'exécuter ce code. – BoltClock

Répondre

0

Eh bien, tout d'abord, votre méthode renvoie octet [] et vous essayez de le convertir en FileStream. Vous devez remplacer votre gestionnaire par le suivant:

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 
Questions connexes