【问题标题】:The parameterized query expects the parameter '@Id', which was not supplied参数化查询需要未提供的参数“@Id”
【发布时间】:2016-11-14 10:12:27
【问题描述】:

我正在编写一个使用方法 (parameters.add) 的软件,但是当我将数据添加到数据库时出现以下错误:

参数化查询需要参数“@Id”,而这不是 提供。

我看到了几个主题,但我无法解决我的问题。

The parameterized query expects the parameter ###### which was not supplied

The parameterized query expects the parameter , which was not supplied

我把c#代码和存储过程代码放在下面:

private void btnSave_Click(object sender, EventArgs e)
        {
            string cs = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TranscactionAccountNumber;Data Source=DESKTOP-5DJFFQP";
            string name = txtName.Text;
            int shomarepeygiri = int.Parse(txtShomarePeygiri.Text);
            string date = dtpDate.Shamsi;
            decimal mablagh = decimal.Parse(txtMablagh.Text);
            string comment = txtComment.Text;
            using (cn = new SqlConnection(cs))
            using (cmd = new SqlCommand("InsertTransaction", cn))
            {
                cmd.Parameters.Add("@Id",SqlDbType.Int);
                cmd.Parameters.Add("@Name", SqlDbType.NVarChar, 100).Value = name;
                cmd.Parameters.Add("@ShomarePeygiri", SqlDbType.Int).Value = shomarepeygiri;
                cmd.Parameters.Add("@Mablagh", SqlDbType.Decimal).Value = mablagh;
                cmd.Parameters.Add("@Comment", SqlDbType.NVarChar).Value = comment;
                cmd.Parameters.Add("@Date", SqlDbType.VarChar).Value = date;
                if (cn.State == ConnectionState.Closed)
                    cn.Open();
                cmd.ExecuteNonQuery();
                MessageBox.Show("Transaction Added Successfully..", "Register Transaction", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }


        }

Create procedure InsertTransaction
(
@id int,
@Name nvarchar(100),
@ShomarePeygiri int,
@Mablagh decimal(18, 0),
@Comment nvarchar(MAX),
@PersianDate varchar(10)

) 
AS
Insert Into TransactionTable(id,[Name],ShomarePeygiri,Mablagh,Comment,PersianDate)
 values (@id,@Name,@ShomarePeygiri,@Mablagh,@Comment,@PersianDate)

【问题讨论】:

  • 你没有给 Id 赋值。你只是在声明它。你给所有其他参数一个值,但不是那个值。
  • 好像你没有提供参数值:cmd.Parameters.Add("@Id",SqlDbType.Int);
  • 您没有为@ID 参数设置任何值。其次,调用存储过程的命令应该在其 CommandType 属性中说出来
  • 这可能不应该是一个问题,但是...让它成为一个大写“i”。
  • 您是否在TransactionTable 的数据库列 ID 上设置了 IDENTITY 属性?如果是,则此字段会从您的数据库引擎自动填充,您不需要该参数,也不需要在存储过程中为其插入任何内容。

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


【解决方案1】:
cmd.Parameters.Add("@Id",SqlDbType.Int);

你正在添加一个参数,但你没有给它一个值。因此,您会收到此错误。

如果 ID 列是自动递增的,只需将其从存储过程中删除。

编辑:如果您不知道如何创建自动递增的列,请检查以下答案: Auto increment primary key in SQL Server Management Studio 2012

【讨论】:

  • @alexshiro 好的,如果 ID 像我在回答中写的那样自动递增,只需将其从存储过程中删除,不要在代码中提供此参数。 sql server会自动增加ID号并为你填写ID。
  • @mybrithname,但是,我收到以下错误:过程或函数“InsertTransaction”需要参数“@Name”,但未提供。
  • @alexshiro 您需要从代码和存储过程中删除 ID 参数。该错误告诉您您没有从 name 参数中提供值
  • 我删除了“ID”。但是,我现在得到错误:过程或函数“InsertTransaction”需要参数“@Name”,但未提供。
  • @alexshiro 如果您从两个地方都删除了 id,请检查您是否从 Name 参数中给出值,这就是错误。
【解决方案2】:

如下更改您的程序

Alter procedure InsertTransaction
(
@Name nvarchar(100),
@ShomarePeygiri int,
@Mablagh decimal(18, 0),
@Comment nvarchar(MAX),
@PersianDate varchar(10)
) 
AS
Insert Into TransactionTable([Name],ShomarePeygiri,Mablagh,Comment,PersianDate)
values (@Name,@ShomarePeygiri,@Mablagh,@Comment,@PersianDate)

【讨论】:

  • 我删除了“ID”。但是,我现在得到错误:过程或函数“InsertTransaction”需要参数“@Name”,但未提供。
  • 我在 c# 中得到错误。这行代码:cmd.ExecuteNonQuery();
  • 你的 id 列是自动递增的吗?
  • 如果是则删除 cmd.Parameters.Add("@Id",SqlDbType.Int);您的代码中的这一行
  • 我从 c# 代码和存储过程中完全删除了 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多