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