我有一个Web表单aspx页面,用于使用具有三个必需参数的存储过程将新客户端添加到Client表。这是程序:
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'.
我不明白这一点,也不知道如何调试它。非常感谢任何帮助。
编辑:几周前这段代码工作了,除了错误检查和注释之外,我在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]
答案 0 :(得分:0)
你错过了程序中的参数
Dim da As New SqlDataAdapter("proc_UpdateVendor", con)
da.SelectCommand.CommandType = CommandType.StoredProcedure
MyCommand.Parameters.AddWithValue("@ClientCode", "myvalue")
MyCommand.Parameters.AddWithValue("@myparameter2", "myvalue2")
'add the others
da.SelectCommand.ExecuteNonQuery()
答案 1 :(得分:0)
问题在于业务规则。没有数据要传递给必填字段ClientContactID
,因为作为新客户,ClientContact
表中没有联系。
谢谢大家的帮助,你的回答和评论肯定帮助我解决了这个问题。
答案 2 :(得分:-1)
我认为您需要将SelectCommand类型设置为CommandType.StoredProcedure
。
请参阅this Stack Overflow answer了解如何进行设置。