2013-03-18 56 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