【问题标题】:ASP.NET 3 layers using SQL Server stored procedures to insert multiple tablesASP.NET 3 层使用 SQL Server 存储过程插入多个表
【发布时间】:2021-02-10 03:44:20
【问题描述】:

我拥有的是这个。我有 3 个表:客户、雇主和电话。而 Clients 和 Employers 都是普通表。通过 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

现在使用具有 3 层的 ASP.NET,我有一个实体层,在这种情况下,我使用每个表的获取和设置,我有 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 的存储过程并调用所有表以使用它们的实体类以便它工作?

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

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

【问题讨论】:

  • 没想到有人会问这个。我只是标记两者,因为最后几乎相同。不是与 c# 或 vb 相关的问题,它只是对在这一点上做正确的事情有一点帮助。
  • 这是一个雇员——不是“雇员”.....
  • 啊,是的,非常感谢您的编辑!
  • 是的,我修复了标签

标签: asp.net sql-server vb.net stored-procedures


【解决方案1】:

像这样改变程序

  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 添加新的 clientid 并将此新值添加到调用

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多