SQL插入和更新在Toad中有效,但在VB.NET代码中无效

时间:2015-02-24 16:15:17

标签: sql asp.net sql-server vb.net sql-server-2008-r2

我有一个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]

3 个答案:

答案 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了解如何进行设置。