2012-05-08 49 views
1

我遇到了一些麻煩傢伙。在經過幾天的勞動,調試和研究之後,即時在第三線和最後一線,我卡住了。這不是完整的代碼,而是相關的部分。無法正確設置主鍵在vb.net中的表

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 

遇到的問題IM是在這條線在這裏

da.UpdateCommand = cb.GetUpdateCommand() 

的錯誤是

不支持針對不返回任何鍵列信息的SelectCommand

動態SQL生成的更新命令。

我明白這意味着我的表沒有主鍵,但我已經設置了一個。任何幫助將不勝感激! =)

回答

1

您需要數據庫中的密鑰列。

命令生成器不使用您在數據集的datacolumn中設置的鍵。實際上,如果您查看代碼,DA使用CB創建命令,但CB沒有引用您的ds.Tables(「NewTable」)。PrimaryKey,因此CB永遠不能考慮您的PrimaryKey。

因此,您需要在數據庫中設置主鍵。

無論如何,爲什麼你有一個沒有主鍵的數據庫表?

更新(讀第9個意見後)

  1. 你定義在TableCreate SQL命令表列,當你執行這個命令時,它會創建表和數據庫文件中的列。
  2. 表可以是空的(無行),但必須至少有一列。
  3. 你不能使用數據集/數據表抽象/對象添加真正的列到數據庫中的真實表,它顯示這樣工作(見點1)
  4. 它給你錯誤「SSSS.ID」不能包含Null「,因爲在SQL CREATE命令中,您正在創建一個名爲ID不是NULL的列的表(請參閱命令的」ID INTEGER NOT NULL「部分),因此如果向該表中添加一行,列ID必須包含一個非空的值。
  5. 你的循環爲每次迭代在數據表中添加一列,它不以這種方式工作,你不能這樣做。如果你這樣做,你做錯了。
  6. 您在數據表中添加的列「CustID」僅存在於數據表(「真實表的內存中」抽象)中,它不會存在於數據庫中(除非將其添加到CREATE TABLE命令中)

在我看來,你需要:

  1. 研究一本書良好的RDBMS和SQL(學習的DB是如何工作的基本知識,表格,關係,關鍵,列,數據類型,SQL,空值....)
  2. 閱讀數據集/數據表/連接如何與真正DB互動
+0

感謝快速回復一些好文章/書,表可是沒有一個主鍵,因爲在運行時的代碼,使表。考慮到你所說的話,我想我需要找到一種方法在執行'da.fill'行之前創建一個主鍵。我的問題是我如何做到這一點?我遠不及編程或使用OLEDB方面的專家,但我認爲只能通過將表格複製到數據集然後將數據集更新到原始表來操作表格?那麼這就是互聯網告訴我至少=)再次感謝 – Mohjo

+1

@mohjo - 只需在創建表後自己添加一個主鍵:'「ALTER TABLE」&TableName&「ADD PRIMARY KEY(」&ColumName&「 )「' –

+0

@MattWilko好吧我困惑的xD,你的意思是創建表,然後使用command.executenonquery與此作爲SQL語句? – Mohjo