【问题标题】:CLR Trigger Unresolved reference errorCLR 触发器未解决的引用错误
【发布时间】:2016-08-04 20:08:14
【问题描述】:

我正在尝试创建一个将列值更改为大写的 CLR 触发器。 但是当我尝试构建文件时,我得到以下信息:

Severity    Code    Description Project File    Line    Suppression State
Error       SQL71501: Trigger: [dbo].[UpperTrigger] has an unresolved reference to object [dbo].[tblAirline].   TravelSight \\mac\home\documents\visual studio 2015\Projects\TravelSight\TravelSight\obj\Debug\TRAVELSIGHT.generated.sql    33  

我的clr代码如下:

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public partial class Triggers
{
    // Enter existing table or view for the target and uncomment the attribute line
    [Microsoft.SqlServer.Server.SqlTrigger(Name = "UpperTrigger", Target = "[dbo].[tblAirline]", Event = "AFTER INSERT, UPDATE")]
    public static void UpperTrigger ()
    {
        // Open connection for context
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = "Context Connection=true";

        // Create command object
        SqlCommand command = new SqlCommand();
        command.Connection = conn;

        // Create string that defines sql statement
        string sql = 
         "Update tblAirline " +
        "SET AirlineName = UPPER(AirlineName) " +
        "WHERE AirlineID IN(SELECT AirlineID FROM Inserted)";
        command.CommandText = sql;

        // Exec command object
        command.ExecuteNonQuery();

        // Close connection object
        conn.Close();

    }
}

我在这里错过了什么?

【问题讨论】:

  • 1.为什么使用 CLR 触发器而不是 tsql 触发器? 2. 为什么它的上位(sql server 不区分大小写)很重要?
  • 如果有的话,你有没有这个名称的表 tblAirline,而不是尝试使用这个 tblAirline 而不是这个 [dbo].[tblAirline]
  • SQL 可能区分大小写 - 这取决于您的排序规则。在这里查看:msdn.microsoft.com/en-us/library/ms144250(v=sql.105).aspx
  • 基于此问题以及您最近提出的其他 SQLCLR 问题,很明显您目前正在学习 .NET 和 SQL Server,这是基于术语、SQL Server 概念和 C# 概念的错误。您正在以错误的顺序学习这些内容:SQLCLR 在 SQL Server 中使用 .NET,因此在继续学习 SQLCLR 的高级主题之前,您需要更好地掌握 C# 和 T-SQL。当你对两者有了更好的了解后,再看看我正在写的关于 SQLCLR 的系列文章:Stairway to SQLCLR(需要免费注册)。
  • @Andez 不太可能是排序规则问题,因为此错误来自 Visual Studio / SSDT。

标签: c# sql-server triggers sqlclr


【解决方案1】:

错误消息来自 Visual Studio / SSDT。

错误的最可能原因是在项目中定义了SqlTrigger 属性的Target 属性中引用的表。您需要向项目中“添加新项目”,然后选择“表格”。添加表tblAirline,与数据库中存在的完全相同,因为任何差异都会在您部署时传播到数据库。

其他说明:

  • 请将new SqlConnection 实例化放在using(){ } 构造中,因为它是一次性对象。
  • 请将new SqlCommand 实例化放在using(){ } 构造中,因为它是一次性对象。
  • 最好不要在表名前加上tbl。这种不好的做法没有好处。您也不应该在视图名称前加上 vvw 或其他任何东西。
  • 除了调用 T-SQL 之外,请不要使用 SQLCLR。我当然希望这是一个课堂练习/家庭作业,并且永远不会打算有一天真正投入生产,因为它比您在此触发器中执行的简单 T-SQL 查询更慢且更难维护。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 2017-01-10
    • 2012-06-02
    • 2015-06-07
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多