c# - 我如何从 C# 运行 sql server 触发器

标签 c# sql-server

我在单个 sqlserver 表中有多个触发器,有些通过连接不同的字段来创建产品描述,有些从另一个表获取数据,还有一个触发器将产品插入另一个表。

我想运行触发器,在从 C# 中单击按钮时将数据插入另一个数据库表。

这是我的代码,用于将产品插入或设置到另一个表中

Create  TRIGGER [dbo].[WHL-MISYSSETUP] 
    ON [dbo].[WHEELS]
    AFTER insert,UPDATE
    AS 
    BEGIN
     IF TRIGGER_NESTLEVEL() > 1
     RETURN

     ---------------------------------------------------// INSERT PRODUCT INFO TO MASTER TABLE  ----------------------------------------------------------------
 SET ANSI_WARNINGS  OFF;

           BEGIN
   IF NOT EXISTS (SELECT * FROM [MITESTCO].dbo.[MIITEM]  
                   WHERE [MITESTCO].dbo.[MIITEM].itemId IN (select [STOCK NO] from inserted) and [MITESTCO].dbo.[MIITEM].descr IN  (select [PURCHASE DESCRIPTION] from inserted))

  BEGIN
 INSERT INTO [MITESTCO].dbo.MIITEM
   ([itemId], [descr],[xdesc],[sales] ,[uOfM] ,[poUOfM] ,[uConvFact],[ref],[type],[status])--,[unitWgt] 
 SELECT [STOCK NO], [PURCHASE DESCRIPTION2], [SALES DESCRIPTION2], [STOCK NO] ,'EA' ,'EA' ,'1',[WORK INSTRUCTION-WHL], '2','0'--,[APPROX. WGT.]
  FROM [inserted]
 WHERE [STOCK NO] NOT IN (SELECT [itemId] FROM [MITESTCO].dbo.[MIITEM] WHERE itemId NOT LIKE '*-CI')
 AND [MAKE / BUY]='Make';
 END

 END
    SET ANSI_WARNINGS  ON;



        SET ANSI_WARNINGS  off;
           BEGIN
   IF NOT EXISTS (SELECT * FROM [MITESTCO].dbo.[MIITEM]  
                   WHERE [MITESTCO].dbo.[MIITEM].itemId IN (select [STOCK NO] from inserted) and [MITESTCO].dbo.[MIITEM].descr IN  (select [PURCHASE DESCRIPTION] from inserted))

  BEGIN
 INSERT INTO [MITESTCO].dbo.MIITEM
   ([itemId], [descr],[xdesc],[sales] ,[uOfM] ,[poUOfM] ,[uConvFact],[ref],[type],[status])--,[unitWgt] 
 SELECT [STOCK NO], [PURCHASE DESCRIPTION2], [SALES DESCRIPTION2], [STOCK NO] ,'EA' ,'EA' ,'1',[WORK INSTRUCTION-WHL], '2','0'--,[APPROX. WGT.]
  FROM [inserted]
 WHERE [STOCK NO] NOT IN (SELECT [itemId] FROM [MITESTCO].dbo.[MIITEM] WHERE itemId NOT LIKE '*-CI')
 AND [MAKE / BUY]='BUY';
 END
 END
    SET ANSI_WARNINGS  on;



---------------------------------------------------// INSERT PRODUCT INFO TO BOM HEADER TABLE  ----------------------------------------------------------------

    SET ANSI_WARNINGS  OFF;
 DECLARE @d DATETIME = GETDATE();
 INSERT  INTO [MITESTCO].[dbo].[MIBOMH]
   ([bomItem], [bomRev], [rollup], [mult], [autoBuild], [assyLead],[revCmnt],[author],[descr],[qPerLead],[lstMainDt],[revDate],[effStartDate],[ovride] )
   -- DECLARE @d DATETIME = GETDATE();
 SELECT  [STOCK NO], [bomRev], '1', '1', '1', '3','SYNC FROM TV','username','WHL FROM PDM','0', FORMAT(@d, 'yyyy-MM-dd HH\:mm\:ss\.fff', 'en-US') AS 'Format#1',FORMAT(@d, 'yyyyMMdd' , 'en-US') AS 'Format#2',FORMAT(@d, 'yyyyMMdd' , 'en-US') AS 'Format#2','0'
FROM [INSERTED]
 WHERE [STOCK NO]  NOT IN (SELECT [MITESTCO].[dbo].[MIBOMH].[bomItem] FROM [MITESTCO].[dbo].[MIBOMH] where bomRev != [bomRev])
 AND [STOCK NO]  IN (SELECT [MITESTCO].[dbo].[MIITEM].[ItemId] FROM [MITESTCO].[dbo].[MIITEM] where type='2');
   SET ANSI_WARNINGS  ON;
---------------------------------------------------// INSERT PRODUCT INFO TO BOM DETAIL TABLE ----------------------------------------------------------------
    SET ANSI_WARNINGS  OFF;

    ;with cte as (
   select 
    [STOCK NO]    
  , u.rev
  , bomEntry = row_number() over (order by u.ordinal)
  , u.Partid
  , u.Qty--='1'
  , cmnt = ''
  , srcLoc = 'DS'
  , dType = '0'
  , lead = '0'
  , lineNbr = row_number() over (order by u.ordinal)
  --, bomRev
from [inserted]
  cross apply (values 
     ('1',[bomRev],1,[BOM-WHEEL PN])
    ,('1',[bomRev],2,[BOM - RIM PN])
    ,('1',[bomRev],3,[BOM - SECONDARY DISC PN])
    ,('1',[bomRev],4,[BOM - FIN DISC PN])
    ,('1',[bomRev],5,[BOM - FLAT FIN DISC PN])
    ,([WHL BOM QTY 1],[bomRev],6,[WHL BOM PART 1 PN])
    ,([WHL BOM QTY 2],[bomRev],7,[WHL BOM PART 2 PN])
    ,([WHL BOM QTY 3],[bomRev],8,[WHL BOM PART 3 PN])
    ,([WHL BOM QTY 4],[bomRev],9,[WHL BOM PART 4 PN])
    ,([WHL BOM QTY 5],[bomRev],10,[WHL BOM PART 5 PN])
    ,('1',[bomRev],11,[COLOR-PN])
  ) u (Qty,rev, ordinal, partId)
where nullif(u.partId, '') is not null 
)
INSERT INTO [MITESTCO].dbo.[MIBOMD] 
   ([bomItem], [bomRev], [bomEntry], [partId], [qty],[cmnt],[srcLoc],[dType],[lead],[lineNbr])
   select 
    cte.[STOCK NO]
  , cte.rev
  , cte.bomEntry
  , cte.Partid
  , cte.Qty
  , cte.cmnt
  , cte.srcLoc
  , cte.dType
  , cte.lead
  , cte.lineNbr
from cte
where not exists (
    select 1
    from [MITESTCO].dbo.[MIBOMD] w
    where w.[bomItem] = cte.[STOCK NO]
      and w.[bomRev]  = cte.rev
      and w.[bomEntry]= cte.bomEntry
  );
SET ANSI_WARNINGS  ON;
---------------------------------------------------// end Creates BOM STRUCTURE ----------------------------------------------------------------

我想手动或在按钮单击事件上运行它的主要原因是由于某种原因这个触发器在计算字段和一些触发器之前运行所以我没有得到完整的信息插入到另一个表中插入或更新后的第一次。我试过了同样的问题

当创建或更新新产品时,我想在按钮 click_event 上从 C# 运行它。任何想法将不胜感激

最佳答案

无法调用触发器。在您的情况下,它们应该自动触发每一行: 插入后,更新。

如果您需要在单击某个按钮后运行此查询,我建议您不要使用触发器,而是创建一个新的存储过程。 这里的问题是,您必须在不使用插入表的情况下知道需要更新的 [STOCK NO] 是什么。

关于c# - 我如何从 C# 运行 sql server 触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45123898/

相关文章:

c# - 单例与 ServiceLocator

sql-server - 更改在 SQL Server 2008 R2 中复制的表

c# - 请求失败,HTTP 状态为 401 : Unauthorized IN SSRS

c# - 存储过程看不到在同一连接中创建的临时表

java - 使用 JDBC 将字符串作为 datetime2(0) 插入 SQL Server 2012 会导致错误

SQL Server 其中 start_date 和 End_date 之间的日期

c# - 如何使用连接从 linq 结果中获取所有列

c# - .net 成员(member)提供商使用什么加密算法?

c# - NHibernate session 管理和延迟加载

c# - 使用生成的 Golang DLL 返回字符串或 *C.Char