Laden...

DbDataWriter mit "SequentialAccess"

Erstellt von bonzy vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.258 Views
bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren
DbDataWriter mit "SequentialAccess"

verwendetes Datenbanksystem: MS SQL Server 2008

Tag zusammen,

aktuell schreibe ich einen Synchronisationsvorgang, der eine globale DB (s.o.) lokal ablegt (Compact Edition). Dieser läuft als Windows Dienst im Hintergrund und soll somit möglichst wenig die CPU/das Netzwerk belasten. Dafür habe ich beim Lesen die Möglichkeit des SequentialAccess beim DbDataReader entdeckt, aber was mir fehlt ist ein Gegenstück zum Schreiben.

Dass es einen DataWriter nicht gibt ist mir klar, aber die Frage die sich mir stellt ist, ob es überhaupt möglich ist. Ich habe zumindest noch nicht davon gehört, dass man in Schritten in eine Datenbank bzw. einen Datensatz schreiben kann.

Wäre nett, wenn sich dazu jemand äußern würde. 😃

1.564 Beiträge seit 2007
vor 13 Jahren

Hallo bonzy

Wie sollte der SequencialAccess beim schreiben denn (nicht) aussehen? Der ist doch eigentlich automatisch gegeben wenn du mit dem DbDataReader als Quelle arbeitest. Lauf über deine Source-Daten und schreibe diese Zeilenweise in die Destination DB.

(BTW: Schau dir evtl. auch mal den MS Sync-Framework an.)

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren

Hallo Florian,

den SequentialAccess benutze ich, um größere Spalten vom Typ 'image' in Schritten auszulesen, da die Daten dort sehr groß werden können. Jetzt brauche ich eine Methode, wie ich auf dem gleichen Weg große Daten in kleinen Schritten wieder in die DB kriege. Mit Update kann ich leider nicht arbeiten, da der '+'-Operator nicht mit image gültig ist (andere Datentypen kommen nicht in Frage wegen der Größe der Binärdaten).

Also reicht mir das Zeilenweise schreiben nicht, sondern ich muss erstmal alle Spalten einzeln schreiben und dazu nochmal die großen Spalten in kleinen (10KB) Schritten abarbeiten. Das dient dazu, dass ich während des Vorgangs immernoch einen Geschwindigkeitsanpassung vornehmen kann.

Mit dem Sync Framework habe ich zuerst gearbeitet, aber es bietet mir nicht die Möglichkeit, diese kleinen Schritte darzustellen. Deshalb habe ich bereits begonnen, es zu Fuß zu schreiben.

Darunter waren jetzt wohl Informationen, mit denen ich direkt hätte rüberkommen können, deshalb hoffe ich man kann jetzt etwas mit mit meinem Problem anfangen.

1.564 Beiträge seit 2007
vor 13 Jahren

Ich befürchte da macht dir SQL Server Compact einen Strich durch die Rechnung. Bei SQL Server könntest du die VARBINARY WRITE Methode verwenden, bzw. bei IMAGE Typen die TEXTPTR. Ich glaube nicht, dass SQL Server Compact das unterstützt.

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren

Ich benutze CE nur für die lokale Datenbank, da darf ich also auch ganze Datensätze hinzufügen, ohne dass das Netzwerk etwas mitbekommt. Den schrittweisen Zugriff brauche ich für SQL Server 08.

Zu deinem Vorschlag muss ich dir leider folgendes bezogen auf TEXTPTR Zitieren: "Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird. Alternative Funktionen sind nicht verfügbar."

Und ohne das komm ich ja nicht an den Varbinary-wert, somit fällt die Write Methode auch weg.

1.564 Beiträge seit 2007
vor 13 Jahren

Okay. Jetzt glaube ich, ich bin von der falschen Richtung ausgegangen. Schreibst du von der CE in den SQL Server oder andersrum?

Zu TEXTPTR:
Ich weiß, dass TEXTPTR obsolet ist, da du aber IMAGE verwendest, was genau so obsolet ist dachte ich mir dass dir das im Augenblick egal ist. Die sterben beide gleichzeitig. Statt IMAGE sollte man seit SQL Server 2005 VARBINARY(MAX) verwenden.

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren

Ich synchronisiere bereits perfekt von der globalen (SQL Server) in die lokale (CE). Jetzt muss ich allerdings noch die andere Richtung abdenken, sollte lokal etwas verändert werden. Dann muss ich von CE nach SQL Server.

Ich glaube ich habe Varbinary falsch eingeschätzt. Ich dachte bisher, dass MAX bloß für die Grenze von 8000 steht. Also könnte ich image durch VARBINARY(MAX) ersetzen und mit der VARBINARY WRITE Methode arbeiten?

1.564 Beiträge seit 2007
vor 13 Jahren

Yep. Ich habe zur Verarbeitung von großen Binärdaten Anfang des Jahres einen recht ausführlichen Blog Post geschrieben:
Concatenation of Text and Binary Data in T-SQL
Könnte dir dabei helfen.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

bonzy Themenstarter:in
157 Beiträge seit 2008
vor 13 Jahren

Die reine Erklärung der WRITE Methode reicht mir denke ich schon. Damit sollte ich im Stande sein, mein Problem zu lösen. Wenn ich dennoch auf Probleme stoße, melde ich mich wieder.