gpt4 book ai didi

c# - 将 SqlDataReader 移至外部函数对性能有何影响?

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:30 24 4
gpt4 key购买 nike

给定以下 SQLCLR 函数:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void ExecSQL(string sql, string connectionString)
{
WindowsIdentity clientId = null;
WindowsImpersonationContext impersonatedUser = null;
clientId = SqlContext.WindowsIdentity;
try
{
try
{
impersonatedUser = clientId.Impersonate();
if (impersonatedUser != null)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{

//** HERE I WILL HAVE MULTIPLE VARIATIONS OF FETCHING THE SQLDATAREADER
connection.Open();
SqlCommand command = new SqlCommand(sql, connection);
SqlDataReader r = command.ExecuteReader();
impersonatedUser.Undo();
SqlContext.Pipe.Send(r);
}
}
else
{ throw new Exception("Impersonation failed."); }
}
finally
{
if (impersonatedUser != null) { impersonatedUser.Undo(); }
}
}
catch
{
throw;
}
}

移动此部分是否有任何性能或其他后果:

                connection.Open();
SqlCommand command = new SqlCommand(sql, connection);
SqlDataReader r = command.ExecuteReader();

进入一个单独的 GetDataReader() 方法?

我问是因为我知道我要为许多不同的场景(Sql 文本、存储过程、表值函数、标量函数等)加载数据读取器,所以我想将这些不同的实现封装到他们自己的函数,而不是在此函数中间有一个大的 switch 语句。

最佳答案

Are there any performance or other ramifications

不是我能想到或遇到的。当然,当涉及到这种性质的与性能相关的问题时,我总是建议测试一下,看看哪个更好,因为任何人回答问题都可能是错误的,并且肯定存在“接受”答案不正确的情况。然而,在您的系统上运行的软件才是最终答案 :-)。


除此之外,还有一些关于问题中显示的代码片段的注释。

  1. 可以impersonatedUser.Undo(); 移动到 connection.Open(); 之后。只需要建立连接。但是,话又说回来,将 Impersonation 处理保留在 main 方法中而不是仅将 Undo() 移动到新方法中可能会更简洁。

    或者,您也可以在此处的主要方法中保留 connection.Open();。在任何一种情况下,您都必须传递 connection 对象。

  2. 您可以将 impersonatedUser = clientId.Impersonate(); 包装在 if 条件中,测试 connectionString 以查看是否它是 "Context Connection = true;"。这将允许您使用上下文连接,否则它将无法工作,因为它不能与模拟一起使用。我想您可以重新处理当前的 if (impersonatedUser != null),因为该测试将不再有效(新测试只关心 impersonatedUser 是否为 null 如果未使用上下文连接。

  3. WindowsImpersonationContext 是 Disposable,因此最好将 finally block 移动到外部 try,并添加 impersonatedUser.Dispose();Undo() 之后。

关于c# - 将 SqlDataReader 移至外部函数对性能有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32123689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com