2014-01-06 2 views
1

Я работаю в небольшой программе базы данных SQL. Программы для просмотра, редактирования и обновления записей базы данных. Все работает замечательно, учитывая, что я никогда раньше не пробовал что-то подобное. Мне удалось получить функции «Добавить записи», «Обновить записи» и «Удалить записи», работая безупречно. Тем не менее, я немного ударил, пытаясь ОБНОВИТЬ выбранную запись.SQL-программа UPDATE Ошибка записи

Чтобы уточнить, таблица SQL отображается в виде списка, из этого списка просмотра конечный пользователь может выбрать конкретную запись и либо отредактировать, либо удалить ее.

Example Image

Кнопка редактирования открывает новый вид окна с текстовыми полями, которые автоматически заполняются текущей информацией этой записи.

Example Image

Код для формы редактирования записи:

Private Sub frmEdit_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    intDB_ID_Selected = CInt(frmMain.lvRec.SelectedItems(0).Text) 
    Call dispCaption() 
    Call dispInfo()  'Display the info of the selected ID 


End Sub 

Private Sub dispInfo() 
    SQL = "Select * from PersonsA " & _ 
      "where Members_ID=" & intDB_ID_Selected & "" 

    With comDB 
     .CommandText = SQL 
     rdDB = .ExecuteReader 
    End With 
    If rdDB.HasRows = True Then 
     rdDB.Read() 

     Me.midtxt.Text = rdDB!Members_ID.ToString.Trim 
     Me.gttxt.Text = rdDB!Gamer_Tag.ToString.Trim 
     Me.sntxt.Text = rdDB!Screenname.ToString.Trim 
     Me.fntxt.Text = rdDB!First_Name.ToString.Trim 
     Me.lntxt.Text = rdDB!Last_Name.ToString.Trim 
     Me.dobtxt.Text = rdDB!DoB.ToString.Trim 
     Me.dobtxt.Text = rdDB!DoB.ToString.Trim 
     Me.emailtxt.Text = rdDB!E_Mail_Address.ToString.Trim 
     Me.teamptxt.Text = rdDB!Position.ToString.Trim 
     Me.ugctxt.Text = rdDB!Cautions.ToString.Trim 
     Me.recordtxt.Text = rdDB!Record.ToString.Trim 
     Me.eventatxt.Text = rdDB!Event_Attendance.ToString.Trim 
     Me.Mstattxt.Text = rdDB!Member_Status.ToString.Trim 

    End If 
    rdDB.Close() 
End Sub 

Private Sub dispCaption() 

End Sub 

Private Sub cmdUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdUpdate.Click 
    Call disControl() 
    'Validation 
    If invalidUpdateEntry() = True Then 
     Call enaControl() 
     Exit Sub 
    End If 
    'Prompt the user if the record will be updated 
    If MsgBox("Are you sure you want to update the selected record?", CType(MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2 + MsgBoxStyle.Question, MsgBoxStyle), "Update") = MsgBoxResult.Yes Then 
     'Update query 
      SQL = "Update PersonsA" & _ 
       "SET Members_ID='" & Me.midtxt.Text.Trim & "'," & _ 
        "Gamer_Tag='" & Me.gttxt.Text.Trim & "'," & _ 
        "Screenname='" & Me.sntxt.Text.Trim & "'," & _ 
        "First_Name='" & Me.fntxt.Text.Trim & "'," & _ 
        "Last_Name='" & Me.lntxt.Text.Trim & "'," & _ 
        "DoB='" & Me.dobtxt.Text.Trim & "'," & _ 
        "E_Mail_Address='" & Me.emailtxt.Text.Trim & "'," & _ 
        "Position='" & Me.teamptxt.Text.Trim & "'," & _ 
        "U_G_Studio='" & Me.ugptxt.Text.Trim & "'," & _ 
        "Cautions='" & Me.ugctxt.Text.Trim & "'," & _ 
        "Record='" & Me.recordtxt.Text.Trim & "'," & _ 
        "Event_Attendance='" & Me.eventatxt.Text.Trim & "'," & _ 
        "Member_Status='" & Me.Mstattxt.Text.Trim & "'" & _ 
       "WHERE Members_ID='" & intDB_ID_Selected & "'" 
     Call execComDB(SQL)  'Execute the query 
     Me.Close() 
     '*** Refresh the list 
     SQL = "Select * from PersonsA " 
     Call frmMain.dispRec(SQL) 
     '--- End of refreshing the list 
     Exit Sub 
    Else 
     Call enaControl() 
    End If 
End Sub 

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

необработанное исключение типа «System.Data.SqlClient.SqlException» произошло в System.Data.dll

Дополнительная информация: Неправильный синтаксис рядом с 'Members_ID'.

Я знаю, что эта линия, что проблема

"WHERE Members_ID='" & intDB_ID_Selected & "'" 
      Call execComDB(SQL)  'Execute the query 

Но реферирования «intDB_ID_Selected» всегда работал раньше, и это было установлено, на нагрузке формы обновления записей в intDB_ID_Selected = CInt(frmMain.lvRec.SelectedItems(0).Text)

I знайте, что это огромная нить, но если кто-то может направить меня в правильном направлении. Не указывая мне переписать все заявление, я был бы навсегда благодарен.

EDIT1: Я зафиксировал запятую перед предложением WHERE, но я все равно получаю ту же ошибку.

+3

Помните, что вы активно открываете атаки SQL-инъекций. Используйте SQL-команды с параметрами вместо того, чтобы добавлять SQL самостоятельно. – BlackICE

+0

удалите запятую перед тем, где –

ответ

2

Отсутствует пространство между

"Update PersonsA " & _ 
"SET Members_ID= .... 

и (как уже отмечалось) а не запятой нужно перед WHERE

Сказала, что делать одолжение себе и своим пользователям. Не используйте конкатенацию строк для создания команды sql. Всегда используйте параметризованный запрос.

Подобно тому, как, например

SQL = "Update PersonsA SET [email protected], [email protected], [email protected]," & _ 
     "[email protected],[email protected],[email protected],[email protected]," & _ 
     "[email protected],[email protected],[email protected],[email protected]," & _ 
     "[email protected], [email protected] " & _ 
     "WHERE [email protected]" 
SqlCommand cmd = new SqlCommand(SQL, connection) 
cmd.Parameters.AddWithValue("@id", Me.midtxt.Text.Trim) 
..... so on for the other parameters defined above .... 
cmd.ExecuteNonQuery(); 
+0

СПАСИБО СМОТРЕТЬ! Я уже исправил запятую перед ГДЕ, но я не заметил нехватки места в предложении UPDATE. – user2980316

1

Изменить "Member_Status='" & Me.Mstattxt.Text.Trim & "'," & _

к "Member_Status='" & Me.Mstattxt.Text.Trim & "'" & _

Похоже, это просто дополнительный изгоев запятой!

+0

Я исправил это, но та же ошибка происходит:/Я утролю свои имена полей. – user2980316

+0

запрос на обновление буксировки имел запятую перед тем, где вы только удаляете ее из одного. –

+0

Привет, Al-3sli, на какой строке вы ссылаетесь? – user2980316

0

На любой ошибки, как это, используйте отладку снабженное Visual Studio.Проверьте значение SQL, вставьте его в MS SQL Management Studio - у него есть подсветка синтаксиса, и вы должны легко обнаружить ошибку.

Чтобы предотвратить дальнейшие проблемы (включая уязвимость внедрения SQL), отделите этот запрос на встроенный ресурс и используйте параметры. Затем его легко просматривать, поддерживать (вы можете копировать/вставлять между SQL Mgmt Studio и VS) и в конечном итоге использовать его в коде.

Замечание: вам не нужно использовать Call в VB.NET, просто введите имя метода с круглыми скобками.

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