[Microsoft.SqlServer.Server.SqlProcedure]
public static void MyMethod()
{
string connectionString = "context connection=true";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlMetaData[] metaData = {
new SqlMetaData("Column1", System.Data.SqlDbType.NVarChar)
,new SqlMetaData("Column1", System.Data.SqlDbType.NVarChar)
};
SqlDataRecord record = new SqlDataRecord(metaData);
record.SetString(0,"hello world");
SqlContext.Pipe.SendResultsRow(record);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在SQL中运行该方法时
EXEC MyMethod
错误
消息6522,级别16,状态1,过程MyMethod,行0在执行用户定义的例程或聚合"MyMethod"期间发生.NET Framework错误:System.ArgumentException:dbType NVarChar对此构造函数无效.System.ArgumentException:在Microsoft.SqlServer.Server.SetaMetaData.ctor的Microsoft.SqlServer.Server.SqlMetaData.Construct(String name,SqlDbType dbType,Boolean useServerDefault,Boolean isUniqueKey,SortOrder columnSortOrder,Int32 sortOrdinal)(String name,SqlDbType dbType) )在WcfClrApps.MyNamespace.MyMethod()
如何归还我自己制作的唱片?我不想运行任何SQL.项目构建是为.NET 3.5设置的.SQL 2008 R2中不支持MSDN表示4.0.
我已经深入研究了SQL clr编程.不幸的是,我的第一次尝试很困难.我的C#汇编代码就是这样:
enter code here
public partial class FirstCLRRoutines
{
public static int GetCLRFrameworkMajorVersion()
{
return System.Environment.Version.Major;
}
}
Run Code Online (Sandbox Code Playgroud)
而SQL代码是:
USE master
GO
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine]
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll'
Run Code Online (Sandbox Code Playgroud)
但是我从MSSMSE收到此错误消息:
Msg 6218,Level 16,State 3,Line 1
CREATE ASSEMBLY for assembly'SQL_CLR'失败,因为程序集'SQL_CLR'验证失败.检查引用的程序集是否是最新的并且在数据库中是否可信(对于external_access或unsafe).CLR Verifier错误消息(如果有)将遵循此消息
编辑3.5(意味着将项目3放在上一次更新中,但忽略了.唉......)
看看程序集注册如何解决我的问题并查看我能从ProcExplorer跟踪中推断出的有限信息让我对一些事情做出了一些结论.没有解决方案,只有一些推论
1.微软希望在某些时候允许加载Framework 2.0程序集.我做出这样的推断是基于如果它们完全受限于排除它们的概念,验证可能会失败并立即检查程序集的框架元数据.如果在2008R2中加载4.0程序集也会失败 - 相反的是严厉的和特定的错误,并说Thou Shalt Not Do.
2.如果我执行升级到包含2.0程序集的2008R2数据库,则会加载程序集,并在SQL 2012数据库中触发其中的函数.因此,执行基于2.0的程序集的能力非常强.让它们通过加载器是诀窍 - 因此强化了我的信念,即发现一个突然在CLR中启用2.0框架组件的补丁或SP并不会让我感到惊讶.
3. 我相信,无论是通过故意更改还是错误,PERMISSION _ SET = UNSAFE所暗示的某些验证语义在SQL2012中已经发生了变化.我的经验使我相信SQL Server的CLR Verifier的早期版本执行了相当于指定PEVERIFY /MDwhen的PERMISSION_SET = UNSAFE时间(不检查非托管指针之类的东西),以及PEVERIFY /IL何时不执行.但是,在我看来,在SQL 2012中,CLR Verifier执行的PEVERIFY /IL 不管 UNSAFE权限标志如何.我很想知道是否有人可以验证这个理论*
EDIT2
在继续研究这个问题之后,我还没有找到一个解决方案,不能改进项目以使用微软几年前创建的现已弃用的System.Data.OracleClient提供程序.此外,进一步的研究和电子邮件让我相信至少有一两个"电池未包含"的注意事项,关于SQL 2008R2和SQL 2012之间的程序集验证的更改 - 而这个程序集似乎正好指向了这一点.关于SQLCLR程序集注册问题的一些博客帖子已经导致断言验证过程中没有任何内容发生变化,但是在两个数据库之间注册相同的程序集已经产生了另外一个令人费解的问题.我无法找到SQLServer如何验证程序集,所以此刻,我继续在黑暗中搜索一些解决方案(好吧,完全)...*
我们的MS SQL Server数据库中存在一个长期存在的SQLCLR项目,该项目对Oracle数据库进行各种关键查询.该项目已经运行了大约六年,已经从SQL 2005中的32位程序集迁移到MS SQL Server 2008 R2的64位程序集.
尽管MS SQL 2012升级顾问仅指出了SQLCLR迁移对某些地理类型的一般性问题,但我怀疑这种迁移可能确实存在问题.果然,我发现将这个项目迁移到SQL Server 2012现在正在呈现我担心的难题.
当试图注册这个相同的64位Oracle.DataAccess.dll(2.112.1.0)时,它已经在SQL Server 2008R2(及其祖先)中幸福地生活了一段时间,数据库现在建议程序集"验证失败".编辑:我的理解一直是授予UNSAFE权限的程序集不会通过验证检查.这不正确吗?
以下是错误响应的摘录:
[ : Oracle.DataAccess.Client.OracleDatabase::Startup][mdToken=0x6000021][offset 0x00000048][found unmanaged pointer][expected readonly address of value 'Oracle.DataAccess.Client.OpoConValCtx'] Unexpected type …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码创建CLR存储过程.我正在创建程序集.它显示了以下问题.我的目标框架是4.0.sql server是2008 r2
SQL代码:
create assembly SampleSearch from 'E:\CLR Files\Sample\ElasticSearch.dll'
Run Code Online (Sandbox Code Playgroud)
错误信息:
程序集"ElasticSearch"的CREATE ASSEMBLY失败,因为程序集是为不支持的公共语言运行时版本构建的.
我正在尝试帮助一个有SQL CLR相关问题的私人朋友(现在也是客户).他有一个SQL Server,其数据库中嵌入了3个.NET程序集.他让我帮他从数据库中提取程序集,并将它们保存为磁盘上的.dll文件.这甚至可能吗?
我在SQL2005数据库中有一个负载很重的表(许多插入/更新/删除).我想尽可能接近实时地对所有这些更改进行一些后期处理(异步以便不以任何方式锁定表).我看了很多可能的解决方案,但似乎无法找到一个感觉正确的整洁解决方案.
后期处理的类型也相当繁重,以至于Windows侦听器服务实际上将处理传递给许多机器.然而,应用程序的这部分已经启动并运行,完全异步,而不是我需要帮助 - 我只是想提及这只是因为它影响设计决策,因为我们不能只加载一些CLR对象DB完成处理.
所以,简单的问题仍然存在:表中的数据更改,我想在远程服务器上的c#代码中进行一些处理.
目前我们已经提出使用一个sql触发器,它执行"xp_cmdshell"来启动一个引发windows服务正在侦听的事件的exe.这只是感觉很糟糕.
但是,我在网上看到的其他解决方案也让人感到相当费解.例如,设置SQLCacheDependancy还涉及必须设置Service Broker.另一个可能的解决方案是使用CLR触发器,它可以调用Web服务,但是这里有很多关于它的警告,这是一个糟糕的方法,尤其是在性能至关重要时.
理想情况下,我们不会对表格进行更改,而是会拦截我们的应用程序中的调用并从那里通知服务,遗憾的是,虽然我们有一些遗留应用程序也会对数据进行更改,并且监视表格是唯一的集中位置此时此刻.
非常感激任何的帮助.
摘要:
我已经在SQL服务器中使用了CLR存储过程一段时间了,但我仍然想知道使用它们的最佳情况是什么.
MSDN提供了一些使用指南,如重字符串操作(正则表达式),或替换声明了许多表变量和游标的T-SQL.我很想知道用户使用CLR存储过程解决了哪些问题,以及示例/基准测试.
例如,我发现CLR存储过程+ SSRS是一种很好的方法,可以将数据操作逻辑从SSRS和T-SQL中分离出来,并变成易于读取和操作的托管代码.
我非常希望,由于SQL Server 2012 SQLCLR支持.NET 4.0,SQL Server Reporting Services(SSRS)2012将支持.NET 4.0自定义代码程序集.尝试上载引用.NET 4.0程序集的rdl(通过报表管理器或通过RSBuild)时,Reports Manager会引发错误说明
此程序集由比当前加载的运行时更新的运行时构建,无法加载.(rsErrorLoadingCodeModule)
我可以配置一些东西来让SSRS 2012加载.NET 4.0程序集吗?在我们看到.NET 4.0支持SSRS中的自定义程序集之前,我们是否会等到SQL Server的下一个主要版本?
我当前的观点是否定的,更喜欢Transact SQL存储过程,因为它们的重量较轻且(可能)性能更高,而CLR程序允许开发人员应对各种恶作剧.
但是最近我需要调试一些写得很差的TSQL存储过程.像往常一样,我发现许多问题是由于原始开发人员开发人员没有真正的TSQL经验,他们是以ASP.NET/C#为重点.
因此,使用CLR过程首先会为这类开发人员提供更熟悉的工具集,其次,调试和测试工具更强大(即Visual Studio而不是SQL Management Studio).
我很想听听你的经历,因为它似乎不是一个简单的选择.
我有一个想要部署的SQL CLR DLL,但是发现你可以将字节流/ varbinary_literal/varbinary_expression/assembly位嵌入到文本文件中,以解决打包DLL并确保它可以访问CREATE ASSEMBLY的麻烦麻烦命令.
但我还没有找到如何获得字节流/ varbinary_literal/varbinary_expression /汇编位值.我没有找到任何一致的术语,以及我在使用中发现的内容Load().
救命?