Laden...

byte[] gefüllt mit 0len

Erstellt von Endro vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.106 Views
E
Endro Themenstarter:in
96 Beiträge seit 2008
vor 10 Jahren
byte[] gefüllt mit 0len

Hallo,
ich versuche gerade eine Datei aus der DB auszulesen (SQL) und lokal zu speichern. Die buffer größe scheint OK zu sein (jedenfall ist die größe je nach file unterschiedlich), leider werden nur 0Werte eingefügt (buffer[0]=0, buffer[1]=0, .... den Dateinamen kann ich in der Liste finden

db.Read())
byte[] buffer = new byte[(db.GetBytes(1, 0, null, 0, int.MaxValue))];
List.Add(new FileModel
                        {
                            Name = db.GetValue(0).ToString(),
                           File = new byte[(db.GetBytes(1, 0, buffer, 0, buffer.Length                     });

Hab wirklich keine Idee wo ich suchen soll, könte ihr mir weiterhelfen?

S
248 Beiträge seit 2008
vor 10 Jahren

Hallo Endro,

ich rate einfach mal:

db.Read())
byte[] buffer = new byte[db.GetBytes(1, 0, null, 0, int.MaxValue)];
db.GetBytes(1, 0, buffer, 0, buffer.Length);
List.Add(new FileModel
                        {
                            Name = db.GetValue(0).ToString(),
                           File = buffer
                     });

Grüße
spooky

5.657 Beiträge seit 2006
vor 10 Jahren

Hi Endro,

File = new byte[(db.GetBytes(1, 0, buffer, 0, buffer.Length  

Bei diesem Aufruf fehlt eine abschließende Klammer, und selbst wenn das ganze kompliliert werden könnte, erstellst du damit nur ein leeres Array. Also eins mit lauter Nullen drin. Entweder enthältst du uns hier Code vor, oder du liest tatsächlich nirgendwo die Werte aus der DB.

Christian

Weeks of programming can save you hours of planning

849 Beiträge seit 2006
vor 10 Jahren

Hallo Mr Sparkle,

das war doch genau seine Fehlerbeschreibung. Er hat nach dem Lesen ein leeres Array.
Lesen tut er zwar, aber weist dann ein neues leeres Array seinem File Property zu anstatt die Variable buffer.

E
Endro Themenstarter:in
96 Beiträge seit 2008
vor 10 Jahren

Hi,

vielen Dank für eure Unterstützung ...

ich habe also wie von Spook vorgeschlagen File = buffer zugewiesen, leider mit dem gleichen Ergebnis.

Die Werte in der Liste:
-Name zeigt mir den Namen der entsprechenden Datei an

  • File zeigt mir {byte(648)} aber jedes einzelne byte [0] --- [647] ist nach wie vor mit 0 gefüllt.

wenn ich mir dann die non public members von File anschaue dann kommt da ERROR_ACCESS_DENIED (5), ERROR_INVALID_PARAMETER (87), GetFileExInfoStandard (0)

das verstehe ich nich ich versuche doch nur die daten in die liste zu bekommen ....

das ganze kann ohne Fehlermeldung kopiliert werden auch der Filedialog mit dem entsprechenden filenamem wird angezeigt ....

Endro

849 Beiträge seit 2006
vor 10 Jahren

Hmm komisch. Vllt ein anderer ansatz:


SqlDataReader reader = wie auch immer;

while(reader.Read())
{
			using(var stream = reader.GetStream(1))
			{
				var bytes = new byte[stream.Length];
				stream.Read(bytes,0,bytes.Length);
                                List.Add(new FileModel
                              {
                                 Name = reader.GetValue(0).ToString(),
                                File = bytes 
                             });
			}
}

In der Beschreibung von getBytes gibt es eine komische beschreibung das es nicht immer unbedingt von index 0 gelesen wird.

GetBytes returns the number of available bytes in the field. Most of the time this is the exact length of the field. However, the number returned may be less than the true length of the field if GetBytes has already been used to obtain bytes from the field. This may be the case, for example, if the SqlDataReader is reading a large data structure into a buffer. For more information, see the SequentialAccess setting for CommandBehavior.

Hängt vllt mit dem vorhergehenden Zählen der Länge zusammen..

Oh, Du solltest vllt auch einmal checken ob nicht die Files in der Db schon genullt sind.. nur so eine Eingebung.

Grüße

E
Endro Themenstarter:in
96 Beiträge seit 2008
vor 10 Jahren

ja echt komisch - kann mir nicht erklären was da schief läuft zumahl die größe des byte array's passt. Aber noch mal vielen Danke für die Unterstützung

hab es mit mehreren Dateien versucht, immer das gleiche Ergebnis!
Mit anderen Tool kann ich die Datei(en) anzeigen oder speichern (liegt also nicht an den Dateien)

vielleicht sollte ich dazu sagen, dass ich auf eine Oracle-DB zugreife ansonsten mache ich es so wie in deinem Beispiel

Endro

849 Beiträge seit 2006
vor 10 Jahren

Jetzt ist mein Latein auch irgendwie am Ende.

Benutzt Du die Oracle dlls aus dem .net Framework oder von Oracle selbst? Der aus .net wird seit Jahren nicht weiter entwickelt. vllt solltest Du dann umsteigen.

C
2.121 Beiträge seit 2010
vor 10 Jahren

Du erstellst ein leeres Array in der Größe deines Tabelleninhalts. Da stehen Nullen drin.
Wenn du File=buffer zuweist, weist du File dieses Array mit Nullen zu. Da kann also nichts anderes drin stehen.
Wie wärs damit:
db.GetBytes(1, 0, buffer, 0, buffer.Length);
Das müsste das zuvor angelegte Array mit Daten füllen.

Dass sb ein DbDataReader ist hättest du dazu sagen können 😉
Im Zusammenhang einer Datenbank von einer "Datei" zu sprechen ist auch nicht hilfreich wenn man deinen Beitrag durchliest.

5.657 Beiträge seit 2006
vor 10 Jahren

Dass sb ein DbDataReader ist hättest du dazu sagen können 😉

Dann sollte diese Anweisung ausreichen:


byte[] buffer = (byte[])db[1];

Hätte man auch durch 1 oder 2 Minuten Google herausfinden können: DataReader.GetBytes-Methode oder Get byte[] from the SqlDataReader?.

Der Umgang mit Arrays und der Unterschied zwischen der Initialisierung und dem Füllen des Arrays mit Werten setzen wir als Grundlagenwissen voraus, siehe [Hinweis] Wie poste ich richtig?, Punkt 1.1 und 1.1.1.

Christian

Weeks of programming can save you hours of planning