C#返回异常:过程没有参数,并且提供了参数
本文关键字:参数 异常 返回 过程 | 更新日期: 2023-09-27 18:29:19
我为这种格式设置道歉。我是编程的新手,也是这个网站的新手,所以我会尽量把这个问题弄清楚。
我有一个用于访问/修改客户数据库的网络表单。我有一个用于输入新客户详细信息的按钮,它将通过从数据库中获取最高的ID号并递增一(并发布到表单文本框)来自动分配ID号。
这是我写的代码:
protected void btnNew_Click(object sender, EventArgs e)
{
Clear();
command.Connection = conn;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "NewCustomer";
conn.Open();
SqlParameter maxid = new SqlParameter();
maxid.ParameterName = "@MaxID";
maxid.SqlDbType = SqlDbType.Int;
maxid.Direction = ParameterDirection.Output;
command.Parameters.Add(maxid);
command.ExecuteNonQuery();
NewCustId = Convert.ToInt32(maxid.Value);
NewCustId += 1;
txtCustID.Text = (NewCustId).ToString();
txtCustID.DataBind();
conn.Close();
}
这是存储过程:
CREATE PROCEDURE NewCustomer
(@MaxID INT OUTPUT)
AS
BEGIN
SELECT @MaxID = MAX(CustID)
FROM dbo.Customer
END
我尝试了很多不同的编码方法,但似乎都不起作用。我发布的代码在ExecuteNonQuery
处有一个异常,说提供了参数,而过程并没有参数。当我把command.Parameters.Add(maxid);
放在ExecuteNonQuery
下面时,它会返回一个1。
我单独运行了SQL查询,看看会发生什么,它在一个未命名的单元格中返回了正确的答案。由于某种原因,列名出现时会消失。然后,当我尝试使用C#代码访问未命名的单元格时,我似乎无法访问它,因为列"CustID"不存在"。
有了这段代码,我知道SQL命令正在执行,然后C#代码递增1,但我得到的返回值似乎是0。
我很感激我能得到的关于如何解决这个问题的任何想法。非常感谢。
编辑:我也尝试过:DataTable表=新的DataTable();适配器。填写(表格);NewCustId=表。行[0]。字段("CustID");
(这是它说"CustID"列不存在的地方)
将代码更改为以下内容并重试:
Clear();
command.Connection = conn;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "NewCustomer";
conn.Open();
NewCustId = Convert.ToInt32(cmd.ExecuteScalar().ToString());
NewCustId += 1;
txtCustID.Text = NewCustId.ToString();
conn.Close();
您的存储过程是:
CREATE PROCEDURE NewCustomer
(
)
AS
BEGIN
SELECT MAX(CustID)
FROM dbo.Customer;
END
ExecuteNonQuery()
不希望得到任何结果。请改用ExecuteReader()
。
我支持marc_S关于这一问题的说法。由于您使用的是最大ID并递增1在数据库中插入新记录,因此我建议您对此列使用Identity(seed,increment_value)。这样,您就不必找到max来插入新记录,并且可以避免大量的事务问题。交易完成后,
可能的设计:
Create Table Customer
(
Id Int Identity(1,1),
Name varchar(50)
)
Create Proc NewCustomer
(
@Name varchar(50)
)
As
(
DECLARE @custID Int
SET NOCOUNT ON
INSERT INTO Customer (Name) Values('Your Name')
SET @custID = SCOPE_IDENTITY()
RETURN @custID
)
protected void btnNew_Click(object sender, EventArgs e)
{
Clear();
command.Connection = conn;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "NewCustomer";
conn.Open();
SqlParameter name = new SqlParameter();
name.ParameterName = "@Name";
name.Direction = ParameterDirection.Input;
name.SqlDbType = SqlDbType.Varchar;
name.Value = "Your Name";
command.Parameters.Add(name);
SqlParameter returnValue= new SqlParameter();
returnValue.ParameterName = "@custID";
returnValue.SqlDbType = SqlDbType.Int;
returnValue.Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(maxid);
command.ExecuteNonQuery();
NewCustId = Convert.ToInt32(returnValue.Value);
txtCustID.Text = (NewCustId).ToString();
txtCustID.DataBind();
conn.Close();
}