私はvb.netでデータベースアクセスを教え始めました。私はthis as a referenceを使っています。私のMS Accessデータベースは、私がリレーショナルデータベースをセットアップして以来、私の参照が通過する例より少し複雑です。私は2つのテーブルを持っています。プレイヤーと、村。各プレイヤーは1つ以上の村(1対多数の関係)を持つことができます。この関係は、プレイヤーIDとプレイヤーIDの間で結ばれ、村の所有者を定義するために村のテーブルで使用されます。新しいプレイヤーをデータベースに追加する方法は次のとおりです。MS Accessのオートナンバー型フィールドと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は、私が作成したばかりのプレイヤーに関連付けられた正しい値ではありません(そのプレイヤーIDは常にplayerID = 1となるため、オートナンバーは、削除された行が削除されたために発生します。
プレーヤテーブルからIDの真の値を取得するにはどうすればよいですか?更新するオートナンバーを確認してから再チェックすることができますか?
可能な複製を@ @IDENTITY WHERE in Access](http://stackoverflow.com/question) s/34269518/select-identity-where-in-access) – topshot
IDなしで新しいプレーヤーを挿入します。次に、新しいIDが何であるかを調べます。次に、このIDでNewVillageを呼び出します。 – topshot