CLR触发器未解决的参考错误

时间:2016-04-13 15:39:29

标签: c# sql-server triggers sqlclr

我正在尝试创建一个将列值更改为大写的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 个答案:

答案 0 :(得分:2)

错误消息来自Visual Studio / SSDT。

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

其他说明:

  • 请将new SqlConnection实例放在using(){ }构造内,因为它是一次性对象。
  • 请将new SqlCommand实例放在using(){ }构造内,因为它是一次性对象。
  • 最好停止使用tbl为表名添加前缀。这种不良做法没有好处。您也不应使用vvw或其他任何内容为视图名称添加前缀。
  • 除了调用T-SQL之外,请不要使用SQLCLR。我确定希望这是一个课堂练习/家庭作业,并且永远打算在某一天真正去生产,因为它比你在这个Trigger中执行的简单T-SQL查询更慢,更难维护。 / LI>