2017-01-17 12 views
0

Ich versuche, Dateien von gridview herunterladen .. ich Dateien in der Datenbank speichern und dann in gridview Ich zeige ich versuche, dieseBuffer kann nicht null sein

ich Dateien in Datenbanktabelle speichern nicht in Ordner, so versuche ich zum Download Dateien

wenn ich das tue dieses Dokument herunterladen, aber es gibt Probleme, wenn ich den Code debuggen und überprüfen dann in dieser Zeile Dim row = db_stu.dResult.Tables (0) .Rows (i) dResult zeigt

docid  document  docname  docextension 
    1014 System.Byte[] Book2.xlsx .xlsx 

und dann, wenn ich weiter r gehen docname zeigt „1912218726836.xlsx“ dies und auch herunterladen als korrupt

+1

Bitte starten Sie keine Hilfe Momente fordern nachdem du deine Frage gepostet hast. Wir werden es schaffen, wenn und wann wir können. Wir sind alle Freiwillige, die in verschiedenen Zeitzonen verstreut sind. Niemand wird wegen dieses sinnlosen Kommentars helfen, der nicht schon helfen wollte. – jmcilhinney

+0

Sehen Sie sich den Titel dieser Frage an. Wird dieses Problem angesprochen? Wenn ja, akzeptiere entweder die Antwort, die es adressiert hat, oder füge eine eigene Antwort hinzu. Wenn Sie eine andere Frage haben, dann veröffentlichen Sie sie in einem neuen Thread. – jmcilhinney

+0

okkkkkkkkkkkkkkkkkk –

Antwort

1

Diese beiden Linien zusammen sind falsche Datei:

Dim binary() As Byte = TryCast(structDb.dstResult.Tables(0).Rows(i).Item("document"), Byte()) 
Dim ms As MemoryStream = New MemoryStream(binary) 

Der Grund für die Verwendung TryCast ist, dass das Objekt, das Sie versuchen zu cast ist möglicherweise nicht der Typ, mit dem Sie es zu transformieren versuchen. In diesem Fall gibt TryCastNothing zurück. Auf die Verwendung von TryCast sollte IMMER ein Test für Nothing folgen, den Sie nicht durchgeführt haben. Sie verwenden das Ergebnis, als ob Sie sicher sind, dass ein Objekt dieses Typs vorhanden sein wird. Wenn Sie das wissen, dann sollten Sie DirectCast statt TryCast verwenden.

Auch wenn Sie wissen, dass der Verweis nicht auf ein Objekt eines anderen Typs sein und Sie verwenden DirectCast aber, wenn Sie eine Nullreferenz werfen, das heißt Nothing, dann bist du noch Nothing wieder in Gang zu bringen. Sie müssen also zuerst feststellen, ob sich structDb.dstResult.Tables(0).Rows(i).Item("document") auf ein Objekt eines anderen Typs als Byte() beziehen kann. Wenn es nicht möglich ist, dann verwenden Sie DirectCast statt TryCast. In jedem Fall scheint es, dass dieser Ausdruck Nothing erzeugen kann, so dass Sie auf jeden Fall nach Nothing suchen müssen, z.

Dim binary() As Byte = TryCast(structDb.dstResult.Tables(0).Rows(i).Item("document"), Byte()) 

If binary IsNot Nothing Then 
    Dim ms As MemoryStream = New MemoryStream(binary) 

    '... 
End If 

EDIT: Wenn die Spalte NULL-Werte zulässt, dann müssen Sie zunächst prüfen, ob die Zeile enthält null und dann nur die Daten verwenden, wenn es etwas ist:

Dim row = structDb.dstResult.Tables(0).Rows(i) 

If Not row.IsNull("document") Then 
    'There is data so go ahead and use it. 
    Dim binary = DirectCast(row("document"), Byte()) 

    '... 
+0

Wenn ich direkte Besetzung verwende zeigt dies einen Fehler Kann nicht Objekt des Typs 'System.DBNull' zu Typ 'System.Byte []' zu werfen. –

+0

Was genau hast du dann mit 'TryCast' erwartet? Hast du gedacht, dass "DBNull" magisch zu einem "Byte()" wird? Sie haben offensichtlich eine Nullwert-Spalte und einige Zeilen enthalten null in dieser Spalte. Was genau erwarten Sie, wenn keine Daten zu verwenden sind? Wenn keine Daten vorhanden sind, versuchen Sie nicht, Daten zu verwenden. Warum haben Sie diese Information überhaupt nicht zur Verfügung gestellt? Es hätte etwas verschwendete Zeit gespart. Ich werde meine Antwort mit einem passenderen Code-Snippet aktualisieren. – jmcilhinney

+0

Ich versuchte Ihre Antwort überprüfen Sie die aktualisierte Frage bitte @jmcilhinney –