Моя проблема очень похожа на эту проблему.
Однако я использую 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,
Версия = 2.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 '
не удалось.