【发布时间】:2011-10-17 15:00:44
【问题描述】:
我的问题与this 问题非常相似。
但是,我使用的是 SQL Server 2005 Service Pack 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' 失败了。
【问题讨论】:
标签: c# sql clr user-defined-functions