私の質問はインターネット上で何度も回答されていると思いますが、探しているものを正確に見つけることができませんでした.
私は 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
(アプリで頻繁に呼び出される)を呼び出すたびに、常にデータベースを最初から開く必要があります。データベース全体ではない場合、アプリケーションに多くのパフォーマンスの問題を引き起こさずにテーブルを適切に更新するには、少なくともどのコードを呼び出す必要がありますか。