Sco*_*ain 8 sql-server-2005 sql-server c#
我有一个旧系统,表中有大约 1000 万行。在该表中有一个 type 列text,其中大部分是标准文本,但大约 50 万行中有 RTF 标记。我需要将 RTF 格式的文本转换为纯文本。
我当前的方法是我有一个 C# 程序,它使用 a 将查询加载到 DataTable 中,SqlDataAdapter并使用 winformsRichTextBox控件进行转换。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这对于小表来说非常有用,但是这是我第一次不得不在具有如此大数据集的表上运行它(一些 rtf 文件的大小可能有几兆字节,带有嵌入的图片)并且我得到了 OutOfMemory我的 C# 程序错误。
我知道我可以将我的查询分成较小的批次,但我想看看是否有更好的方法来去除 RTF 格式。
我应该和我当前的解决方案做同样的事情,但一次只查询更小的数据块,还是有更好的方法来做到这一点?
我最终制作了一个 CLR 函数来转换它。
我找到了这个库,然后我稍微调整了它以删除我不需要的东西,例如日志记录和绘图方法,这使我可以将其标记为安全。
然后我就做了这个小班。
using System.Data.SqlTypes;
using Itenso.Rtf.Converter.Text;
using Itenso.Rtf.Support;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString RtfToPlainText(SqlString text)
{
if (text.Value.StartsWith(@"{\rtf"))
{
RtfTextConverter textConverter = new RtfTextConverter();
RtfInterpreterTool.Interpret(text.Value, textConverter);
return textConverter.PlainText;
}
else
return text;
}
}
Run Code Online (Sandbox Code Playgroud)
并在 SQL 中运行它
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
CREATE ASSEMBLY ConversionsSqlExtensionsAssembly
from 'E:\Code\ConversionsSqlExtensions\bin\Debug\ConversionsSqlExtensions.dll'
WITH PERMISSION_SET = safe
go
CREATE function RtfToPlainText(@value nvarchar(max))
returns nvarchar(max)
AS EXTERNAL NAME ConversionsSqlExtensionsAssembly.StoredProcedures.RtfToPlainText
Run Code Online (Sandbox Code Playgroud)
它速度快,效果很好!
| 归档时间: |
|
| 查看次数: |
25765 次 |
| 最近记录: |