Ich habe ein Legacy-System mit ungefähr 10 Millionen Zeilen in einer Tabelle. In dieser Tabelle gibt es eine Typenspalte text
, die meisten davon sind Standardtext, aber ungefähr 500.000 Zeilen enthalten RTF-Markups. Ich muss den RTF-formatierten Text in einfachen Text konvertieren.
Meine aktuelle Methode ist, dass ich ein C # -Programm habe, das die Abfrage mit a in eine DataTable lädt SqlDataAdapter
und das Winforms- RichTextBox
Steuerelement verwendet, um die Konvertierung durchzuführen .
void bw_DoWork(object sender, DoWorkEventArgs e)
{
count = 0;
rtbRTFToPlain = new RichTextBox();
using (SqlDataAdapter ada = new SqlDataAdapter("select note_guid, notes from client_notes", Globals.SQLConnectionString))
using(SqlCommandBuilder cmb = new SqlCommandBuilder(ada))
{
DataTable dt = new DataTable();
ada.UpdateCommand = cmb.GetUpdateCommand();
ada.Fill(dt);
int reportEvery = dt.Rows.Count / 100;
if (reportEvery == 0)
reportEvery = 1;
foreach (DataRow row in dt.Rows)
{
if (count % reportEvery == 0)
bw.ReportProgress(count / reportEvery);
try
{
if (((string)row["notes"]).TrimStart().StartsWith("{") == true)
{
rtbRTFToPlain.Rtf = (string)row["notes"];
row["notes"] = rtbRTFToPlain.Text;
}
}
catch
{
}
count++;
}
bw.ReportProgress(100);
this.Invoke(new Action(() =>
{
this.ControlBox = false;
this.Text = "Updating database please wait";
}));
ada.Update(dt);
}
}
Dies funktioniert hervorragend für kleine Tabellen, aber dies ist das erste Mal, dass ich es auf einer Tabelle mit einem so großen Datensatz ausführen musste (einige der RTF-Dateien können mit eingebetteten Bildern mehrere Megabyte groß sein), und ich erhalte OutOfMemory Fehler mit meinem C # -Programm.
Ich weiß, dass ich meine Abfrage in kleinere Stapel aufteilen kann, aber ich wollte herausfinden, ob es einen besseren Weg gibt, den ich vermisst habe, um die RTF-Formatierung zu entfernen.
Sollte ich genau das Gleiche tun wie meine aktuelle Lösung, aber immer nur kleinere Datenblöcke abfragen, oder gibt es einen besseren Weg, dies zu tun?