无法在vb.net中为表正确设置主键

时间:2012-05-08 12:38:33

标签: vb.net primary-key oledb updatecommand

我遇到了一些麻烦。经过几天的劳动,调试和研究,我在第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()

错误是

对于不返回任何键列信息的SelectCommand,不支持UpdateCommand的动态SQL生成。

我明白这意味着我的桌子没有主键,但我已经设置了一个。任何帮助将不胜感激! =)

1 个答案:

答案 0 :(得分:1)

您需要数据库中的键列。

命令构建器不使用您在数据集中的数据列中设置的键 实际上,如果你查看代码,可以使用DA创建的CB命令,但CB没有引用你的ds.Tables(“NewTable”)。PrimaryKey,所以CB永远不能考虑你的PrimaryKey。

因此,您需要在数据库中设置主键。

无论如何,为什么你有一个没有主键的数据库表?

更新(阅读前9条评论后)

  1. 您在TableCreate SQL命令中定义Table列,执行此命令时,它将创建表和数据库文件中的列。
  2. 一个表可以是空的(没有行),但必须至少有一列。
  3. 您不能使用数据集/数据表抽象/对象将真实列添加到数据库中的真实表中,它会以这种方式工作(参见第1点)
  4. 它给出了错误“SSSS.ID'不能包含Null”,因为在SQL CREATE命令中,您正在创建一个名为ID的列为NOT NULL的表(请参阅“ID INTEGER NOT NULL”部分命令)所以如果你向这个表添加一行,列ID必须包含一个非空的值。
  5. 你的循环是在每次迭代的数据表中添加一个列,它不能以这种方式工作,你不能这样做。如果你这样做,那你做错了。
  6. 您在数据表中添加的“CustID”列仅存在于数据表(实际表的“内存中”抽象)中,它永远不会存在于DB中(除非您将其添加到CREATE TABLE命令)
  7. 在我看来,你需要:

    1. 学习一本关于RDBMS和SQL的好书(了解数据库如何工作的基础知识,表,关系,键,列,数据类型,SQL,空值....)
    2. 阅读一篇关于数据集/数据表/连接如何与真实数据库交互的好文章/书
相关问题