2014-11-16 3 views
-2

Я только что сделал учебник об удалении данных из datagridview с флажком и все замечательно, кроме я получаю эту ошибкуКритерии выражение ошибки

Несоответствие типов данных является выражение критерия

It ничего не удаляет это подчеркивает result = cmd.ExecuteNonQuery линию и говорит

необработанное исключение типа «System.Data.OleDb.OleDbExcep ' произошел в System.Data.dll Дополнительная информация: Несоответствие типа данных в выражении критериев.

Вот код.

Private Sub btnDeleteAll_Click(sender As Object, e As EventArgs) Handles btnDeleteAll.Click 
     Try 
      con.Open() 
      For Each row As DataGridViewRow In DataGridView1.Rows 
       If row.Cells(0).FormattedValue = True Then 
        sql = "DELETE FROM tT WHERE ID = '" _ 
        & CStr(row.Cells(1).FormattedValue) & "'" 
        With cmd 
         .Connection = con 
         .CommandText = sql 
        End With 
        result = cmd.ExecuteNonQuery 
       End If 
      Next 
      If result = 0 Then 
       MsgBox("nope") 
      Else 
       MsgBox("deleted.") 
      End If 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
     con.Close() 
End Sub 
+1

Ошибка в запросе затем Sql. I asasume 'ID' columne - это тип Int, но вы пытаетесь присвоить строковое значение. Код отладки и посмотреть значение переменной 'sql' перед выполнением запроса. – Fabio

+1

Используйте sql-параметры с типом 'int'. –

+1

@wwrwer .. Не меняйте свой вопрос с ** «Вопрос решен» ** .. вы можете добавить его в комментарий ... :) – matzone

ответ

0

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

' Prepare the command string with the parameter placeholder 
' Note that you don't need to put quotes around the placeholder 
sql = "DELETE FROM tT WHERE ID = ?" 

' Prepare the command creating a parameter with a initial zero value 
' The AddWithValue receives an integer constant so the parameter will be created 
' of Integer type. Note that this shortcut is dangerous and it is better to 
' explicity create the parameter with your chosen type. 
With cmd 
    .Connection = con 
    .CommandText = sql 
    .Parameters.AddWithValue("@p1", 0) 
End With 

' Loop over your rows, place the correct value into the parameter and execute 
' I don't like to use CInt or CStr from VB6 heritage and prefer to use the 
' framework methods Convert.ToXXXXX but I suppose that CInt works as well here. 
For Each row As DataGridViewRow In DataGridView1.Rows 
    If row.Cells(0).FormattedValue = True Then 
     cmd.Parameters("@p1").Value = Convert.ToInt32(row.Cells(1).FormattedValue) 
     result = cmd.ExecuteNonQuery 
    End If 
Next 
+0

Привет, Стив, это потрясающе, спасибо вам большое. Но не могли бы вы объяснить больше о том, что означает Parameters.AddWithValue («@ p1», 0) и как я буду создавать его с помощью выбранного вами типа? Кроме того, я пробовал код, и он сработал, но он фактически не удалил его из базы данных по какой-то причине? Он удаляет его в форме, но когда я запускаю его снова, он снова появляется? – wwrwer

+0

Лучше разрешите [документацию об OleDbParameterCollection] (http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparametercollection (v = vs.110) .aspx) объяснить это. Неудачное удаление может быть вызвано вашей строкой соединения. Не могли бы вы опубликовать его? – Steve

+0

Одним словом. Команда sql содержит один параметр placeholder (?), Поэтому нам нужно иметь один [OleDbParameter] (http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparameter (v = vs.110) .aspx). Этот параметр можно создать с помощью его конструктора или с помощью [AddWithValue] (http://msdn.microsoft.com/en-us/library/system.data.oledb.oledbparametercollection.addwithvalue (v = vs.110) .aspx) ярлык OleDbParameterCollection. Параметр имеет имя @ p1, но это не важно, потому что OleDb находит необходимые параметры, следуя порядку заполнителей в тексте sql. – Steve

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

  • Нет связанных вопросов^_^