Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到SQL-复杂触发器返回错误(如何返回结果)_C#_Linq To Sql_Triggers - Fatal编程技术网

C# Linq到SQL-复杂触发器返回错误(如何返回结果)

C# Linq到SQL-复杂触发器返回错误(如何返回结果),c#,linq-to-sql,triggers,C#,Linq To Sql,Triggers,我希望我解决了触发器的问题。根据所有文档,如果我通过模式回复在C中执行插入或升级,触发器必须返回一个值。这对于简单的触发器很好 如果使用更复杂的触发器,则返回值会出错 如果从触发器选择返回@@identity System.Int32类型的成员,它是一种值类型​​这不允许空值。不能将值赋给Null b如果从触发器返回:从dbo.Table中选择*,其中IDColumn=scope\u identity 使用:C、.NET FW4.5、Linq到SQL、MSSQL Express 2012兼容20

我希望我解决了触发器的问题。根据所有文档,如果我通过模式回复在C中执行插入或升级,触发器必须返回一个值。这对于简单的触发器很好

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

如果从触发器选择返回@@identity

System.Int32类型的成员,它是一种值类型​​这不允许空值。不能将值赋给Null

b如果从触发器返回:从dbo.Table中选择*,其中IDColumn=scope\u identity

使用:C、.NET FW4.5、Linq到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

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

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

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

希望有帮助

这是一个使用ORM的非常简单的操作。只需创建一个新的对象实例并分配所需的变量,执行创建/更新,调用db.saveChanges。之后,您可以通过InsertedObject.ID轻松从对象获取ID。您好,感谢您的反馈。你给我的答案我已经实现了,但是我得到了这个错误。我编辑了问题-C程序中详细信息的代码。在myReposity.Save之后;,你试过调用objCustomObjectFromLinq.ID吗?是的,但是如果我调试代码,当我尝试执行代码myReposity.Save时;我直接跳入异常,在myReposity之后没有任何代码。保存没有被执行。我担心我将不得不放弃触发器。MSSQL和LINQtoSQL中的触发器是不受欢迎的,直到现在我还不能解决上面的问题。
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
    }
}