1

私はちょっとしたトラブルに遭遇しました。何日も苦労し、デバッグし、調査した後、最後の行から 3 行目に行き詰まりました。これは完全なコードではなく、関連する部分です。

    Dim dbProvider As String
    Dim dbSource As String
    Dim con As New OleDb.OleDbConnection
    Dim ds As New DataSet
    Dim MaxRows As Integer
    Dim sql As String
    Dim TableName As String
    TableName = TbTableName.Text
    Dim da As New OleDb.OleDbDataAdapter("SELECT * FROM  [" & TableName & "]", con)
    Dim cb As New OleDb.OleDbCommandBuilder(da)
    Dim dsNewRow As DataRow
    Dim dsNewColoumn As DataColumn

    dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
    dbSource = "Data Source = E:\A2 Computing\Project\PasswordDatabase.mdb"

    con.ConnectionString = dbProvider & dbSource
    con.Open()

    Dim TableCreate As New OleDb.OleDbCommand("CREATE TABLE [" & TableName & "](" & "ID INTEGER NOT NULL" & ")", con)
    Dim NewColoumn As New OleDb.OleDbCommand("ALTER TABLE [" & TableName & "] ADD " & X & " VARCHAR(60)", con)

    TableCreate.ExecuteNonQuery()
    da.Fill(ds, "NewTable")

    MaxRows = ds.Tables("NewTable").Rows.Count

    ds.Tables("NewTable").PrimaryKey = New DataColumn() {ds.Tables("NewTable").Columns("CustID")}

    X = 0
    Do
        X = X + 1

        dsNewColoumn = ds.Tables("NewTable").Columns.Add
        ds.Tables("NewTable").Columns.Add(X)
        dsNewRow = ds.Tables("NewTable").NewRow()
        ds.Tables("NewTable").Rows.Add(dsNewRow)
    Loop Until X = 30


    da.InsertCommand = cb.GetInsertCommand()
    da.UpdateCommand = cb.GetUpdateCommand()
    da.Update(ds, "NewTable")
End Sub

私が抱えている問題は、ここのこの行にあります

da.UpdateCommand = cb.GetUpdateCommand()

エラーは

UpdateCommand の動的 SQL 生成は、キー列情報を返さない SelectCommand に対してはサポートされていません。

これは、テーブルに主キーがないことを意味することを理解していますが、主キーを設定しました。どんな助けでも大歓迎です!=)

4

1 に答える 1

1

DB にキー列が必要です。

コマンド ビルダーは、データセットのデータ列に設定したキーを使用しません。
実際、コードを見ると、CB create コマンドは DA によって使用されますが、CB は ds.Tables("NewTable").PrimaryKey を参照していないため、CB は PrimaryKey を考慮に入れることができません。

そのため、DB に主キーを設定する必要があります。

とにかく、主キーのないデータベース テーブルがあるのはなぜですか?

更新(最初の 9 つのコメントを読んだ後)

  1. TableCreate SQL コマンドでテーブル列を定義します。このコマンドを実行すると、データベース ファイルにテーブルと列が作成されます。
  2. テーブルは空 (行なし) にすることができますが、少なくとも 1 つの列が必要です。
  3. データセット/データテーブルの抽象化/オブジェクトを使用して、データベース内の実際のテーブルに実際の列を追加することはできません。この方法では機能しません (ポイント 1 を参照)。
  4. 「SSSS.ID' には Null を含めることはできません」というエラーが表示されます。これは、SQL CREATE コマンドで、NOT NULL である ID という列を持つテーブルを作成しているためです (コマンドの「ID INTEGER NOT NULL」の部分を参照してください)。このテーブルに行を追加する場合、列 ID には null 以外の値が含まれている必要があります。
  5. ループは反復ごとにデータテーブルに列を追加していますが、この方法では機能しません。それはできません。もしそうなら、あなたはそれを間違っています。
  6. データテーブルに追加する列「CustID」は、データテーブル (実際のテーブルの「インメモリ」抽象化) にのみ存在し、DB には存在しません (CREATE TABLE コマンドに追加しない限り)。

私の意見では、次のことが必要です。

  1. RDBMS と SQL に関する優れた本を読んでください (DB の仕組み、テーブル、関係、キー、列、データ型、SQL、null 値などの基本を学ぶため)。
  2. データセット/データテーブル/接続が実際の DB とどのように相互作用するかについての良い記事/本を読んでください
于 2012-05-08T12:48:32.233 に答える