我确定我的问题已在互联网上多次回答,但我无法找到我正在寻找的确切内容。
我正在使用 VB.NET,我的数据库是一个 SQL Server Compact.SDF
文件。以下是我打开数据库的方法。
Private Shared Sub OpenDatabase(ByVal tablename As String)
If _DBLoaded Then Return
'// open database connection
conn = New SqlCeConnection("Data Source = giadatabase.sdf")
conn.Open()
'// create command for making extracting data
cmd = conn.CreateCommand
cmd.CommandText = "SELECT * FROM [" & tablename & "]"
'// setup database adapter
da = New SqlCeDataAdapter(cmd)
'// create command for inserting/updating database
cb = New SqlCeCommandBuilder(da)
'// load dataset
ds = New DataSet()
da.Fill(ds)
'// get the relevant table
dt = ds.Tables(0)
_DBLoaded = True
End Sub
当我的应用程序启动时,我运行这个子程序。我相信数据库只需要打开一次。不断重新打开数据库会导致我的应用程序出现性能问题(如果我错了,请纠正我)。
为了在我的列表对象中加载数据,我使用以下内容:
Public Shared Function GetList() As List(Of DatabaseListObject)
OpenDatabase("TestTable")
'// Make a list of items in database
Dim ret As New List(Of DatabaseListObject)
For Each dRow As DataRow In dt.Rows
ret.Add(New DatabaseListObject(dRow("ID"), dRow("LongName"), dRow("ShortName")))
Next
Return ret
End Function
所以我的GetList
函数确保数据库已经打开,并且数据库总是在我的应用程序的生命周期中打开一次。我的列表对象填充了来自上述函数的数据。
这就是我对数据库进行更改的方式:
Public Shared Function AddItem(LongName As String, ShortName As String) As DatabaseListObject
'// Make changes
Dim row = dt.NewRow()
row("LongName") = TimeOfDay.ToString
row("ShortName") = ShortName
dt.Rows.Add(row)
da.Update(ds, dt.TableName)
Dim newcmd = conn.CreateCommand
newcmd.CommandText = "SELECT @@IDENTITY;"
Dim newID As Integer = newcmd.ExecuteScalar()
Dim item As New DatabaseListObject(newID, LongName, ShortName)
Return item
End Function
现在我假设数据库是从上面的代码中正确更新的。我表中的ID
列是自动编号。GetList
添加行后调用该函数时会出现问题。系统抛出新添加行的 ID 列为 NULL 的错误。而它应该自动添加数字。当我重新启动应用程序时,即从头开始打开数据库,然后GetList
正确显示自动编号。
显然,ID
当我添加新行时,表格的列没有被自动编号填充。所以我需要这里的建议。GetList
每当我调用(将在我的应用程序中经常调用)时,我是否应该总是从头开始打开数据库。如果不是整个数据库,那么至少应该调用哪些代码来正确刷新表,而不会对应用程序造成太多性能问题。