我正在开发一个C#SQL Server 2005存储过程,它为我的应用程序进行数据验证。我有一个很好的框架,这是有效的。验证方法如下:
private void TestDate() {
TestFields(delegate (string value) {
if (value == String.Empty || value == "")
return true;
return IsDate(value);
});
}
该解决方案使用如上所述编写的几种方法编译,部署和运行。 TestFields迭代查询返回的列,调用委托,返回是否通过了有效性测试。我添加了一个新方法:
private void TestRequired() {
TestFields(delegate (string value) {
return ! (value == String.Empty || value == "");
});
}
使用此方法,DLL将不会部署:CREATE ASSEMBLY失败,因为安全程序集“SurveyValidation”中类型“SurveyValidator”上的方法“TestRequired”正在存储到静态字段。安全组件中不允许存储到静态字段。
我正拔出头发。如果我注释掉TestRequired(),它就可以了。显然,它没有做一个赋值语句,所以我不知道SQL Server在抱怨什么。我是不是偶然发现了某种晦涩的错误? (我知道错误意味着什么,我在SP类中没有任何静态字段。只是创建项目的静态输入方法给你。)TIA, 戴夫
答案 0 :(得分:5)
答案 1 :(得分:0)
我认为这个答案可以说我对CLR SP不太熟悉
value == String.Empty || value == ""
是不是同义词,有效地测试两次相同的事情? String.IsNullOrEmpty似乎是一个更好的选择(但是,这是另一个静态引用...继续阅读)。
与此相反,我倾向于删除任何静态引用。 String.Empty似乎是这个问题的潜在候选者,所以我至少要删除它以测试它是否导致问题。所以也许测试可以改为:
return value != "";
或者也许:
return value != "" && value != null;
答案 2 :(得分:0)
我遇到了类似的问题,并将程序集的Permission Set属性更改为" Unsafe"。这使我可以将CLR代码部署到SQL服务器而不会出现任何问题。
请注意,我的包装程序集也必须使用Unsafe进行部署,以确保"完全信任"特权。 (起初我不直观地认为不安全的装配得到了充分的信任。)