0

私の質問はインターネット上で何度も回答されていると思いますが、探しているものを正確に見つけることができませんでした.

私は 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(アプリで頻繁に呼び出される)を呼び出すたびに、常にデータベースを最初から開く必要があります。データベース全体ではない場合、アプリケーションに多くのパフォーマンスの問題を引き起こさずにテーブルを適切に更新するには、少なくともどのコードを呼び出す必要がありますか。

4

1 に答える 1

0

SELECT @@IDENTITY は同じ開いている Connection オブジェクトでのみ機能し、DataAdapter は独自の接続を開いたり閉じたりします。プレーンな ADO.NET (cmd.ExecuteNonQuery) を使用するか、http://blogs. msdn.com/b/bethmassi/archive/2009/09/15/inserting-master-detail-data-into-a-sql-server-compact-edition-database.aspx

于 2013-03-18T07:07:21.987 に答える