【问题标题】:SQL insert and update works in Toad but not in VB.NET codeSQL 插入和更新在 Toad 中有效,但在 VB.NET 代码中无效
【发布时间】: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


【解决方案1】:

您缺少过程中的参数

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()

【讨论】:

  • 我遗漏了一页代码来简化我的问题。我的评论“添加其他”是指我添加参数。但是谢谢,我很感激答案。如果您认为我应该添加代码,我会添加代码,但这会使我的问题变得巨大。
  • @pixelmeow 是的,你应该把你的整个代码,它会帮助我们帮助你
【解决方案2】:

问题出在业务规则中。必填字段ClientContactID 没有要传递的数据,因为作为新客户,ClientContact 表中没有联系人。

感谢大家的帮助,你们的回答和 cmets 肯定帮助我解决了这个问题。

【讨论】:

    【解决方案3】:

    我认为您需要将 SelectCommand 类型设置为 CommandType.StoredProcedure

    请参阅this Stack Overflow answer 了解如何设置。

    【讨论】:

    • 您能否更新代码 sn-p 以显示这一点?其他地方可能存在问题,而您看到的是虚假错误...
    • 完成。如果我需要添加更多内容,请告诉我。
    • 您能发布 ClientContact 定义吗?您是否尝试在 ClientContact 中插入不允许的重复项?
    • 我已经发布了代码,但我没有在 ClientContact 表中插入任何内容。当我插入/更新到客户端时,它正在更新该表,将 ClientContact 记录之一标记为该客户端的主要联系人。
    猜你喜欢
    • 2019-11-21
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多