【发布时间】:2015-02-24 16:15:17
【问题描述】:
我有一个 Web 表单 aspx 页面,用于使用具有三个强制参数的存储过程将新客户端添加到客户端表。这是程序:
CREATE PROCEDURE [dbo].[proc_NewClient]
@ClientCode VARCHAR (12)
, @ClientName VARCHAR (100)
, @ClientPhone VARCHAR (20)
AS
INSERT INTO Client (
ClientCode
, ClientName
, ClientPhone
)
VALUES (
@ClientCode
, @ClientName
, @ClientPhone
)
桌子:
CREATE TABLE [dbo].[Client]
( [ClientID] INT IDENTITY (1, 1) NOT NULL
, [ClientCode] VARCHAR (12) NOT NULL
, [ClientName] VARCHAR (100) NOT NULL
, [ClientPhone] VARCHAR (20) NOT NULL
)
ON [PRIMARY]
ClientID 是从 ClientContact 表中作为其外键引用的。
如果我使用像
这样的程序exec proc_NewClient 'somecode','somename','5551212'
它在 Toad 中工作正常(尽管插入将接受一个空字符串,这令人费解)。然而,在 aspx 页面后面的 VB.NET 代码中,代码在此处中断:
Dim conSTR As String = ""
conSTR = System.Configuration.ConfigurationManager.ConnectionStrings("dbConnectionString").ConnectionString
Dim con As SqlConnection
con = New SqlConnection(conSTR)
Dim da As New SqlDataAdapter("proc_UpdateVendor", con)
da.SelectCommand.CommandType = CommandType.StoredProcedure
Dim da As New SqlDataAdapter("proc_NewClient", con)
' prepare da with parameters etc
da.SelectCommand.ExecuteNonQuery() '<-- code breaks here
有错误
The INSERT statement conflicted with the FOREIGN KEY constraint
"PrimayContact_FK". The conflict occurred in database "db",
table "dbo.ClientContact", column 'ClientContactID'.
我不明白这一点,也不知道如何调试它。非常感谢任何帮助。
编辑:这段代码在几周前工作了,除了错误检查和 cmets 之外,我在 VB 代码中没有进行任何更改。我没有更改存储过程或表中的任何内容。 ClientContact 表上有两个触发器:
CREATE TRIGGER [dbo].[trgClientContact_ins]
ON [dbo].[ClientContact]
FOR INSERT
AS
BEGIN
UPDATE ClientContact
SET RecCreateDate = CURRENT_TIMESTAMP
, RecCreateUser = CURRENT_USER
FROM ClientContact
INNER JOIN inserted
ON (ClientContact.ClientContactID = inserted.ClientContactID)
END
和
CREATE TRIGGER [dbo].[trgClientContact_upd]
ON [dbo].[ClientContact]
FOR UPDATE
AS
BEGIN
UPDATE ClientContact
SET RecModifyDate = CURRENT_TIMESTAMP
, RecModifyUser = CURRENT_USER
FROM ClientContact
INNER JOIN inserted
ON (ClientContact.ClientContactID = inserted.ClientContactID)
END
为什么在 Toad 中插入没有错误,但在 VB.NET 中却有错误。
EDIT2:我刚刚发现错误发生在更新和插入时,考虑到触发器,这似乎很明显。类似表等
EDIT3:ClientContact 的完整表描述
CREATE TABLE [dbo].[ClientContact]
( [ClientContactID] INT IDENTITY (1, 1) NOT NULL
, [ClientID] INT NOT NULL
, [CliContactName] VARCHAR (50) NOT NULL
, [CliContactPhone] VARCHAR (20) NULL
, [CliContactFax] VARCHAR (20) NULL
, [CliContactPager] VARCHAR (20) NULL
, [CliContactMobile] VARCHAR (20) NULL
, [CliContactEmergency] VARCHAR (20) NULL
, [CliContactPhoneExt] VARCHAR (10) NULL
, [CliContactFaxExt] VARCHAR (10) NULL
, [CliContactPagerExt] VARCHAR (10) NULL
, [CliContactMobileExt] VARCHAR (10) NULL
, [CliContactEmergencyExt] VARCHAR (10) NULL
, [CliContactEmail] VARCHAR (200)NULL
, [RecTimestamp] TIMESTAMP NULL
, [RecCreateDate] DATETIME NULL
, [RecCreateUser] VARCHAR (100)NULL
, [RecModifyDate] DATETIME NULL
, [RecModifyUser] VARCHAR (100)NULL
, [CliContactNotes] VARCHAR (2000) NULL
, PRIMARY KEY NONCLUSTERED
([ClientContactID] ASC)
WITH (PAD_INDEX = OFF
, FILLFACTOR = 90
, IGNORE_DUP_KEY = OFF
, STATISTICS_NORECOMPUTE = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON
, DATA_COMPRESSION = NONE)
ON [PRIMARY]
, FOREIGN KEY ([ClientID]) REFERENCES [dbo].[Client] ([ClientID])
)
ON [PRIMARY]
【问题讨论】:
-
您是否将 clientcontactid 分配为自动编号身份插入?也是一个空字符串!= null。
-
该错误是指您未另行提及的表格:您是否为问题简化了太多?
-
@JonH,ClientContactID 是一个自动编号,但它仅在插入 ClientContact 表时触发;并同意,null 不是空字符串。我只是没想到,因为该字段在表格中是强制性的。 Richard,当插入 Client 表时,ClientContact 表中没有任何反应。这就是为什么我在这里很困惑。我可能简化了太多,但我不知道我还能提供什么。
-
你还有一个叫 db 的数据库吗?
-
当您分享足够多的问题时,这将非常容易解决。您的联系表上有触发器吗? ClientContact 的结构是什么?该表格不是您帖子的一部分,而是要插入的表格。
标签: sql asp.net sql-server vb.net sql-server-2008-r2