具有多个插入 SQL 和 ASP.Net 的存储过程
Stored Procedure with multiple inserts SQL and ASP.Net
我是编写存储过程的新手。我想在 SQL 服务器中编写一个存储过程,用于从 ASP.net.
中的 table 进行多次插入
这是我目前拥有的:
存储过程:
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 列时出现错误。我得到的错误是:
Procedure or function spUser HAS too many arguments specified.
我认为问题出在我的存储过程上。但我不知道如何在过程中指定更多插入。我搜索了互联网,但找不到答案。
有人知道我该如何解决这个问题,这样错误就消失了,我的插入就可以工作了吗?
提前致谢!
更新:
我正在使用 3 table 和文本框。
table之一:
<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>
我还有一个用于 CulbID
、Class
和 Team
的第二个存储过程,因为必须将其填充到另一个 SQL 服务器 table 中。
该存储过程的代码:
ALTER procedure [dbo].[spTeam]
@teamName VARCHAR (50)
as
BEGIN
INSERT INTO Ploeg(Name, RegistrationDate)
VALUES(@teamName, GETDATE())
END
您在代码中指定的参数过多(有些丢失,有些重复)。您编写过程的方式要求为要插入的每一行数据执行一次存储过程。
通常这可以通过 C# 中的循环来实现。
您的存储过程的输入变量数量少于您从 C# 代码发送的数量。您需要在存储过程中定义它们。
尝试添加您从代码中发送的所有输入变量,如下所示:
ALTER procedure [dbo].[spUser]
@userName VARCHAR(50),
@membershipnr INT,
@email VARCHAR(50)
@clubID int,
@class varchar(5),
@teamname varchar(15),
.............
就像其他人提到的那样,您的 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;
我是编写存储过程的新手。我想在 SQL 服务器中编写一个存储过程,用于从 ASP.net.
中的 table 进行多次插入这是我目前拥有的:
存储过程:
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 列时出现错误。我得到的错误是:
Procedure or function spUser HAS too many arguments specified.
我认为问题出在我的存储过程上。但我不知道如何在过程中指定更多插入。我搜索了互联网,但找不到答案。
有人知道我该如何解决这个问题,这样错误就消失了,我的插入就可以工作了吗?
提前致谢!
更新:
我正在使用 3 table 和文本框。
table之一:
<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>
我还有一个用于 CulbID
、Class
和 Team
的第二个存储过程,因为必须将其填充到另一个 SQL 服务器 table 中。
该存储过程的代码:
ALTER procedure [dbo].[spTeam]
@teamName VARCHAR (50)
as
BEGIN
INSERT INTO Ploeg(Name, RegistrationDate)
VALUES(@teamName, GETDATE())
END
您在代码中指定的参数过多(有些丢失,有些重复)。您编写过程的方式要求为要插入的每一行数据执行一次存储过程。
通常这可以通过 C# 中的循环来实现。
您的存储过程的输入变量数量少于您从 C# 代码发送的数量。您需要在存储过程中定义它们。
尝试添加您从代码中发送的所有输入变量,如下所示:
ALTER procedure [dbo].[spUser]
@userName VARCHAR(50),
@membershipnr INT,
@email VARCHAR(50)
@clubID int,
@class varchar(5),
@teamname varchar(15),
.............
就像其他人提到的那样,您的 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;