2015-05-21 3 views
0

Ошибка: Динамическое создание SQL для UpdateCommand не поддерживается против SelectCommand, которая не возвращает какой-либо ключевой информации столбцаMS ACCESS -Need для чтения и обновления

Я пытаюсь решить следующие проблемно получать мое приложение напишите обратно в мою базу данных. Приложение нажимает на заголовок исключения, указанный выше. Я читал о работе базы данных CRUD здесь http://www.homeandlearn.co.uk/NET/nets12p7.html

Я знаю из других чтений, что я сделал, что мне нужен первичный ключ. Может ли кто-нибудь объяснить, как это связано с использованием набора данных и адаптера данных? Эта ошибка связана с моей фактической базой данных или набором данных в памяти? Я также понимаю, что я создал набор данных, основанный на одном запросе. Нужен ли мне другой запрос (INSERT), когда я достигаю условия не найденного билета?

Private Sub BtnQuery_Click(sender As Object, e As EventArgs) Handles BtnQuery.Click 

    sql = "SELECT [Ticket ID] AS Ticket_ID , [Foundstone] AS Foundstone, [ID] AS ID FROM [Table MAIN] WHERE ([Ticket Days OverDue] >= 0)" 'define the query 
    da = New OleDb.OleDbDataAdapter(sql, con) 
    da.Fill(ds, "MAIN") 
    If ds.Tables("MAIN").Rows.Count > 0 Then 
     TxtRows.Text = ds.Tables("MAIN").Rows.Count 
     maxrows = Val(TxtRows.Text.ToString) 
    End If 
    For i = 0 To maxrows - 1 
     If i >= 0 Then 
      result = ds.Tables("MAIN").Rows(i).Item("Ticket_ID") 
      WebBrowser1.Navigate("https://fs-enterprise.my.private.url/remediation/ticket.exp?ticket=" & result) 
      Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete 
       Application.DoEvents() 
      Loop 
      WebBrowser1.AllowNavigation = True 
      '<div id="MessageGood_0" class="mvm-status-message msm-msg msm-msg-img" style="background-image:url(/images/fam/cross.png);">The specified ticket does not exist, or is not currently available.</div> 
      For Each el As HtmlElement In WebBrowser1.Document.GetElementsByTagName("div") 
       If (el.GetAttribute("id").Equals("MessageGood_0")) Then 
        TxtTicket.Text = ds.Tables("MAIN").Rows(i).Item("Ticket_ID") 
        'Try 
         Dim cb As New OleDb.OleDbCommandBuilder(da) 
         cb.QuotePrefix = "[" 'allows update if table name or field is a reserved word in MS Access 
         cb.QuoteSuffix = "]" 'allows update if table name or field is a reserved word in MS Access 
         ds.Tables("MAIN").Rows(i).Item("Foundstone") = "Not Found" 
         da.Update(ds, "MAIN") 
         da.UpdateCommand = cb.GetUpdateCommand() 
     MsgBox("Ticket Not Found") 
        'Catch ex As Exception 
         'MsgBox(ex.Message.ToString, , "Error") 
        'End Try 
       Else 
        '<input class="boldbutton" type="button" value="Verify" onclick="this.form.knob.value='ReqVerify';this.form.verify.value=1;this.form.submit()"></td> 
        TxtTicket.Text = ds.Tables("MAIN").Rows(i).Item("Ticket_ID") 
        For Each element As HtmlElement In WebBrowser1.Document.GetElementsByTagName("INPUT") 
         If (element.GetAttribute("value").Equals("Verify")) Then 
          element.InvokeMember("click") 
         End If 
        Next 
       End If 
      Next 
     End If 
    Next 
    MessageBox.Show("All Tickets Have Been Processed") 
    Me.Close() 
    con.Close() 
End Sub  
+0

Первичный ключ должен быть установлен на таблицы базы данных, к которому вы обращаетесь ('main' в этом пример). Для добавления новой строки вам не нужен отдельный запрос. Вы можете добавить строку в свой набор данных в памяти, а затем обновить. – theduck

+0

@ theduck. Спасибо, я понимаю, что основной ключ должен находиться в таблице, к которой я обращаюсь. Я пытаюсь прояснить этот вопрос в своем сознании. Установлен ли ключ в фактической базе данных или наборе данных (в представлении памяти в базе данных)? Мне не нужно добавлять дополнительные строки данных, а только писать обратно в столбец, который не имеет данных в уже существующей строке. –

+0

Первичный ключ должен быть установлен в фактической таблице базы данных, а не в представлении памяти. Если вам не нужно добавлять новые строки, вы должны просто обновить набор данных и перенести изменения в базу данных. – theduck

ответ

0

Ответ на ваш первый вопрос о том, что первичный ключ должен быть установлен на фактической таблице базы данных, а не набор данных в оперативной памяти.

В ответ на ваш второй вопрос, вы можете обновить базу данных из набора данных, используя следующие:

Dim cb As New OleDb.OleDbCommandBuilder(da) 
ds.Tables("MAIN").Rows(i).Item("Foundstone") = "Not Found" 
da.UpdateCommand = cb.GetUpdateCommand() 
da.Update(ds, "MAIN") 
+0

ОК, теперь я понял! На основе кода, который вы предоставляете, вы передаете команду вставки обратно в адаптер данных. Я должен уметь исправлять все остальное. Я новичок в программировании баз данных и программировании в целом. У меня был только один класс в VB как часть моего основного компьютера. (Мое главное было сетевое программирование.) Поэтому я удивлен, что я сделал это хорошо. Большое спасибо за разъяснение моих вопросов. Это привело к тому, что у меня появилась новая технология (новая для меня). :-) –

+0

Думаю, я говорил слишком рано. Я сделал изменения, как было предложено. Я столкнулся с несколькими проблемами и исправил их. Теперь у меня нет ошибок исключения, но я также не вижу, чтобы данные записывались в исходную базу данных. Где я иду не так? –

+0

Поменяйте свои строки Update() и UpdateCommand. – theduck

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