【问题标题】:Stored Procedure with multiple inserts SQL and ASP.Net具有多个插入 SQL 和 ASP.Net 的存储过程
【发布时间】:2015-04-17 14:22:08
【问题描述】:

我是编写存储过程的新手。我想在 SQL Server 中编写一个存储过程,用于从 ASP.net 中的一个表中进行多次插入。

这是我目前所拥有的:

存储过程:

ALTER procedure [dbo].[spUser]
    @userName VARCHAR(50),
    @membershipnr INT,
    @email VARCHAR(50)
as
begin
    DECLARE @returnvalue INT

    IF (SELECT COUNT(*) FROM User WHERE Membershipnr = @membershipnr) > 0
    BEGIN
        SET @returnvalue = -1
    END
    ELSE
    BEGIN
        SET @returnvalue = 1

        INSERT INTO User(Name, Membershipnr, Email) 
        VALUES(@userName, @membershipnr, @email)
    END

    SELECT @returnvalue
end

C#代码:

SqlCommand cmd = new SqlCommand("spUser", conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlCommand com = new SqlCommand("spTeam", conn);
com.CommandType = CommandType.StoredProcedure;

if (ddl1.SelectedValue == "2" && rb.SelectedValue == "M" && ddl2.SelectedValue == "1")
{
    cmd.Parameters.AddWithValue("@userName", txtName.Text);
    cmd.Parameters.AddWithValue("@userName", txtName2.Text);
    cmd.Parameters.AddWithValue("@membershipnr", txtMembershipnr.Text);
    cmd.Parameters.AddWithValue("@membershipnr", txtMembershipnr2.Text);
    cmd.Parameters.AddWithValue("@email", txtEmail.Text);
    cmd.Parameters.AddWithValue("@email", txtEmail2.Text);
    com.Parameters.AddWithValue("@clubID", "1");
    com.Parameters.AddWithValue("@class", "2xM");
    com.Parameters.AddWithValue("@teamName", txtTeam.Text);

    conn.Open();
    int answer = (int)cmd.ExecuteNonQuery();

}

尝试插入 2 列时出现错误。我得到的错误是:

过程或函数 spUser 指定的参数过多。

我认为问题在于我的存储过程。但我不知道如何在过程中指定更多插入。我搜索了互联网,但找不到答案。

有人知道我该如何解决这个问题,这样错误就会消失并且我的插入会起作用吗?

提前致谢!

更新:

我正在使用带有 texboxes 的 3 表。

其中一张桌子:

<asp:Table ID="tblTwo" runat="server" class="table">
    <asp:TableHeaderRow>
        <asp:TableHeaderCell>Name</asp:TableHeaderCell>
        <asp:TableHeaderCell>Email</asp:TableHeaderCell>
        <asp:TableHeaderCell>Membershipnr</asp:TableHeaderCell>
    </asp:TableHeaderRow>

    <asp:TableRow>
        <asp:TableCell>
            <asp:TextBox ID="txtName" type="text" class="form-control" runat="server"></asp:TextBox>
        </asp:TableCell>
        <asp:TableCell>
            <asp:TextBox ID="txtEmail" type="text" class="form-control" runat="server"></asp:TextBox>
        </asp:TableCell>
        <asp:TableCell>
            <asp:TextBox ID="txtMembershipnr" type="text" class="form-control" runat="server"></asp:TextBox>
        </asp:TableCell>
    </asp:TableRow>
    <asp:TableRow>
        <asp:TableCell>
            <asp:TextBox ID="txtName2" type="text" class="form-control" runat="server"></asp:TextBox>
        </asp:TableCell>
        <asp:TableCell>
            <asp:TextBox ID="txtEmail2" type="text" class="form-control" runat="server"></asp:TextBox>
        </asp:TableCell>
        <asp:TableCell>
            <asp:TextBox ID="txtMembershipnr2" type="text" class="form-control" runat="server"></asp:TextBox>
        </asp:TableCell>
    </asp:TableRow>
</asp:Table>

我还有一个用于CulbIDClassTeam 的存储过程,因为它必须填充到另一个 SQL Server 表中。

该存储过程的代码:

ALTER procedure [dbo].[spTeam]
    @teamName VARCHAR (50)
as
BEGIN
    INSERT INTO Ploeg(Name, RegistrationDate)
    VALUES(@teamName, GETDATE())
END

【问题讨论】:

  • 您没有在 sp 定义中定义 clubIDclassteamName 参数。您只在 sp 中声明了 3 个参数,但您尝试向其中添加 6 个不同的参数。您还需要在 sp 定义中定义这些参数。
  • 您需要创建数据表并将其传递给 sp,在 sp 中您需要 UDT
  • @EhsanSajjad 我该怎么做?因为我是存储过程的新手,我只知道我在这里使用的过程类型:S
  • 看看这里然后它正在使用 UDT:stackoverflow.com/questions/1030848/…
  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...

标签: c# asp.net sql-server stored-procedures


【解决方案1】:

您的存储过程的输入变量数量少于您从 C# 代码发送的变量数量。您需要在存储过程中定义它们。

尝试添加您从代码中发送的所有输入变量,如下所示:

ALTER procedure [dbo].[spUser]
@userName VARCHAR(50),
@membershipnr INT,
@email VARCHAR(50)
@clubID int,
@class varchar(5),
@teamname varchar(15),
.............

【讨论】:

  • 谢谢,但我正在使用 2 个存储过程。因为我需要将数据插入数据库中的 2 个表中。我已经用更多代码更新了我的问题。
  • @Marjolein:- 如果您使用 2 个存储过程,那么您必须显式调用两个存储过程并提供代码中定义的输入参数。如果第二个存储过程是从第一个 SP 内部调用的,那么您还需要提供 SP 的所有输入参数(前提是第一个 SP 的输出参数没有在第二个 SP 中使用
【解决方案2】:

就像其他人提到的那样,您的 C# 代码中有太多参数。您的存储过程只需要 3 个参数

@userName VARCHAR(50),
@membershipnr INT,
@email VARCHAR(50)

因此,当您在 C# 中添加参数时,它们需要匹配(参数的数量、名称和类型),即

cmd.Parameters.AddWithValue("@userName", txtName.Text);
cmd.Parameters.AddWithValue("@membershipnr", txtMembershipnr.Text);
cmd.Parameters.AddWithValue("@email", txtEmail.Text);

就个人而言,我也喜欢使用以下方式传递类型

cmd.Parameters.Add("userName", SqlDbType.VarChar).Value = txtName.Text;
cmd.Parameters.Add("membershipnr", SqlDbType.Int).Value = txtMembershipnr.Text;
cmd.Parameters.Add("email", SqlDbType.VarChar).Value = txtEmail.Text;

【讨论】:

  • 这应该如何解决我的问题?我需要在我的数据库中插入多行。而且我已经在我的 SP 中定义了我的参数类型。请解释一下。
  • 如果是我,我会有一个名为 AddUser 的 C# 函数,它接受 3 个参数 AddUser(membershipnr,username, email)。然后为您要添加的每条记录单独调用该函数。
  • 如果您想通过一次调用数据库添加多条记录,您将需要在存储过程定义中具有重复的参数组,即code@userName1 VARCHAR(50)、@membershipnr1 INT , @email1 VARCHAR(50) @userName2 VARCHAR(50), @membershipnr2 INT, @email2 VARCHAR(50) @, userName3 VARCHAR(50), @membershipnr3 INT, @email3 VARCHAR(50)'
  • 好的,谢谢,但我正在使用 3 个带有文本框的表格,我可以不填写 sp 中定义的参数吗?因为我有多个表,所以应该使用其他参数,这些参数也需要在我的 SP 中定义。例如:我有 1 个包含 txtName、txtName2、txtEmail 等的表。对于这张表,我应该使用@userName, @userName2, @email 等。但我还有第二张表,应该使用参数@userName3 等。
  • 不清楚您要达到的目标。要记住的是,您传递给 SP 的参数需要匹配 - 如果您的存储过程采用 3 个名称为 x、y、z 的参数,那么您只能向它传递 3 个名称为 x、y、z 的参数。在您的示例中,您的 SP 仅接受 3 个参数,但您正准备发送 9 个参数。
【解决方案3】:

您在代码中指定了太多参数(有些缺失,有些重复)。您编写过程的方式需要为要插入的每一行数据执行一次存储过程。

通常这可以通过 C# 中的循环来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 2020-07-10
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多