C# 无法在SQLite DB上更新DGV selectedRow
我似乎无法使用SQLite更新DataGridView中正确的选定行 对不起,如果这不合理的话 我正在构建一个“借贷者设备”(即笔记本电脑、平板电脑、手机等)跟踪应用程序。这些设备存储在SQLite数据库中。我可以将借出的设备拉入DGV(使用带有“yes”值的OnLoan列)。当突出显示一行并单击“签入”按钮时,我想将OnLoan值更改为“否”(有效地将其从列表中“删除”) 现在,单击按钮连接到数据库并运行更新命令,将单元格的值从“是”更改为“否”。然后更新DGV 但是,我不确定在SQL语句中为WHERE子句设置什么。 我尝试使用currentRow索引,但由于currentRow索引不一定与SQL DB上的Id(PK列设置为自动递增)相同,因此会导致各种问题 现在,我可以在DGV上更改有问题的单元格的值,而不会在DB上更新它 这是我目前的代码:C# 无法在SQLite DB上更新DGV selectedRow,c#,sqlite,datagridview,C#,Sqlite,Datagridview,我似乎无法使用SQLite更新DataGridView中正确的选定行 对不起,如果这不合理的话 我正在构建一个“借贷者设备”(即笔记本电脑、平板电脑、手机等)跟踪应用程序。这些设备存储在SQLite数据库中。我可以将借出的设备拉入DGV(使用带有“yes”值的OnLoan列)。当突出显示一行并单击“签入”按钮时,我想将OnLoan值更改为“否”(有效地将其从列表中“删除”) 现在,单击按钮连接到数据库并运行更新命令,将单元格的值从“是”更改为“否”。然后更新DGV 但是,我不确定在SQL语句中为
private void CheckInButton_Click(object sender, EventArgs e)
{
//connection to SQLite DB
string connStr = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
using (SQLiteConnection conn = new SQLiteConnection(connStr))
{
conn.Open();
foreach (DataGridViewRow r in DeviceOnLoanTable.SelectedRows)
{
string query = "UPDATE Device SET OnLoan = 'No' WHERE Id = " + DeviceOnLoanTable.CurrentRow.Index + ";";
using (SQLiteCommand cmd = new SQLiteCommand(query, conn))
{
cmd.ExecuteNonQuery();
LoadOnLoan(); //re-queries the DB for devices that are still on loan
//(i.e. "yes" in the OnLoan column)
DeviceOnLoanTable.Refresh();
}
conn.Close();
}
}
}
显然,设备unlantable.CurrentRow.Index
不是实现这一点的正确方法,但我似乎无法理解。
我认为最好是更新DGV,然后将其推送到DB,但不确定如何做到这一点
任何帮助都将不胜感激。我能找到答案。 在填充表的原始查询中,我包含了Id列,然后用
this.DeviceOnLoanTable.Columns["Id"].Visible = false;
然后,我将更新语句更改为:
string query = "UPDATE Device SET OnLoan = 'No' WHERE Id = " + DeviceOnLoanTable.CurrentRow.Cells[0].Value + ";";
因此,Id==当前单元格中的值(即我要更新的记录的Id)
工作起来很有魅力 当您最初从数据库获取数据时,您是否正在获取ID?如果要更新“that”ID的值,显然需要它。@JohnG我不会将其作为查询编号的一部分。但即使它不是DGV查询的一部分,也可以在update语句中使用它。我需要做的是将所选行与相关设备进行匹配,无论是通过Id还是其他值。“但即使它不是DGV查询的一部分,也可以在UPDATE语句中使用它。”。。。你怎么能“使用”你没有的东西?你在哪里拿到身份证?如果有其他“唯一”标识符,那么,是的,您可以使用它们,但是,从您的问题和代码来看,它特别尝试“更新”一行,其中“ID=XX”。“但是你没有XX,所以我不明白你在没有XX的情况下打算如何使用它。”约翰我刚刚想到了这个想法。我应该能够使用设备名称作为公共点。类似于:
WHERE DeviceName=DeviceOnLoan.SelectedRow.Cells[0]
因此,如果设备名称与单元格0中的值(即设备名称的索引)匹配,它会将OnLoan值更改为No。对吗?@JohnG回答您前面的问题:ID列是数据库中的主键,它会随着每一行(设备)自动递增补充。因此,每个设备在数据库中都有自己的唯一ID。因此,即使该列不是原始查询的一部分,它仍然在数据库中