Я надеюсь, что это поможет вам в трудную минуту. Я просидел слишком много часов, пытаясь устранить это.

роблема очень похожа наэто вопрос.

Однако я использую SQL Server 2005 с пакетом обновления 2 (SP2) (v9.0.3042), и опубликованное там решение не работает для меня. Я пытался использовать обе строки подключения. Один закомментирован в моем коде.

Я понимаю, что могу сохранить все результаты в List или ArrayList в памяти и вернуть их. Я сделал это успешно, но это не цель здесь. Цель состоит в том, чтобы иметь возможность передавать результаты по мере их доступности.

Возможно ли это с помощью моей версии SQL Server?

Вот мой код: (Обратите внимание, что параметры на самом деле не используются в настоящее время. Я сделал это для отладки)

public static class StoredProcs
{
    [SqlFunction(
        DataAccess = DataAccessKind.Read,
        SystemDataAccess=SystemDataAccessKind.Read,
        FillRowMethodName="FillBaseline",
        TableDefinition = "[baseline_id] [int], [baseline_name] [nvarchar](256), [description] [nvarchar](max), [locked] [bit]"
        )]
    public static IEnumerable fnGetBaselineByID(SqlString projectName, SqlInt32 baselineID)
    {
        string connStr = "context connection=true";
        //string connStr = "data source=.;initial catalog=DBName;integrated security=SSPI;enlist=false";
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(String.Format(@"
                SELECT *
                FROM [DBName].[dbo].[Baseline] WITH (NOLOCK)
            "), conn))
            {
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        yield return new Baseline(reader);
                    }
                }
            }
        };
    }

    public static void FillBaseline(Object obj, out SqlInt32 id, out SqlString name, out SqlString description, out bool locked)
    {
        Baseline baseline = (Baseline)obj;
        id = baseline.mID;
        name = baseline.nName;
        description = baseline.mDescription;
        locked = baseline.mLocked;
    }
}

Вот часть моего сценария развертывания SQL:

CREATE ASSEMBLY [MyService_Stored_Procs]
FROM 'C:\temp\assemblyName.dll'
WITH PERMISSION_SET = SAFE

Когда я использую строку подключения "context connection = true", я получаю эту ошибку:

Произошла ошибка при получении новой строки из определенной пользователем таблицы. Функция: System.InvalidOperationException: доступ к данным в этом контексте запрещен. Либо контекст является функцией или методом, не помеченным DataAccessKind.Read или SystemDataAccessKind.Read, либо является обратным вызовом для получения данных из метода FillRow функции с табличным значением, либо является методом проверки UDT.

Когда я использую другую строку подключения, я получаю эту ошибку:

Произошла ошибка при получении новой строки из определенной пользователем табличной функции: System.Security.SecurityException: запрос разрешения типа 'System.Data.SqlClient.SqlClientPermission, System.Data, Version = 2.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089 'не удалось.

Ответы на вопрос(1)

Ваш ответ на вопрос