【发布时间】:2018-03-25 13:43:13
【问题描述】:
我有一个 C# SQLCLR 存储过程,其中首先将数据填充到某些字典中并进行计算,然后将输出存储在其他一些字典中。
由于使用了字典,此计算完成得非常快,并且完全证明了我需要使用 CLR 存储过程而不是普通的 SQL 存储过程。
但是,我必须从这些输出字典中将数据保存在 SQL 中的某些表中,而这部分需要花费大量时间并且无法满足我对整个 SQLCLR proc 更快的需求。
我必须对每个输出字典的每个键进行迭代,然后必须创建插入查询,然后必须按以下方式运行 ExecuteNonQuery:
那么我该如何改进我的这种方法,以便在插入数据时不会花费时间。我不能将SqlBulkCopy 用作it does not accept the in-process Context Connection(即"Context Connection = true;")作为连接字符串。那么还有其他更快的方法吗?提前致谢。
【问题讨论】:
-
“我不能使用 SQlBulkCopy,因为它不接受 connectionString 作为当前上下文。” - 嗯?你是什么意思?你知道这个constructor 吗?我绝对不明白你所说的“connectionString as context”是什么意思。
-
@Corak 我的意思是将我的 CRL proc 的连接设置为“conn = new SqlConnection("context connection=true");”。现在,我不能使用这个语句“使用(SqlBulkCopy bulkCopy = new SqlBulkCopy(conn.ConnectionString))”。
-
那么使用这个constructor 怎么样?
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) { /*...*/} -
@Corak 不,使用您的第二个解决方案我仍然收到此错误。读取请求的操作在上下文连接上不可用时出错。在 System.Data.SqlClient.SqlBulkCopy.CreateOrValidateConnection(String 方法) 的堆栈跟踪
-
@Corak
SqlBulkCopy的物理限制是目标连接字符串不能使用进程内连接(即上下文连接)。我已经更新了问题的文本以反映正确的术语,希望能减少混淆(稍后将添加支持文档的链接)。
标签: c# sql-server sql-server-2008 import sqlclr