我只有这个。我有三张表:客户、雇主和电话。而客户和雇主都是正常的表格。调用通过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_Client
、Entity_Employee
和Entity_Call
。我还有一个包含Data_Client
、Data_Employee
和Data_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
是的,你可以看到我缺少nameClient
和nameEmployee
,但问题是它们是另一个实体类的一部分,我不能对这两个使用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不是连接问题,因为我制作了两个函数insertClient
和insertEmployee
,当表需要其他表的信息时,它们可以完美地工作。
在这一点上,我觉得这很容易,但我找不到一个好的解决方案。请帮忙,我们将不胜感激。
像这样更改程序
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并添加此新值以调用
等等