无法为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条评论后)
您需要数据库中的键列 命令生成器不使用您在数据集中的datacolumn中设置的键。
事实上,如果您查看DA使用的代码CB create命令,但是CB没有引用您的ds.Tables(“NewTable”).PrimaryKey,因此CB将永远无法考虑您的PrimaryKey 因此,您需要在数据库中设置一个主键 无论如何,为什么数据库表没有主键 更新(阅读前9条评论后)
感谢您的快速回复,表没有主键,因为运行时的代码生成了表。考虑到您所说的,我想我需要找到一种方法,在执行
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之前找到一种制作主键的方法