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

无法为vb.net中的表正确设置主键,vb.net,primary-key,oledb,updatecommand,Vb.net,Primary Key,Oledb,Updatecommand,我遇到了一些麻烦,伙计们。经过几天的努力、调试和研究,我排在第三到最后一行,我卡住了。这不是完整的代码,而是相关的部分 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

我遇到了一些麻烦,伙计们。经过几天的努力、调试和研究,我排在第三到最后一行,我卡住了。这不是完整的代码,而是相关的部分

    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生成


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

您需要数据库中的键列

命令生成器不使用您在数据集中的datacolumn中设置的键。
事实上,如果您查看DA使用的代码CB create命令,但是CB没有引用您的ds.Tables(“NewTable”).PrimaryKey,因此CB将永远无法考虑您的PrimaryKey

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

无论如何,为什么数据库表没有主键

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

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

  • 学习一本关于RDBMS和SQL的好书(学习数据库如何工作的基础知识、表、关系、键、列、数据类型、SQL、空值……)
  • 阅读一些关于dataset/datatable/connection如何与真实数据库交互的好文章/书籍

  • 您需要数据库中的键列

    命令生成器不使用您在数据集中的datacolumn中设置的键。
    事实上,如果您查看DA使用的代码CB create命令,但是CB没有引用您的ds.Tables(“NewTable”).PrimaryKey,因此CB将永远无法考虑您的PrimaryKey

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

    无论如何,为什么数据库表没有主键

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

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

  • 学习一本关于RDBMS和SQL的好书(学习数据库如何工作的基础知识、表、关系、键、列、数据类型、SQL、空值……)
  • 阅读一些关于dataset/datatable/connection如何与真实数据库交互的好文章/书籍

  • 感谢您的快速回复,表没有主键,因为运行时的代码生成了表。考虑到您所说的,我想我需要找到一种方法,在执行
    da.fill
    行之前生成主键。我的问题是我如何做到这一点?我远不是编程或使用OLEDB的专家,但是我认为只有通过将表复制到数据集,然后将数据集更新到原始表,才能对表进行操作?这是互联网告诉我的至少=)谢谢again@mohjo-只需自己添加主键,然后在创建表之后:
    “ALTER table”&TableName&“add primary key(&ColumName&)”
    @MattWilko Ok-xD,你的意思是创建表,然后使用command.executenonquery将其作为SQL语句吗?@MattWilko-Hmm,我考虑过这一点,但我认为我遇到的问题是,到目前为止,没有任何行或列,所以如果一个列不存在,我如何给它一个主键。但是我还是试过了,我做了
    Dim Column1作为DataColumn
    然后
    Dim PRIMARY设置为新的OleDb.OleDbCommand(“ALTER TABLE”&TableName&“ADD PRIMARY KEY(&Column1&)”,con)
    我现在遇到的错误是运算符“&”没有为类型“String”和“System.Data.DataColumn”定义。有什么想法吗?@Mohjo-您需要使用列的名称而不是新的DataColumn对象查看更多信息感谢快速回复,表没有主键,因为运行时的代码生成表。考虑到你所说的,我想我需要在
    da.fill之前找到一种制作主键的方法