C# 参数化查询 X 需要未提供的参数 Y

标签 c# sql-server datagridview parameters

我在尝试更新 SQL Server 数据库中的值时遇到了一些问题。

我有以下 DataGridView:

DataGridView-Data

我想更改复选框,然后在点击下面的保存按钮时将 boolean 写回 SQL Server。

我使用设计器将 BindingSource 添加到 SQL Server 表中。那很好用。它从 SQL 中读取值并显示它们。

保存按钮包含以下代码:

private void cmdChange_Click(object sender, EventArgs e)
{
    var PID = new SqlParameter("@PID",SqlDbType.Int);
    var Programm = new SqlParameter("@Installed",SqlDbType.Int);

    string prgUpdate = "UPDATE Programme SET Installed=@Installed WHERE PID=@PID";

    using (SqlConnection update = new SqlConnection(altdbconnect))
    {
        update.Open();

        for (int i = 0; i < dGVUpdates.Rows.Count; i++)
        {
            using (SqlCommand insert3 = new SqlCommand(prgUpdate, update))
            {
                insert3.Parameters.AddWithValue("@PID", dGVUpdates.Rows[i].Cells["pIDDataGridViewTextBoxColumn1"].Value);
                insert3.Parameters.AddWithValue("@Installed", dGVUpdates.Rows[i].Cells["installedDataGridViewTextBoxColumn"].Value);
                insert3.ExecuteNonQuery();
            }
        }

        update.Close();
    }

    dGVUpdates.Update();
    dGVUpdates.Refresh();
}

但是当我按下按钮以保存我在 DGV 中更改的值时,出现以下错误:

Additional information: The parameterized query '(@PID nvarchar(4000),@Installed nvarchar(4000))UPDATE Programme ' expects the parameter '@PID', which was not supplied.

我将所有使用过的语句与另一个 DataGridView 进行了比较。他们看起来一样。 就像显示的链接图片一样,设置了一个参数 @PID

pIDDataGridViewTextBoxColumn1 列由设计者生成。这是 PID 的列。

我将它与运行良好的这个进行了比较。找不到区别:

var kdNummer = new SqlParameter("@Kundennummer", SqlDbType.Int);
var kdName = new SqlParameter("@Kundenname", SqlDbType.VarChar);
var kdMail = new SqlParameter("@Kundenmail", SqlDbType.VarChar);
var kdTele = new SqlParameter("@Telefon", SqlDbType.VarChar);
var kdOffen = new SqlParameter("@Offen", SqlDbType.Int);

string kdquery = "INSERT INTO gfcKunden VALUES (@Kundennummer, @Kundenname, @Kundenmail, @Telefon, @Offen)";

using (SqlConnection updatedb = new SqlConnection(altdbconnect))
{
    updatedb.Open();

    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        try
        {
            using (SqlCommand insert = new SqlCommand(kdquery, updatedb))
            {
                insert.Parameters.AddWithValue("@Kundenname", dataGridView1.Rows[i].Cells["Kundenname"].Value);
                insert.Parameters.AddWithValue("@Kundennummer", dataGridView1.Rows[i].Cells["Kundennummer"].Value);
                insert.Parameters.AddWithValue("@Kundenmail", dataGridView1.Rows[i].Cells["Kundenmail"].Value);
                insert.Parameters.AddWithValue("@Telefon", dataGridView1.Rows[i].Cells["Telefon"].Value);
                insert.Parameters.AddWithValue("@Offen", 0);

                insert.ExecuteNonQuery();
            }
        }
        catch { }
    }

    updatedb.Close();
}

SQL Server 表的屏幕截图:

SQL-Table

最佳答案

正如 LarsTech 评论的那样,var 声明的所有行都是无意义的。 这意味着下面的行不起作用。

var PID = new SqlParameter("@PID",SqlDbType.Int);
var Programm = new SqlParameter("@Installed",SqlDbType.Int);

但是,上述变化可能不会影响结果。

但是,如您所见,您对 DataType 有点困惑。在您的错误消息中,有@PID nvarchar(4000)。这意味着 PID 列设计为使用文本数据。但是您将其声明为 Int 如上所述。 Id 通常是数字,但你的 SQL 数据库 PID 列过去被某人设计为 nvarchar。但是,C#语言可以轻松地将数字转换为文本,将文本转换为数字。没问题。

我建议更具体地使用,例如,

insert3.Parameters.Add(new SqlParameter("@PID", SqlDbType.NVarChar));
insert3.Parameters["@PID"].Value= dGVUpdates.Rows[i].Cells["pIDDataGridViewTextBoxColumn1"].Value.ToString();

首先,查看每一列使用的数据类型,并具体分别使用正确的数据类型。

此外,您需要确认 kdNummer 列,因为您在代码中将 kdNummer 声明(但再次无意义)为 Int,但您插入的是文本。如果你想将文本值转换为Int数字,你需要这样做。

insert.Parameters.AddWithValue("@Kundennummer", Convert.ToInt32(dataGridView1.Rows[i].Cells["Kundennummer"].Value));

希望这有帮助..

关于C# 参数化查询 X 需要未提供的参数 Y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37327488/

相关文章:

sql-server - 将 "Available Databases"下拉菜单添加到 SSMS 中的自定义工具栏

c# - 以编程方式更改datagridview中的颜色单元格

c# - 当属性更改时,DataGridView 控件滚动到顶部

c# - 如何正确处理泛型类中的错误?

c# - 我可以使用 C# 中的 Facebook 应用程序在 Facebook 群组墙上发布信息吗

c# - TextBox KeyDown 触发事件不适用于 Backspace 和 Delete 键

mysql - 如何从 SQL Server 表中选择不同的行

c# - 验证不适用于 kendo UI 多选

sql-server - 在 T-SQL 中指定给定日期的正确方法

c# - 如何删除 datagridview 上选定的行并反射(reflect)到数据库?