我必须在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:上下文连接已经存在 在使用"
问题是:
调用一个从数据库获取数据的函数的最佳解决方案是什么?为什么这个函数从另一个从同一个数据库获取数据的函数(常规连接;使用SqlCommand或其他东西,如常见的Sql Server函数)。
值得信赖的关闭,所以我无法打开常规连接。考虑到这一事实,最佳解决方案是什么?
答案 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)
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.
}
成员。