一个sql上下文连接通过调用堆栈

时间:2014-05-15 14:52:21

标签: c# sql-server

我必须在SQL Server 2008 R2上部署两个用户定义的标量值函数,如下面举例说明的两个。它们都可以单独调用。第一个也可以从第二个调用。

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool Function1(string arg1)
{
    using (SqlConnection sqlCnn = new SqlConnection("context connection=true"))
    {
        //... Some code here.
    }
    return true;
}

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool Function2(string arg1)
{
    using (SqlConnection sqlCnn = new SqlConnection("context connection=true"))
    {
        bool ret1 = Function1("arg1");
        //... Some code here.
    }
    return true;
}

成功部署。但是,如果您调用Function2,则会引发以下错误:

  

" System.InvalidOperationException:上下文连接已经存在   在使用"

问题是:

  1. 调用一个从数据库获取数据的函数的最佳解决方案是什么?为什么这个函数从另一个从同一个数据库获取数据的函数(常规连接;使用SqlCommand或其他东西,如常见的Sql Server函数)。

  2. 值得信赖的关闭,所以我无法打开常规连接。考虑到这一事实,最佳解决方案是什么?

2 个答案:

答案 0 :(得分:0)

代码中是否有拼写错误?看起来你有一个函数2调用自身的无限递归。对于我的回答,我认为它应该调用Function1。

我对Microsoft.SqlServer.Server.SqlFunction不太熟悉,但是如果你可以重载函数,那么类似下面的东西会对你有帮助。

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool Function1(string arg1)
{
    using (SqlConnection sqlCnn = new SqlConnection("context connection=true"))
    {
        return Function1(arg1, sqlCnn);
    }
    return true;
}

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool Function1(string arg1, SqlConnection sqlCnn)
{
    //... Some code here using sqlCnn which we won't close or dispose.
    // as it's up to the caller to do that
    return true;
}

[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)]
public static bool Function2(string arg1)
{
    using (SqlConnection sqlCnn = new SqlConnection("context connection=true"))
    {
        bool ret1 = Function1(arg1, sqlCnn);
        //... Some code here.
    }
    return true;
}

所以调用Function1的任何东西都可以使用Function1(string),它会创建它自己的连接,但是Function2调用Function1(string,SqlConnection)然后使用相同的连接。

答案 1 :(得分:0)

像<{1}}和SqlFunction这样的

Function方法实际上是代码与SQL Server的接口,不应相互依赖。如果他们这样做,则表明您的代码开始变得过于复杂,无法使用简单的静态方法。

更好的解决方案是将连接管理留给Function2方法,并将实际实现放在其他方法中,例如:

SqlFunction

如果您有许多此类函数,则可以根据需要将实现提取到其他类,并仅保留静态类以公开[Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)] public static bool Function1(string arg1) { using (SqlConnection sqlCnn = new SqlConnection("context connection=true")) { InnerFunction1(sqlCnn,arg1); } return true; } [Microsoft.SqlServer.Server.SqlFunction(DataAccess = DataAccessKind.Read)] public static bool Function2(string arg1) { using (SqlConnection sqlCnn = new SqlConnection("context connection=true")) { InnerFunction2(sqlCnn,"arg1"); } return true; } private static bool InnerFunction1(SqlConnection sqlCnn,string arg1) { //... Some code here. } private static bool InnerFunction2(SqlConnection sqlCnn,string arg1) { bool ret1 = InnerFunction1(sqlCnn,"arg1"); //... Some code here. } 成员。