ОК, так что я понял это. Что мне нужно было сделать, так это получить доступ к хранимой процедуре SQL в определяемой пользователем функции управляемого CLR. И да, это может звучать как проблема с плохим дизайном, но в моем приложении мне нужно быстро просмотреть свой UDF, после нескольких дней обдумывания пути обхода этого (дизайна) другого пути просто нет. Итак, вот код того, как я это сделал, UDF, который вызывается из SQL, должен иметь следующие атрибуты над сигнатурой метода:
[Microsoft.SqlServer.Server.SqlFunction (DataAccess = DataAccessKind.Read, SystemDataAccess = SystemDataAccessKind.Read)] * 1001 *
В этом 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;
}
}