【问题标题】:C# CLR Stored Proc won't Deploy to SQL Server 2005C# CLR 存储过程不会部署到 SQL Server 2005
【发布时间】: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


【解决方案1】:

在你的类声明前添加CompilerGeneratedAttribute

此属性允许 SQL 服务器 参考编译器生成的静态 价值观。

我知道这听起来有点不正统,但这样做完全可以。

【讨论】:

  • 顺便说一句,神秘的静态是由于您的匿名委托而生成的,使用显式委托的 afaik 不需要这种解决方法。
  • 谢谢莱姆斯。我会试试的。令人困惑的是,还有 3 个类似的函数,都使用匿名委托来执行测试。在类 decl 之前添加 [CompilerGeneratedAttribute()] 似乎可以解决问题。谢谢!
  • 这看起来很邪恶(以一种好的方式)。有点奇怪的用法,我认为“有效”比“有效”更准确,但是:非常感谢,谢谢。
【解决方案2】:

我的回答是说我对 CLR SP 不太熟悉

value == String.Empty || value == "" 不是重言式,有效地测试同一件事两次吗? String.IsNullOrEmpty 似乎是一个更好的选择(但是,这是另一个静态引用......请继续阅读)。

与此相反,我倾向于删除任何静态引用。 String.Empty 似乎是这个问题的潜在候选者,所以我至少会删除它以测试它是否导致问题。所以也许测试可以改为:

return value != "";

或许:

return value != "" && value != null;

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,并将程序集的权限集属性更改为“不安全”。这让我可以毫无问题地将 CLR 代码部署到 SQL 服务器。

    请注意,我的包装程序集也必须使用 Unsafe 进行部署,以确保“完全信任”权限。 (起初我觉得 Unsafe 程序集得到完全信任是不直观的。)

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2019-08-19
      • 2012-12-31
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多