【问题标题】:Linq to SQL - complex trigger returned errors (how return results)Linq to SQL - 复杂触发器返回错误(如何返回结果)
【发布时间】:2013-03-17 12:18:49
【问题描述】:

我希望我解决了触发器的问题。根据所有文档,如果我在 C#(通过模式 Reposity)中进行插入或升级,触发器必须返回一个值。这适用于简单的触发器。

如果我使用更复杂的触发器,返回值会出错。

a) 如果从触发器返回 SELECT @@identity;

System.Int32 类型的成员,这是一种不允许空值的值类型。您不能为 Null 赋值。

b) 如果从触发器返回:select * from dbo.Table where IDColumn = scope_identity();

Operation failed AutoSync member. In order to perform after insertion members operation
AutoSynced must have a type either automatically generated identity, or a key that does
not change the database after the insertion.

使用:C#、.NET FW4.5、Linq to SQL、MSSQL Express 2012(兼容性 2008)

我会很高兴以及有关触发器和链接到 SQL 的问题的指示。

更复杂的触发器(已清理并减少到最低限度):

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[bitrgTable] 
   ON [dbo].[Table]
   INSTEAD OF INSERT 
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT OFF;        

    -- Declare variables
    DECLARE @new...

    -- Get inserted values
    SELECT @new... FROM INSERTED  

    -- do update all unique values
    UPDATE [dbo].[Table] SET
         ...
    WHERE 
        ...;

    -- if the last result is null
    IF @@ROWCOUNT = 0 
    BEGIN
        -- Do insert new values
        INSERT INTO [dbo].[Table]
            (...)
        SELECT 
             ...
        FROM INSERTED
    END

    -- somehow return the result
    -- ----------------------------------------------------------------
    -- select * from dbo.table where TableID = scope_identity();
    -- SELECT @@identity;   
    SELECT ??????
END

最好的问候,彼得

基于 Ismet Alkan 补码问题的答案。

// Reposity class
public class Reposity
{
  private DataContext myDataContext = new DataContext();

  public void Save()
  {
    myDataContext.SubmitChanges();
  }
}

// Where working with reposity (class in console app)
public class ConsoleShell
{
   // declare variable
   Reposity myReposity = new Reposity();

  // Many methods, working with treads etc,

  // here I worked with Save()
  private void ExecuteThread(....)
  {
    ...

    // go thŕow all found results
    foreach (KeyValuePair<Oid, AsnType> kvpDot1dTpFdbAddress in dictDot1dTpFdbAddress)
    {
      // create new object instance
      CustomObjectFromLinq objCustomObjectFromLinq = new CustomObjectFromLinq();

      // append values for objCustomObjectFromLinq

      if(CONDITION == TRUE)
      {
        // save item
        myReposity.Add(objCustomObjectFromLinq);
        myReposity.Save();
      }
      else
      {
        // if want ignore result, do nothing, prevent object null
        objCustomObjectFromLinq = null;
      }

      .. next codes

    } -- end foreach
  } -- end method
} -- end class

【问题讨论】:

  • 这是一个使用 ORM 的非常简单的操作。只需创建对象的新实例并分配所需的变量,创建/更新,调用 db.saveChanges()。之后,您可以通过 yourInsertedObject.ID 从对象中轻松获取 ID。
  • 您好,感谢您的反馈。你给我的答案我已经实现了,但是我得到了这个错误。我编辑了问题 - C# 程序中详细信息的代码。
  • 在“myReposity.Save();”之后,您是否尝试过调用 objCustomObjectFromLinq.ID?
  • 是的,但是如果我调试代码,当尝试执行代码 myReposity.Save();在 myReposity.Save() 未执行后,我直接跳入异常并且没有任何代码。
  • 恐怕我不得不放弃触发器了。不喜欢 MSSQL 和 Linq to SQL 中的触发器(直到现在我无法解决上述问题)。

标签: c# linq-to-sql triggers


【解决方案1】:

我尝试了你提到的方法。但是,这需要付出巨大的努力,您真的不需要解决这个问题。我在这里没有给出确切的答案,而是我的工作方式。

您正在创建一个具有DataContext 作为属性的类。我认为最好创建一个继承它的类。我在我的 ASP.NET MVC3 应用程序中使用了DbContext,而不是DataContext,但我不知道是否有很大的不同。另一件事是:我不直接将元素添加到上下文中,而是将其添加到上下文中的DBSet。这是我的上下文类。

public class YourDBContext : DbContext
{
    public DbSet<YourObject> YourObjects { get; set; }
}

操作上下文:

public class TheClassYouOperate
{
    private YourDBContext yourDBContext = new YourDBContext();

    public int SaveAndReturnID(YourObject newObject)
    {
        if (ModelState.IsValid) // or CONDITION == TRUE for your case
        {
            yourDBContext.YourObjects.Add(newObject);
            yourDBContext.SaveChanges();
            return newObject.ID;
        }
        return 0; // or null or -1, whatever the way you'll understand insertion fails
    }
}

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多