SQL插入和更新在Toad中工作,但在VB.NET代码中不工作
我有一个web表单aspx页面,用于使用具有三个必需参数的存储过程将新客户机添加到客户机表中。程序如下:SQL插入和更新在Toad中工作,但在VB.NET代码中不工作,sql,asp.net,sql-server,vb.net,sql-server-2008-r2,Sql,Asp.net,Sql Server,Vb.net,Sql Server 2008 R2,我有一个web表单aspx页面,用于使用具有三个必需参数的存储过程将新客户机添加到客户机表中。程序如下: CREATE PROCEDURE [dbo].[proc_NewClient] @ClientCode VARCHAR (12) , @ClientName VARCHAR (100) , @ClientPhone VARCHAR (20) AS INSERT INTO Client ( ClientCode , ClientNa
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中工作良好,尽管insert将接受一个空字符串,这令人费解。但是,在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
我不明白这一点,也不知道如何调试它。非常感谢您的帮助
编辑:这段代码在几周前就开始工作了,我在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
及
为什么在蟾蜍内部插入时没有错误,而在VB.NET中却有错误,这令人困惑
EDIT2:我刚刚发现错误发生在update和insert上,考虑到触发器,这一点似乎很明显。类似表格等
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]
我认为您需要将SelectCommand类型设置为CommandType.StoredProcess
有关如何设置,请参阅。过程中缺少参数
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()
问题在于业务规则。对于必填字段ClientContactID,没有要传递的数据,因为作为新客户端,ClientContact表中没有联系人
谢谢大家的帮助,您的回答和评论肯定帮助我解决了这个问题。您是否将clientcontactid指定为自动号码身份插入?也是一个空字符串!=空。该错误指的是一个您没有提及的表:您是否因为这个问题简化了太多?@JonH,ClientContactID是一个自动编号,但它仅在插入ClientContact表时触发;并同意,null不是空字符串。我只是没想到,因为这个字段在表中是必填的。Richard,当插入到客户机表中时,ClientContact表中不会发生任何事情。这就是为什么我在这里如此困惑。我可能简化得太多了,但我不知道我还能提供什么。你甚至有一个名为db的数据库吗?当你分享足够多的问题时,这将非常容易修复。你的联络表上有触发器吗?ClientContact的结构是什么?该表不是您文章的一部分,而是要插入到的表。您可以更新代码段以显示它吗?其他地方可能有问题,你看到了一个虚假的错误…完成了。如果我需要添加更多,请告诉我。您可以发布ClientContact定义吗?您是否试图在ClientContact中插入不允许的重复项?我已发布了代码,但我不会在ClientContact表中插入任何内容。当我插入/更新到客户机时,它正在更新该表,将其中一个ClientContact记录标记为该客户机的主要联系人。我的注释添加其他注释是指我添加参数。但是谢谢,我很感激你的回答。如果你认为我应该的话,我会添加代码,但这会让我的问题变得很大。@pixelmeow是的,你应该把你的整个代码都放进去,这会帮助我们帮助你
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]
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()