【发布时间】:2009-10-21 01:03:56
【问题描述】:
我正在开发一个 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, 戴夫
【问题讨论】:
-
坦率地说,这似乎(至少在我看来)滥用了 CLR 存储过程的用途
-
你可以调用
String.IsNullOrEmpty而不是分别检查null和""。 -
你知道 String.Empty 和 "" 是一回事,对吧?您的意思是让其中一个为空吗?
-
我想当我加入 value == "" 子句时,我正在考虑处理 DBNulls 和空字符串。我意识到我已经在另一个地方处理了 DBNulls。在我测试并尝试解决此问题的其中一个版本中,委托中的唯一声明是“返回真”;它仍然失败。 @Mitch,如果 CLR procs 不是用来做你在 T-SQL 中不能做的事情,那么它们有什么用? proc 验证多个表中的多个列,并且在 T-SQL 中没有简单的方法来做到这一点(手动编写超过 400 个测试)。
-
我在尝试将其他东西部署到它正在访问但实际上并未修改静态属性的地方时遇到了同样的错误。
标签: c# sql-server-2005 stored-procedures clr