0

我确定我的问题已在互联网上多次回答,但我无法找到我正在寻找的确切内容。

我正在使用 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每当我调用(将在我的应用程序中经常调用)时,我是否应该总是从头开始打开数据库。如果不是整个数据库,那么至少应该调用哪些代码来正确刷新表,而不会对应用程序造成太多性能问题。

4

1 回答 1

0

SELECT @@IDENTITY 只能在同一个打开的 Connection 对象上工作,并且 DataAdapter 打开和关闭自己的连接,您必须使用普通的 ADO.NET (cmd.ExecuteNonQuery) 或按照此处所述执行额外代码:http://blogs。 msdn.com/b/bethmassi/archive/2009/09/15/inserting-master-detail-data-into-a-sql-server-compact-edition-database.aspx

于 2013-03-18T07:07:21.987 回答