我在尝试更新 SQL Server 数据库中的值时遇到了一些问题。
我有以下 DataGridView
:
我想更改复选框,然后在点击下面的保存按钮时将 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 表的屏幕截图:
最佳答案
正如 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/