首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET 3层使用SQL Server存储过程插入多个表

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

Stack Overflow用户
提问于 2020-10-28 03:29:59
回答 1查看 43关注 0票数 0

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

这是我的桌子客户端

代码语言:javascript
运行
复制
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 
)

这是我的餐桌员工

代码语言:javascript
运行
复制
CREATE TABLE [dbo].[Employee]
(
    [idEmploy] [int] IDENTITY(1,1) NOT NULL,
    [nameEmployee] [int] NULL,

    CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
)

这是我的餐桌电话

代码语言:javascript
运行
复制
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 
)

下面是我的存储过程

代码语言:javascript
运行
复制
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,我有一个实体层,在这里我使用每个表的gets和sets,在这个例子中,我有Entity_ClientEntity_EmployeeEntity_Call。我还有一个包含Data_ClientData_EmployeeData_Call的数据层。

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

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

代码语言:javascript
运行
复制
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。我试过这个想法,但它不起作用。

代码语言:javascript
运行
复制
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,它们只在表需要其他表的信息时才能完美地工作。

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

EN

回答 1

Stack Overflow用户

发布于 2020-10-28 05:07:18

像这样改变程序

代码语言:javascript
运行
复制
  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并将此新值添加到调用

诸若此类

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64561618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档