Tôi có một hệ thống kế thừa với khoảng 10 triệu hàng trong một bảng. Trong bảng đó có một cột loại text
, hầu hết trong số chúng là văn bản tiêu chuẩn nhưng khoảng 500 nghìn hàng có đánh dấu RTF trong đó. Tôi cần chuyển đổi văn bản có định dạng RTF thành văn bản thuần túy.
Phương thức hiện tại của tôi là tôi có một chương trình C # tải truy vấn vào DataTable bằng cách sử dụng a SqlDataAdapter
và sử dụng RichTextBox
điều khiển winforms để thực hiện chuyển đổi.
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);
}
}
Điều này rất tốt cho các bảng nhỏ, tuy nhiên đây là lần đầu tiên tôi phải chạy nó trên một bảng có tập dữ liệu lớn như vậy (một số tệp rtf có thể có kích thước vài megabyte với các hình ảnh nhúng) và tôi đang nhận được OutOfMemory lỗi với chương trình C # của tôi.
Tôi biết rằng tôi có thể chia nhỏ truy vấn của mình thành một lô nhỏ hơn, nhưng tôi muốn xem liệu có cách nào tốt hơn mà tôi đã bỏ qua để loại bỏ định dạng RTF hay không.
Tôi có nên làm điều tương tự như giải pháp hiện tại của mình nhưng chỉ truy vấn dữ liệu các phần nhỏ hơn tại một thời điểm, hoặc có cách nào tốt hơn để làm điều này không?