Swe*_*rew 1 .net c# t-sql stored-procedures
我遇到了使用ac#应用程序将大量数据行提交到数据库(sql 2008 R2)的代码问题.
我现在正在做的是我正在创建一个相当大的XML文件(大约30Mb),它将包含应该插入到数据库中的大约40.000行.
从我作为变量传递给数据库的这个xml文档中,我有一个存储过程,它将从中读取数据并进行适当的插入或更新.
伪c#代码:
String xml = xmlWriter.ToString();
SqlCommand cmd = new SqlCommand("sp_CommitData", connection)
cmd.Variables.AddWithValue("@xml", xml);
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
/* Read return data */
}
Run Code Online (Sandbox Code Playgroud)
伪tsql代码:
INSERT INTO DataTable
xmldata.value('@uID','[uniqueidentifier]') AS [uID]
FROM<
@xml.nodes('/data/m/r') [xmldata](xmldata)
Run Code Online (Sandbox Code Playgroud)
这种方法在过去对我来说非常有效,但现在数据似乎对于工作方法来说是巨大的......只需要提交数据就需要3分钟以上,而这只是长时间的方式.:(
这一定是一个很常见的问题,你们在类似的情况下怎么做?对于如何使用c#提交大量数据,你有什么好的指示吗?解决方案必须是线程安全的,所以我不太喜欢bcp或类似的方法.
亲切的问候德鲁
最快的方法是使用SqlBulkCopy,它将使用SQL的批量加载功能.
XML方法的问题在于,您首先必须从您的rowset/IEnumerable(你必须从什么开始?)转换为XML,然后通过网络推送它.XML是一种非常臃肿的格式,当你提到很多行时,这就很重要.
批量复制方法将允许您逐行流式传输,而无需实现整个事物(进入内存或磁盘),从而减少内存占用.
如果数据量非常大,您可能希望首先将其加载到临时表中(因此没有真实表的事务)和插入(或合并)到真实事物中.
什么是线程安全的意思?如果您希望此操作不阻止客户端,您可以轻松地在后台线程上启动它.没有外部流程或任何您需要开始执行此操作,它在进程中运行.
| 归档时间: |
|
| 查看次数: |
1110 次 |
| 最近记录: |