【发布时间】: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