Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL CLR C#和SqlConnection对象_Sql Server 2008_Sqlclr - Fatal编程技术网

Sql server 2008 SQL CLR C#和SqlConnection对象

Sql server 2008 SQL CLR C#和SqlConnection对象,sql-server-2008,sqlclr,Sql Server 2008,Sqlclr,对SQLCLR开发来说是相当新的。我需要在UserDefinedFunctions类中的多个C#函数中使用上下文连接。这个问题涉及到这样做是否更好 在函数#1中创建上下文连接,然后将其传递给函数#2、3等 在需要查询数据库的每个函数中创建一个新的上下文连接 在类上创建一个实例变量,并在所有函数中使用它 创建1个“查询”函数,并将查询字符串/参数传递给它,并在一个函数中完成所有查询。此选项将有效地创建和破坏每次通话的连接,对吗 对其他想法持开放态度 不确定在代码中的不同位置需要上下文连接时,处理上

对SQLCLR开发来说是相当新的。我需要在UserDefinedFunctions类中的多个C#函数中使用上下文连接。这个问题涉及到这样做是否更好

  • 在函数#1中创建上下文连接,然后将其传递给函数#2、3等
  • 在需要查询数据库的每个函数中创建一个新的上下文连接
  • 在类上创建一个实例变量,并在所有函数中使用它
  • 创建1个“查询”函数,并将查询字符串/参数传递给它,并在一个函数中完成所有查询。此选项将有效地创建和破坏每次通话的连接,对吗
  • 对其他想法持开放态度
  • 不确定在代码中的不同位置需要上下文连接时,处理上下文连接的最佳实践是什么


    您更愿意使用
    using(SqlConnection…{}
    来确保正确地处理事情,但也可以使用类上的析构函数来执行此操作?

    如果我没记错的话,一次只能打开一个上下文连接。所以你的#1是我过去实施它的方式


    我在entry function\sproc中创建了上下文连接,然后将其向下传递给其他方法。输入功能负责连接的生命周期。

    上下文连接是进程内连接,因此只能打开一次。而且,由于SQL Server是“在处理中的”,因此它不需要为连接分配新资源,就像常规/外部连接需要创建新的SPID等一样(因此,我们使用连接池来降低成本)。因此,我不知道所有这些努力能提高多少性能

    您可以将该
    SqlConnection
    对象向下传递给其他方法,但您需要权衡降低非常小的开销(与建立新的外部连接相比)的成本/好处,以及不能在打开上下文连接的同时将信息传递回

    您不希望创建实例变量,因为这将强制程序集要求使用
    不安全的
    权限集设置
    。问题在于,类在第一次调用其中的方法时被实例化,并且在卸载应用程序域或可能发生其他事件之前,它会一直留在内存中,但在这两种情况下,它都会驻留相当长的一段时间。该类还可以在调用其中的方法的所有用户之间共享,这就是为什么类级别变量存在问题,因为它可以在SPID之间共享。这就是为什么所有方法都必须是静态的

    您可以使用
    构造,但是从类的角度来看,您的想法是错误的。该类实例化一次,并在系统上的所有用户之间共享

    有关SQLCLR的更多信息,我正在SQL Server Central上编写一系列关于它的文章:

    谢谢。这就是我目前正在做的事情。我只是觉得有必要多传几次球。这个CLR函数一天会被调用数千万次,所以我们正在尝试尽可能多的优化方法。谢谢。是的,我需要保证它的安全。那么你是说选项1、2、4是可行的选项?根据正在执行的工作,选项1可能不值得?我非常感谢这些技术细节——我现在更好地理解了幕后发生的事情。你能帮助我理解“你不能在上下文连接打开的同时传递信息吗?”。在SQL Server中将数据传递回调用者,或者在C#?@thomas中将数据传递回调用函数(返回):您应该测试一下#1的相对差异。考虑到您已经连接到SQL Server进程,我“认为”创建/销毁“Context Connection=true”
    SqlConnection
    的成本几乎为零。我没有关于它的统计数据,但是SQLServer不需要像分配新连接那样分配新资源。在2和4之间,它们听起来几乎一样,只是组织方式不同而已。我建议让代码工作起来,并且是可维护的/可读的。关于将数据传回,我的想法是将TVF传回查询。@托马斯:为了提供更好的建议,最好详细说明您在这个过程中要完成什么,以及为什么需要在不同的地方建立多个连接。很可能您可以通过重新组织整个流程本身来获得更高的效率。另外,我重读了这个问题,您的意思是在类中有多个
    SqlFunction
    方法吗?或者将有一个公开的
    SqlFunction
    ,而其他方法将是
    private