| 

.NET C# Java Javascript Exception

3
Um mit dem DataReader binäre Daten aus einer SQL Server Datenbank zu lesen verwendet man das Flag SequentialAccess:

IDataReader result = cmd.ExecuteReader(CommandBehavior.SequentialAccess);

Ich habe hier eine Basisklasse, die mit einem SQL Builder generierte Queries ausführt, d.h. ich weiß nicht im voraus, ob mein Query ein binäres Feld enthält oder nicht.
Welche Nachteile entstehen, wenn ich dieses Flag immer setze?
Oder lohnt es sich vorher zu prüfen, ob binäre Felder in der Query enthalten sind?
News:
14.12.2011
puls200 3,8k 6
2 Antworten
1
Ich habe inzwischen selbst etwas dazu gefunden in KB308614:

"Setting the CommandBehavior.SequentialAccess flag causes the DataReader to read both rows and columns sequentially. However, the rows and columns are not buffered. After you read past a column, the column is dropped from memory. Thus, any attempt to re-read the column or read previously read columns results in an exception.

Using the CommandBehavior.SequentialAccess flag provides a performance benefit, especially when you use Binary Large Object (BLOB) fields. If you do not use SequentialAccess, all of the BLOB data is copied to the client. This may consume a lot of resources. CommandBehavior.SequentialAccess also improves performance when you access non-BLOB fields. When CommandBehavior.SequentialAccess is not set, you can access a column out of order; however, you incur the following overhead:
- The column is checked to see if it is later than a previous accessed column.
- The data for all the previously accessed columns is retrieved and then cached for possible later retrieval.
Columns must be checked and cached because when you use the DataReader, the underlying stream is forward-only for rows as well as column access."


Mit anderen Worten, das Flag bringt den Nachteil der verlorenen Flexibilität beim Spaltenzugriff. Beim Zugriff auf große binäre Elemente ist es dennoch empfehlenswert.
15.12.2011
puls200 3,8k 6
1
Hallo,

nur eine Vermutung: Ich glaube Du musst! das nie so setzen. Die Einstellung soll Dir nur helfen, wenn Du nicht das ganze binäre Feld lesen möchtest. Angenommen Du hast dort ein Video mit den knapp 2 GB die möglich sind. Dann möchtest Du an einer bestimmten Stelle starten, also den Anfang überspringen. Dann brauchst Du den SequentialAccess.

Wenn in der DB nur Thumbnails gespeichert sind, dann kannst Du den Parameter ignorieren.

Gruß
15.12.2011
LutzJ 1,3k 8
An eine bestimmte Stelle komme ich auch ohne das Flag, d.h. der Code in dem von mir verlinkten Beispiel funktioniert auch so, ich habe das leicht abgewandelt eingebaut. Ich glaube eher, dass für jedes Feld ein separater Buffer erzeugt wird um z.B. Feld 3 vor Feld 2 lesen zu können. Wenn Feld 2 nun das 2GB File ist braucht man natürlich eine Unmenge von Speicher. Meine Vermutung ist dass es hauptsächlich um möglichst geringen Ressourcenverbrauch geht.
puls200 15.12.2011

Stelle deine .net-Frage jetzt!