ASP.NET 3层使用SQL Server存储过程插入多个表



我只有这个。我有三张表:客户、雇主和电话。而客户和雇主都是正常的表格。调用通过id引用两个表。我有一个存储过程要插入到这3个表中。但问题现在出现在网络应用程序内部。

这是我的桌子客户端

CREATE TABLE [dbo].[Client]
(
[idClient] [int] IDENTITY(1,1) NOT NULL,
[identityClient] [int] NULL,
[nameClient] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Client] PRIMARY KEY CLUSTERED 
)

这是我的桌子员工

CREATE TABLE [dbo].[Employee]
(
[idEmploy] [int] IDENTITY(1,1) NOT NULL,
[nameEmployee] [int] NULL,
CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
)

这是我的桌子叫

CREATE TABLE [dbo].[Call]
(
[idCall] [int] IDENTITY(1,1) NOT NULL,
[idClient] [int] NULL,
[idEmployee] [int] NULL,
[descriptionCall] [nvarchar](50) NULL,
[answerCall] [nvarchar](50) NULL,
CONSTRAINT [PK_Llamadas] PRIMARY KEY CLUSTERED 
)

这是我的存储过程

CREATE PROCEDURE [dbo].[insertcALL]
@idClient int,
@nameClient nvarchar(50),
@idEmployee int,
@nameEmployee nvarchar(50),
@descriptionCall nvarchar(50),
@answerCall nvarchar(50)        
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Client (nameClient) VALUES (@nameClient)
SELECT @idClient = SCOPE_IDENTITY()
INSERT INTO Employee (nameEmployee) VALUES (@nameEmployee)
SELECT @idEmployee = SCOPE_IDENTITY()
INSERT INTO Call (idClient, idEmployee, descriptionCall, answerCall)
VALUES (@idClient, @idEmployee, @descriptionCall, @answerCall)
END

现在使用ASP。NET有三个层我有一个实体层,在这里我为每个表使用get和set——在这种情况下,我有Entity_ClientEntity_EmployeeEntity_Call。我还有一个包含Data_ClientData_EmployeeData_Call的数据层。

但后来我的问题来了。如何调用函数来读取3个实体并用于data_Call

这是我在data_Call中使用存储过程insertCall的函数

Public Function insertCall(ByVal dts As Entity_Call) As Boolean
Try
connect()
cmd = New SqlCommand("insertCall")
cmd.Connection = cnn

cmd.Parameters.AddWithValue("@descriptionCall", dts._descriptionCall)
cmd.Parameters.AddWithValue("@answerCall", dts._answerCall)

If cmd.ExecuteNonQuery Then
Return True
Else
Return False
End If
Catch ex As Exception
MsgBox(ex.Message)
Return False
Finally
disconnect()
End Try
End Function

是的,你可以看到我缺少nameClientnameEmployee,但问题是它们是另一个实体类的一部分,我不能对这两个使用dts。我试过这个主意,但没用。

Public Function insertCall(ByVal dts1 As Entity_Client, ByVal dts2 As Entity_Employee, ByVal dts3 As Entity_Call) As Boolean
Try
connect()
cmd = New SqlCommand("insertCall")
cmd.Connection = cnn

cmd.Parameters.AddWithValue("@idClient", dts1._idClient)
cmd.Parameters.AddWithValue("@nameClient", dts1._nameClient)
cmd.Parameters.AddWithValue("@idEmployee", dts2._idEmployee) 
cmd.Parameters.AddWithValue("@nameEmployee", dts2._nameEmployee) 

cmd.Parameters.AddWithValue("@descriptionCall", dts3._descriptionCall)
cmd.Parameters.AddWithValue("@answerCall", dts3._answerCall)

If cmd.ExecuteNonQuery Then
Return True
Else
Return False
End If
Catch ex As Exception
MsgBox(ex.Message)
Return False
Finally
disconnect()
End Try
End Function

但显然失败了,它总是说找不到"@idClient";。我想做的是,用户得到一个屏幕,他们在屏幕上插入客户的姓名、照顾客户的雇主的姓名、电话描述以及给出的答案。所有这些都必须通过点击一个按钮来完成。但没有成功,错误总是把我钉在data_Call上。

如何制作一个函数来使用insertCall的存储过程,并调用所有表来使用它们的实体类,使其工作?

Btw不是连接问题,因为我制作了两个函数insertClientinsertEmployee,当表需要其他表的信息时,它们可以完美地工作。

在这一点上,我觉得这很容易,但我找不到一个好的解决方案。请帮忙,我们将不胜感激。

像这样更改程序

CREATE PROCEDURE [dbo].[insertcALL]
@idClient int = null,
@nameClient nvarchar(50),
@idEmployee int  = null,
@nameEmployee nvarchar(50),
@descriptionCall nvarchar(50),
@answerCall nvarchar(50)        
AS
BEGIN
SET NOCOUNT ON;

if @idClient is null begin
INSERT INTO Client (nameClient) VALUES (@nameClient)
SELECT @idClient = SCOPE_IDENTITY()
end
if @idEmployee is null begin
INSERT INTO Employee (nameEmployee) VALUES (@nameEmployee)
SELECT @idEmployee = SCOPE_IDENTITY()
end 
INSERT INTO Call (idClient, idEmployee, descriptionCall, answerCall)
VALUES (@idClient, @idEmployee, @descriptionCall, @answerCall)
END

现在您已经为@idClient参数设置了/null值。

当param为null时,proc添加新的客户端ID并添加此新值以调用

等等