Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在SQLite DB上更新DGV selectedRow_C#_Sqlite_Datagridview - Fatal编程技术网

C# 无法在SQLite DB上更新DGV selectedRow

C# 无法在SQLite DB上更新DGV selectedRow,c#,sqlite,datagridview,C#,Sqlite,Datagridview,我似乎无法使用SQLite更新DataGridView中正确的选定行 对不起,如果这不合理的话 我正在构建一个“借贷者设备”(即笔记本电脑、平板电脑、手机等)跟踪应用程序。这些设备存储在SQLite数据库中。我可以将借出的设备拉入DGV(使用带有“yes”值的OnLoan列)。当突出显示一行并单击“签入”按钮时,我想将OnLoan值更改为“否”(有效地将其从列表中“删除”) 现在,单击按钮连接到数据库并运行更新命令,将单元格的值从“是”更改为“否”。然后更新DGV 但是,我不确定在SQL语句中为

我似乎无法使用SQLite更新DataGridView中正确的选定行

对不起,如果这不合理的话

我正在构建一个“借贷者设备”(即笔记本电脑、平板电脑、手机等)跟踪应用程序。这些设备存储在SQLite数据库中。我可以将借出的设备拉入DGV(使用带有“yes”值的OnLoan列)。当突出显示一行并单击“签入”按钮时,我想将OnLoan值更改为“否”(有效地将其从列表中“删除”)

现在,单击按钮连接到数据库并运行更新命令,将单元格的值从“是”更改为“否”。然后更新DGV

但是,我不确定在SQL语句中为WHERE子句设置什么。 我尝试使用currentRow索引,但由于currentRow索引不一定与SQL DB上的Id(PK列设置为自动递增)相同,因此会导致各种问题

现在,我可以在DGV上更改有问题的单元格的值,而不会在DB上更新它

这是我目前的代码:

    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。因此,即使该列不是原始查询的一部分,它仍然在数据库中