我在SQL Project中创建了一个User Defined函数。此C#方法需要能够在同一数据库中调用存储过程。我该怎么做呢?
答案 0 :(得分:2)
在这个UDF中,我再调用一个名为'GetLookup'的内部方法。但是因为GetLookup需要访问数据库,所以调用方法,在这种情况下,UDF需要这些属性来解决任何访问问题。
(变量名等不是我用过的实际名称)
private static int GetLookup(int id_Lookup)
{
try
{
using (SqlConnection sqlConn = new SqlConnection("Context Connection=true"))
{
sqlConn.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = "uspApp_GetLookup";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConn;
cmd.Parameters.AddWithValue("ID_Lookup", ID_Lookup);
SqlParameter parameter = new SqlParameter("OutputValue", null);
parameter.DbType = DbType.Int32;
parameter.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();
if (cmd.Parameters != null && cmd.Parameters["ID_OutputValue_Account"] != null)
{
return int.Parse(cmd.Parameters["OutputValue"].Value.ToString());
}
return -1;
}
}
}
catch
{
throw;
}
}
答案 1 :(得分:0)
您的SQL项目中的用户定义函数不在c#中,而是在SQL中。 如果你用c#编写,那么你的问题没有意义。
如果您想从c#调用存储过程,那么您需要查看ado.net 命名空间是System.Data.SQLClient
答案 2 :(得分:0)
假设你在谈论Managed / CLR user defined function,我认为你不能。
我能想到的唯一方法是,如果你从UDF中创建一个到sql server的新连接 - 我不能确定这会起作用,但我确信这个会是一个坏主意 - 不要这样做!
我不得不问 - 你为什么要这样做呢? CLR UDF的存在是为了在存储过程中使用托管代码的小片段(例如正则表达式),而不是处理大型结果集(这是SQL通常非常擅长的一件事)
答案 3 :(得分:0)
如果需要在数据库内的已编译C#方法中调用SP,则必须问自己设计是否有问题。管理代码不是为了重新编写Transact-SQL而是为了补充它本身无法做到的少数思想。
如果您需要拨打SP,那么您的代码应该在另一个SP中。如果你没有说出更多的细节,那就很难决定。