2016-11-13 68 views
1

我剛剛開始自學與vb.net數據庫訪問和我一直在使用this as a reference。我的MS Access數據庫比我參考設置關係數據庫後的示例稍微複雜一些。我有兩張桌子;球員和村莊。每個玩家都可以擁有一個更加多的村莊(1對多的關係),這種關係是在球員表中的唯一密鑰,並在村表用於定義村的所有者玩家ID之間的捆綁。以下是我如何向數據庫添加新玩家的方法;麻煩與MS訪問自動編號字段和VB.net

Public Sub NewPlayer(ByVal playerName As String) 
    Dim playerID As Integer = getLastIdent("Players") + 1 
    Dim tmpnum As Integer = playerID 

    Dim dsNewRow As DataRow 
    Dim Sql As String 

    Sql = "SELECT * FROM Players" 

    da = New OleDb.OleDbDataAdapter(Sql, con) 
    da.Fill(ds, "Players") 

    Dim cb As New OleDb.OleDbCommandBuilder(da) 

    dsNewRow = ds.Tables("Players").NewRow() 

    dsNewRow.Item("ID") = playerID 
    dsNewRow.Item("NameP") = playerName 
    dsNewRow.Item("Coins") = 0 


    ds.Tables("Players").Rows.Add(dsNewRow) 

    da.Update(ds, "Players") 

    Call NewVillage(playerName, playerID) 
End Sub 

的getLastIdent子程序是我在尋找的玩家ID領域使用的最後一個值的嘗試;

Public Function getLastIdent(ByVal tblname As String) 
    Dim sql As String = "SELECT @@IDENTITY FROM " & tblname 
    Dim cmd As New OleDb.OleDbCommand(Sql, con) 
    Return cmd.ExecuteScalar() 
End Function 

但是這根本不起作用(無論如何返回0)。球員們實際上可以順利創建(不正確的ID號,似乎在某些點與數據庫中正確遞增自動編號來修復自身然而到村分配給新的球員,我跑NewVillage;

Public Sub NewVillage(ByVal playerName As String, ByVal playerID As Integer) 
    Dim numVils As Integer = getVilCount() 
      Dim xpos As Integer 
    Dim ypos As Integer 
    xpos = CInt(Rnd()*50) 
    ypos = CInt(Rnd()*50) 


    Dim dsNewRow As DataRow 
    Dim Sql As String 

    Sql = "SELECT * FROM Villages" 

    da = New OleDb.OleDbDataAdapter(Sql, con) 
    da.Fill(ds, "Villages") 

    Dim cb As New OleDb.OleDbCommandBuilder(da) 

    dsNewRow = ds.Tables("Villages").NewRow() 

    dsNewRow.Item("ID") = numVils + 1 
    dsNewRow.Item("NameV") = playerName & "'s Village" 
    dsNewRow.Item("Xpos") = xpos 
    dsNewRow.Item("Ypos") = xpos 
    dsNewRow.Item("Owner") = playerID 


    ds.Tables("Villages").Rows.Add(dsNewRow) 

    da.Update(ds, "Villages") 

End Sub 

這這裏是整個事情的崩潰,這是傳遞給子程序的playerID是不是與我剛創建的播放器相關聯的正確值(在臉上沒有叫這個名字的任何球員,因爲它總是試圖playerID = 1自動編號,由於刪除失敗的行開始高於)。

所以,我怎麼能去哪裏弄個從球員表中的ID的真實價值?是否有一些電話,我可以作出這樣的FORC es AutoNumber更新,然後我可以重新檢查它?

+0

的[選擇可能的複製@ @IDENTITY WHERE在Access](http://stackoverflow.com/question S/34269518 /選擇,身份,其中,在接入) – topshot

+0

您插入新的球員沒有ID。然後找到新的ID是什麼。然後用這個ID調用NewVillage。 – topshot

回答

1

我過去所做的是勾OleDbDataAdapter的的RowUpdated事件和那個勾,執行身份檢索命令。

首先,定義將被用於在一個模塊水平執行所述身份子句和添加的方法,以實例化該命令:

Private cmdGetIdentity As OleDb.OleDbCommand 

Private Sub CreateIdentityCommand(con As OleDbConnection, tblName As String) 

    Dim sql As String = "SELECT @@IDENTITY FROM " & tblName 
    cmdGetIdentity = New OleDb.OleDbCommand(sql, con) 

End Sub 

接下來,創建將被用於檢索的事件處理程序身份(因爲每個表包含一個ID列,該代碼可以被用於兩個你的表的):

Private Sub RowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs) 

    If e.Status = UpdateStatus.Continue AndAlso e.StatementType = StatementType.Insert Then 
     ' Execute the command and move it into the row 
     e.Row("ID") = Int32.Parse(cmdGetIdentity.ExecuteScalar().ToString()) 
     ' Ensure the row's changes are accepted 
     e.Row.AcceptChanges() 
    End If 

End Sub 

最後,修改現有的方法來實例化身份命令,勾新事件,並刪除現有的試圖設置ID的代碼。在NewVillage,例如,改變:

da = New OleDb.OleDbDataAdapter(Sql, con) 

da = New OleDb.OleDbDataAdapter(Sql, con) 
    CreateIdentityCommand(con, "Villages") 
    AddHandler da.RowUpdated, AddressOf RowUpdated 

,然後取下行:

 Dim numVils As Integer = getVilCount() 

和:

 dsNewRow.Item("ID") = numVils + 1 
+0

感謝您的幫助。這仍然會導致在我的其他數據庫中使用錯誤的索引(基本上,在我創建一個玩家後,我想要創建一個村莊並通過在村莊表中使用玩家唯一ID將該村莊分配給玩家)。出於某種原因,使用你的代碼,然後檢查最後一行中第一個位置的值(傳遞給村莊創建者)似乎通過了錯誤的值。這就像是在我進入村莊之後,ID的更新發生了 - 無論如何,每當我創建一個球員時都會強迫這種情況發生? – FraserOfSmeg