1

我有datagridview一个 SQLite 数据库。数据网格可以有任意数量的行和任意数量的列。

我需要将此数据网格保存到 SQLite 数据库,以便能够在第二刻以完全相同的方式重新填充它。我知道如何创建表、填充表等,所以这不是关于如何做的问题。我需要知道的是最好的方法是什么。它必须快速可靠,并且必须可以更新。

有什么建议吗?

谢谢

4

1 回答 1

3

这在一定程度上取决于您如何填充 DataGridView。

  1. 如果使用 DataSource 和对象列表,则可以将属性存储在数据库中。大写字母“ANY”在寻找我,这不是您的解决方案,但我添加它是为了完成。
  2. 如果直接填充网格(items.add),则可以将值作为名称-值对存储在数据库中
  3. 如果您直接填充网格并且不喜欢 (2),您可以在数据库中创建与您的数据网格视图相对应的列。

建议-1-

您将“汽车作为列表(汽车)”绑定到 DataGridView。现在您可以通过反射运行对象,甚至可以使用它创建表(代码未经测试,database.executeQuery() 只是您的数据库执行函数的占位符):

database.exeuteQuery("CREATE TABLE car")
for each pi as PropertyInfo in GetType(Car).getProperties()
    database.executeQuery("ALTER TABLE car ADD COLUMN " & pi.name & " TEXT(255)")
next for
for each car as Car in Cars
    Dim insert As String = ""
    Dim values as String = ""
    for each pi as PropertyInfo in car.getType().getProperties()
        if insert <> "" then
            insert &= ", "
            values &= ", "
        end if
        insert &= pi.name
        values &= pi.getValue(car, nothing)
    next for
    database.executeQuery("INSERT INTO car (" & insert & ") VALUES (" & values & ")")
next for

建议-2-

您将名称-值对存储在数据库中。如果您的网格是“小”(100000 < row*colums),这已经足够快并且具有很大的灵活性,而无需更改数据库结构。

For Each row as DataGridViewRow in MyDataGridView.Rows
    For Each col as DataGridViewColumn in MyDataGridView.Columns
        database.executeQuery("INSERT INFO dgvContent( RowId, Name, Value ) VALUES ( " & row.Index & ", '" & col.Name & "', '" & row.Cells(col).Value & "' ")
    Next For
Next For

要检索和更新数据,您可以使用 RowId 将一行的值重新组合在一起。

建议-3-

这是建议 2 和 1 的组合。您在数据库中创建 DataGridView 列,并在数据库中以完全相同的方式使用 DataGridView。这比建议 -1- 更灵活,因为您不能“即时”更改对象的属性,但比建议 -2- 更麻烦,因为您必须创建、删除和组织表结构。建议-3-可以进行真实的统计分析,但是由于表结构不是静态的,因此很难实现。(此示例没有代码。只需将建议 2 代码与建议 1 代码结合起来)

结论

我认为没有最好的方法来保存包含任何行和任何列的 DataGridView。这一切都取决于情况。有时我会使用 Suggestion -2-,因为它易于编码并且数据库结构是静态的。有时我会使用 Suggestion -3-,因为它可以处理更多数据并且针对它编写查询感觉更自然。但是这里的数据库结构变化很大。改变需要时间

在路上更进一步

在稍微大一点的应用程序中,我从不将数据直接从 DataGridView 填充到数据库中。我总是在它们之间使用一个抽象层(模型层,如 ORM)。我认为这有以下优点: 1. 您可以更灵活地使用您的数据库例程,而不是仅此一个 DataGridView。(我真的非常讨厌代码重复。) 2. 可以更轻松地进行更改:如果 DataGridView 发生更改,您不必考虑数据库,只需考虑轻量级抽象层。如果您的数据库发生变化,您不必强硬地看待问题。3.数据逻辑不是视图的一部分,数据逻辑到模型层。

于 2013-08-05T08:58:23.633 回答