asp.net - 从 ASP.NET 网页插入记录时,SQL Server 触发器不会触发

标签 asp.net sql-server triggers

我有一个奇怪的问题。我正在 ASP.NET 中开发一个 Web 应用程序,数据库是 SQL Server Express 2005。我编写了一个触发器,当插入或更新记录时,该触发器会更新另一个表的列值。

这两个表是

  1. InvtVendorInvoices(触发器在此表上,触发器名称为 OnAlter_VendorInvoices)

  2. InvtMaster(此表的列“invtAmtOthers”值从 InvtVendorInvoices 上的触发器更新)

当我从 InvtVendorInvoices 表中的 SQL Server Management Studio Express 插入或更新记录时,InvtMaster 表中的“invtAmtOthers”列值已成功更新。但是,当我从 .aspx 网页插入或更新记录时,触发器不会触发。有趣的是,尝试从网页插入的记录会在 InvtVendorInvoices 表中插入或更新,但触发器不会触发,并且 InvtMaster 表中的“invtAmtOther”列保持不变。

我在互联网上进行了大量搜索,但找不到解决方案。

请帮我摆脱困境......

任何帮助将不胜感激。

我拥有的数据库表是...

USE [Stone]
GO
/****** Object:  Table [dbo].[InvtMaster]    Script Date: 12/10/2009 22:19:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[InvtMaster](
 [invtID] [int] IDENTITY(1,1) NOT NULL,
 [invtDate] [datetime] NULL,
 [invtSupID] [int] NULL,
 [invtRefNo] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [invtRefDate] [datetime] NULL,
 [invtPOID] [int] NULL,
 [invtCurID] [int] NULL,
 [invtPayTermsID] [int] NULL,
 [invtLocationID] [int] NULL,
 [invtNotesPrinted] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [invtNotesInternal] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [invtAmtMaterial] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtTotal]  DEFAULT ((0)),
 [invtAmtFreight] [money] NULL,
 [invtAmtOthers] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtOthers]  DEFAULT ((0)),
 [invtStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtStatusID]  DEFAULT ((0)),
 [invtWflStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtWflStatusID]  DEFAULT ((0)),
 [invtOwnerID] [int] NULL,
 CONSTRAINT [PK_InvtMaster] PRIMARY KEY CLUSTERED 
(
 [invtID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


USE [Stone]
GO
/****** Object:  Table [dbo].[InvtMaster]    Script Date: 12/10/2009 22:23:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[InvtMaster](
 [invtID] [int] IDENTITY(1,1) NOT NULL,
 [invtDate] [datetime] NULL,
 [invtSupID] [int] NULL,
 [invtRefNo] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [invtRefDate] [datetime] NULL,
 [invtPOID] [int] NULL,
 [invtCurID] [int] NULL,
 [invtPayTermsID] [int] NULL,
 [invtLocationID] [int] NULL,
 [invtNotesPrinted] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [invtNotesInternal] [ntext] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 [invtAmtMaterial] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtTotal]  DEFAULT ((0)),
 [invtAmtFreight] [money] NULL,
 [invtAmtOthers] [money] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtAmtOthers]  DEFAULT ((0)),
 [invtStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtStatusID]  DEFAULT ((0)),
 [invtWflStatusID] [int] NULL CONSTRAINT [DF_MaterialInventoryMaster_invtWflStatusID]  DEFAULT ((0)),
 [invtOwnerID] [int] NULL,
 CONSTRAINT [PK_InvtMaster] PRIMARY KEY CLUSTERED 
(
 [invtID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

触发器我有...

USE [Stone]
GO
/****** Object:  Trigger [dbo].[OnAlter_VendorInvoice]    Script Date: 12/10/2009 22:25:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:  Farooq
-- Create date: 10-Dec-09
-- Description: When the Inventory Invoice Is Created, the total amout for all the additional cost is calculated and updated in the invtAmtOthers field in the InvtMaster Table
-- =============================================
CREATE TRIGGER .[dbo].[OnAlter_VendorInvoice] 
   ON  .[dbo].[InvtVendorInvoices] 
   AFTER INSERT,UPDATE
AS 
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

    -- Insert statements for trigger here
 declare @invtID int;
 declare @value float;

 select @invtID=invInvtID from inserted;

 --The ISNULL is used to convert the NULL returned value to ZERO
 select @value=ISNULL(sum(invAmtTotal),0) from InvtVendorInvoices where invInvtID=@invtID;
 --select @value=sum(invAmtTotal) from InvtVendorInvoices where invInvtID=@invtID;

 update InvtMaster set invtAmtOthers=@value where invtID=@invtID;

END

ASPX网页在按钮点击事件上有以下插入记录代码

Dim cmd As New SqlCommand
    cmd.CommandText = "INSERT INTO InvtVendorInvoices (invSupID,invInvtID,invRefNo,invDesc,invDate,invDateDue,invAmtTotal,invNotesInternal) VALUES (@invSupID,@invInvtID,@invRefNo,@invDesc,@invDate,@invDateDue,@invAmtTotal,@invNotesInternal)"
    cmd.Connection = DataHelper.GetConnection

    cmd.Parameters.Add("@invSupID", SqlDbType.Int).Value = e.NewValues("invSupID")
    cmd.Parameters.Add("@invInvtID", SqlDbType.Int).Value = lblInvtID.Text
    cmd.Parameters.Add("@invRefNo", SqlDbType.NVarChar).Value = e.NewValues("invRefNo")
    cmd.Parameters.Add("@invDesc", SqlDbType.NText).Value = e.NewValues("invDesc")
    cmd.Parameters.Add("@invDate", SqlDbType.DateTime).Value = e.NewValues("invDate")
    cmd.Parameters.Add("@invDateDue", SqlDbType.DateTime).Value = e.NewValues("invDateDue")
    cmd.Parameters.Add("@invAmtTotal", SqlDbType.Money).Value = e.NewValues("invAmtTotal")
    cmd.Parameters.Add("@invNotesInternal", SqlDbType.NText).Value = e.NewValues("invNotesInternal")

    cmd.Connection.Open()
    cmd.ExecuteNonQuery()

最佳答案

你怎么知道扳机没有触发?也许触发器确实触发了,但更新没有找到任何满足条件 WHERE invtID=@invtID? 的记录。可能是您从 Management Studio 尝试的测试值在 InvtMaster 中有相应的记录,但当 ASP 页运行代码时,没有记录。

关于asp.net - 从 ASP.NET 网页插入记录时,SQL Server 触发器不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883487/

相关文章:

javascript - 如何在 GridView 文本框中制作点和逗号?

用于 MS SQL Server 的 MySQL "World"数据库

sql - 分区表查询性能慢?

MYSQL 触发器来更正条目

c# - 创建页面的新实例并获取 URL

c# - 硬编码年份表?

javascript - 如何从 ASP.Net 母版页中的外部 JavaScript 调用 Telerik radalert

c# - SQL Server 特定类型支持 OrmLite

c# - 使用 LoginView 触发 UpdatePanel 内的按钮

更新触发器上的 Mysql 更新