我有datagridview
一个 SQLite 数据库。数据网格可以有任意数量的行和任意数量的列。
我需要将此数据网格保存到 SQLite 数据库,以便能够在第二刻以完全相同的方式重新填充它。我知道如何创建表、填充表等,所以这不是关于如何做的问题。我需要知道的是最好的方法是什么。它必须快速可靠,并且必须可以更新。
有什么建议吗?
谢谢
我有datagridview
一个 SQLite 数据库。数据网格可以有任意数量的行和任意数量的列。
我需要将此数据网格保存到 SQLite 数据库,以便能够在第二刻以完全相同的方式重新填充它。我知道如何创建表、填充表等,所以这不是关于如何做的问题。我需要知道的是最好的方法是什么。它必须快速可靠,并且必须可以更新。
有什么建议吗?
谢谢
这在一定程度上取决于您如何填充 DataGridView。
建议-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.数据逻辑不是视图的一部分,数据逻辑到模型层。