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"列不存在的地方)

C#返回异常:过程没有参数,并且提供了参数

将代码更改为以下内容并重试:

 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();
}