我有一个奇怪的问题。我正在 ASP.NET 中开发一个 Web 应用程序,数据库是 SQL Server Express 2005。我编写了一个触发器,当插入或更新记录时,该触发器会更新另一个表的列值。
这两个表是
InvtVendorInvoices(触发器在此表上,触发器名称为 OnAlter_VendorInvoices)
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/