2009-05-07 4 views
0

Ich muss einige In-Memory-Merging in C# von zwei sortierten Strömen von Zeichenfolgen aus einer oder mehreren SQL Server 2000-Datenbanken in einem einzigen sortierten Stream durchführen. Diese Datenströme können sehr groß sein, daher möchte ich nicht beide Ströme in den Speicher ziehen. Stattdessen muss ich jeweils ein Element aus jedem Stream im Speicher behalten und bei jedem Schritt das aktuelle Element aus jedem Stream vergleichen, das Minimum auf den endgültigen Stream schieben und das nächste Element aus dem entsprechenden Quellstream ziehen. Um dies korrekt durchzuführen, muss der speicherinterne Vergleich jedoch mit der Kollatierung der Datenbank übereinstimmen (beachten Sie die Streams [A,B,C] und [A,B,C]: Die korrekte zusammengefügte Sequenz ist [A,A,B,B,C,C], aber wenn Ihr speicherinternen Vergleich C < B, Ihre In-Memory-Merge wird A,A,B ergeben, an welcher Stelle es die C an einem B und einem C und nachgeben suchen wird, in einem falsch sortiert Strom führt)VARCHAR-Sortierung versus VARBINARY-Sortierung in SQL Server 2000

Also, meine Frage ist:. ist es eine Möglichkeit, alle zu imitieren die Sortierungen in SQL Server 2000 mit einer System.StringComparison Enumeration in C# oder umgekehrt? Der nächste, den ich gekommen bin, ist System.StringCompaison.Ordinal mit den Ergebnissen der Datenbank-Strings zu VARBINARY mit dem Standard VARBINARY bestellen, die funktioniert, aber ich würde lieber nur eine "order by name collate X"-Klausel zu meinen SQL-Abfragen hinzufügen, wo X ist eine Sortierung, die funktioniert genauso wie die VARBINARY Sortierung, anstatt alle Zeichenfolgen in VARBINARY zu konvertieren, wenn sie die Datenbank verlassen und dann zurück zu den Zeichenfolgen, wenn sie in den Speicher kommen.

Antwort

0

Werfen Sie einen Blick auf die StringComparer Klasse. Dies bietet robustere Zeichen- und Zeichenfolgenvergleiche als bei String.Compare. Es gibt drei Sätze von statischen Instanzen (CurrentCulture, InvariantCulture, Ordinal) und fallbezogene Versionen von jedem. Für spezialisiertere Kulturen können Sie die Funktion StringComparer.Create() verwenden, um einen Vergleicher zu erstellen, der an eine bestimmte Kultur gebunden ist.

0

Mit SQL 2005 weiß ich, dass die Db-Engine keine OS-Aufrufe zum Sortieren macht, die Bestellregeln werden statisch mit der DB geliefert (kann mit einem Service Pack aktualisiert werden, ändert sich aber nicht mit dem Betriebssystem). Ich denke also nicht, dass Sie sicher sagen können, dass ein bestimmter Satz von Anwendungscode auf die gleiche Weise angeordnet werden kann, es sei denn, Sie haben den gleichen Code wie der Datenbankserver, es sei denn, Sie verwenden eine binäre Sortierung.

Aber wenn Sie eine binäre Sortierung in der DB-und Client-Code verwenden, sollten Sie überhaupt kein Problem haben.

BEARBEITEN - jede Sortierung, die mit _BIN endet, führt zur binären Sortierung. Der Rest des Kollatierungsnamens bestimmt, welche Codepage zum Speichern von CHAR-Daten verwendet wird, beeinflusst jedoch nicht die Reihenfolge. Das _BIN bedeutet streng binäre Sortierung. Siehe http://msdn.microsoft.com/en-us/library/ms143515(SQL.90).aspx

+0

Sind Sie sicher, dass _BIN für SQL Server 2000 gilt? –

+0

Ich habe mehrere der BIN-Ordnungen versucht, einschließlich Latin1_General_BIN und Latin1_General_BIN2, aber sie sind nicht das gleiche wie StringComparison.Ordinal. Meine Testfälle umfassen das Erzeugen aller Byte-Strings bis zu einer bestimmten Länge, das Konvertieren in Strings mit System.Text.Encoding.Unicode.GetString, das Sortieren mit StringComparison.Ordinal und das Vergleichen der Ergebnisse mit dem, was mit "order" aus der Datenbank kommt durch Sortieren X ". Keine der _BIN- oder _BIN2-Anordnungen hat die sortierte In-Memory-Reihenfolge bereits erreicht. –

+0

@Larry - Wie erzeugen Sie die Strings in der db? Genau wie Besetzung (0x ..... wie Nvarchar (N))? – ahains