2013-03-18 59 views
0

我确定我的问题已经在互联网上多次被回答,但我找不到我正在寻找的东西。SQL Server CE - 更新表的问题

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

回答

0

SELECT @@ IDENTITY只会相同的开放Connection对象的工作,DataAdapter的打开和关闭它自己的连接,则必须使用纯ADO.NET(cmd.ExecuteNonQuery)或implemet额外的代码如下所述:http://blogs.msdn.com/b/bethmassi/archive/2009/09/15/inserting-master-detail-data-into-a-sql-server-compact-edition-database.aspx

+0

我不认为这回答了我的问题。我对SELECT @@ IDENTITY没有问题。这对我在'AddItem'函数中工作正常。我面对的问题是,在AddItem函数完成向表中添加数据之后,表不会被新的自动编号刷新。当我在GetList函数中调用dRow(“ID”)来更新我的列表时,它失败。我没有任何绑定到这个数据库的控件。 – 2013-03-18 07:20:42