我有一个datagridview
和一个SQLite数据库。数据网格可以包含任意数量的行和任意数量的列。
我需要将此数据网格保存到SQLite数据库,以便能够在第二时刻以完全相同的方式重新填充它。我知道如何创建表,填充表等,所以这不是一个如何做到这一点的问题。我需要知道的是最好的方法是做什么。它必须快速可靠,并且必须能够更新。
任何消化?
由于
答案 0 :(得分:3)
这取决于你如何填充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&lt; 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在数据库中具有完全相同的方式。这比Suggestion -1-更灵活,因为您无法“动态”更改对象的属性,但是由于您必须创建,删除和组织表结构,因此需要更多麻烦。建议-3-可以进行真正的统计分析,但由于表结构不是静态的,因此很难实现。 (此示例没有代码。只需将Suggestion 2代码与Suggestion 1代码结合使用)
结论
我认为没有最好的方法来保存带有任何行和任何列的DataGridView。这一切都取决于具体情况。有时我会使用Suggestion -2-,因为它是代码,数据库结构是静态的。有时候我会使用Suggestion -3-,因为它可以处理更多的数据并且编写查询对它感觉更自然。但是这里的数据库结构发生了很大变化。这些变化需要时间
进一步在路上
在更大的应用程序中,我永远不会将数据直接从DataGridView填充到数据库中。我总是在它们之间使用一个抽象层(模型层,如ORM)。我认为这有以下优点: 1.您可以更灵活地使用数据库例程,而不仅仅是这一个DataGridView。 (我真的很想以任何方式讨厌代码重复。) 2.您可以更轻松地进行更改:如果DataGridView发生更改,您不必考虑数据库,只需考虑轻量级抽象层。如果您的数据库发生了变化,您就不必强硬了。 3.数据逻辑不是视图的一部分,数据逻辑转到模型层。