如何使用ADO.NET创建数据库触发器

时间:2015-06-28 01:40:21

标签: c# sql-server ado.net database-trigger sqlcommand

我正在尝试使用SqlCommand创建触发器,我收到错误:

  

关键字'触发'

附近的语法不正确

当我在SQL Server中复制相同的查询时,它正在成功执行。
以下是SQL命令的外观。

command.CommandText = "CREATE TRIGGER tr_Korisnik" + korisnik.KorisnikID + "_FakturaStavka_ForInsert " +
                        "on Korisnik"+korisnik.KorisnikID+"_FakturaStavka " +
                        "FOR INSERT " +
                        "AS " +                            
                        "BEGIN " +
                        "DECLARE @ID int " +
                        "DECLARE @FakturaID int " +
                        "DECLARE @StavkaBr int " +
                        "SET @ID = (SELECT DokumentID from inserted) " +
                        "SET @FakturaID = (SELECT FakturaID from inserted) " +
                        "UPDATE Korisnik"+korisnik.KorisnikID+"_Fakturi SET BrStavki = BrStavki+1 WHERE DokumentID = @FakturaID " +
                        "SET @StavkaBr = (SELECT Korisnik"+korisnik.KorisnikID+"_Fakturi.BrStavki FROM Korisnik"+korisnik.KorisnikID+"_Fakturi WHERE DokumentID = @FakturaID) " +
                        "UPDATE Korisnik"+korisnik.KorisnikID+"_FakturaStavka SET StavkaBroj =  @StavkaBr WHERE DokumentID = @ID END";


command.ExecuteNonQuery();

此外,上面我有CREATE TABLE的SQLCommands,它们正常工作。

我在USE [databasename]之前尝试了CREATE TRIGGER,但仍然没有。 我删除了连接+"korisnik.KorisnikID"并创建了干净的名称,仍然无法执行它。

3 个答案:

答案 0 :(得分:1)

documentation for ExecuteNonQuery表示

  

您可以使用ExecuteNonQuery执行目录操作(例如,查询数据库的结构或创建数据库对象,例如表),或者通过执行UPDATE,INSERT或更改数据库而不使用DataSet来更改数据DELETE语句。

哪种证实了我的怀疑:你无法以这种方式创建触发器。

如果要在代码中创建触发器,请使用CLR Trigger

答案 1 :(得分:1)

您可以在数据库中创建存储过程以创建触发器,然后传递正确的参数。使用ado.net调用存储过程并传递params。

答案 2 :(得分:0)

就像已经提到的那样,应该在设计时创建触发器。 不过,ExecuteNonQuery可以做到如下。

使用EXEC语句和存储过程sp_executesql

cmd.CommandText = "EXEC sp_executeSQL N'CREATE TRIGGER myTrigger ON myTable...'";
cmd.ExecuteNonQuery();