2012-05-08 2 views
1

У меня возникли проблемы с парнями. После нескольких дней работы, отладки и исследования, я на 3-й на последнюю строку и застрял. Это не полный код, а соответствующие части.Невозможно правильно установить первичный ключ для таблицы в 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 

Проблема им с находится на этой линии здесь

da.UpdateCommand = cb.GetUpdateCommand() 

Ошибка

Dynamic SQL поколения для UpdateCommand не поддерживается против SelectCommand, которая не возвращает какой-либо ключевой информации столбца ,

Я понимаю, это означает, что у моего стола нет первичного ключа, но я его установил. Любая помощь будет принята с благодарностью! =)

ответ

1

Вам нужен столбец ключей в БД.

Конструктор команд не использует ключ, установленный в datacolumn в наборе данных.
Фактически, если вы посмотрите на код, CB создайте команду, используемую DA, но CB не имеет ссылки на ваши ds.Tables («NewTable»). PrimaryKey, поэтому CB никогда не сможет принять ваш PrimaryKey.

Итак, вам нужно установить первичный ключ в БД.

В любом случае, почему у вас есть таблица базы данных без первичного ключа?

Update (после прочтения первых 9 комментариев)

  1. Вы определяете столбцы таблицы в команде TableCreate SQL, при выполнении этой команды она будет создавать таблицы и столбец в файл базы данных.
  2. Стол может быть пустым (без строк), но ДОЛЖЕН иметь хотя бы столбец.
  3. Вы не можете использовать набор данных/объектную абстракцию/объект, чтобы добавить реальный столбец в реальную таблицу в базе данных, он работает таким образом (см. Пункт 1)
  4. Он дает вам сообщение об ошибке «SSSS.ID» не может содержать Null ", потому что в команде SQL CREATE вы создаете таблицу с столбцом с именем ID, который не равен NULL (см. часть команды ID INTEGER NOT NULL), поэтому, если вы добавите строку в эту таблицу, идентификатор столбца ДОЛЖЕН содержать значение, которое не равно нулю.
  5. ваш цикл добавляет столбец в datatable для каждой итерации, он не работает таким образом, вы не можете этого сделать. И если вы это сделаете, вы делаете это неправильно.
  6. Столбец «CustID», который вы добавляете в datatable, существует только в datatable («в памяти» абстракции реальной таблицы), он никогда не будет существовать в БД (если вы не добавите его в команду CREATE TABLE)

на мой взгляд, вам нужно:

  1. Исследование хорошая книга на СУБД и SQL (чтобы узнать основы того, как работает БД, таблицы, отношения, ключ, столбцы, тип данных, SQL, null значение ....)
  2. Читайте хорошие статьи/книги о том, как набор данных/DataTable/соединение взаимодействуют с реальной БД
+0

Спасибо за быстрый ответ, таблица оленья кожа имеет первичный ключ, потому что код во время выполнения делает таблицу. Учитывая то, что вы сказали, я думаю, мне нужно найти способ сделать первичный ключ до того, как будет выполнена строка 'da.fill'. Мой вопрос: как мне это сделать? Я не знаю эксперта в программировании или использовании OLEDB, однако я думал, что манипулирование таблицей можно было бы сделать только путем копирования ее в набор данных и затем обновления набора данных в исходную таблицу? Ну, это то, что интернет сказал мне, по крайней мере, =) Еще раз спасибо – Mohjo

+1

@mohjo - Просто добавьте первичный ключ самостоятельно после создания таблицы: '" ALTER TABLE "& TableName &" ADD PRIMARY KEY ("& ColumName &") "' –

+0

@MattWilko Ok Im confused xD, вы имеете в виду создать таблицу, а затем использовать команду command.executenonquery с этим в качестве оператора SQL? – Mohjo

Смежные вопросы