2

В моей программе у меня есть функция под названием runSQL, здесь:Получив сообщение об ошибке при попытке обновить запись

Dim Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TrainingLog.accdb") 
    Dim DT As New DataTable 
    Dim DataAdapter As OleDb.OleDbDataAdapter 

    Connection.Open() 
    DataAdapter = New OleDb.OleDbDataAdapter(query, Connection) 
    DT.Clear() 
    DataAdapter.Fill(DT) 
    Connection.Close() 
    Return DT 

И я пытаюсь обновить запись в базе данных, используя строку обновления, получено из этого кода:

Dim sqlString As String 

    sqlString = "UPDATE UserRecords set FirstName = '" & txtName.Text 
    sqlString = sqlString & "', LastName = '" & txtSurname.Text 

    If ChkSmoker.Checked = True Then 
     sqlString = sqlString & "', Smoker = true" 
    ElseIf ChkSmoker.Checked = False Then 
     sqlString = sqlString & "', Smoker = false" 
    End If 

    sqlString = sqlString & ", Weight = " & txtWeight.Text 

    If RdoMale.Checked = True Then 
     sqlString = sqlString & ", Gender = 'm'" 
    ElseIf RdoFemale.Checked = True Then 
     sqlString = sqlString & ", Gender = 'f'" 
    End If 

    sqlString = sqlString & " WHERE UserName = '" & LstUsers.SelectedItem.ToString & "'" 

    runSQL(sqlString) 

Однако когда я нажимаю на кнопку сохранить, я получаю сообщение об ошибке от линии 7 функции runSQL (не включая пустую строку, так что это DataAdapter.Fill (DT) линия), которая говорит «Нет значения для одного или нескольких требуемых параметров».

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

Одна вещь, о которой я думал, заключается в том, что в обновляемой таблице есть поля, отличные от тех, которые упоминаются в моей инструкции UPDATE. Например, есть поле «Да/Нет» под названием «TeamMember», о котором я не упоминаю в инструкции обновления. При использовании функции обновления мне нужно давать значения для каждого поля, даже те, которые не меняются?

Спасибо за чтение и, надеюсь, помощь!

+0

Вы используете TSQL? – Hockenberry

+0

Честно говоря, я не знаю. Я просто изучаю Visual Basic в школе, и мне сказали, что части SQL использовать, а не учили их. – DatBrummie

+0

Вы действительно посмотрели на инструкцию SQL, которую генерирует весь этот код? Это было бы первым делом, чтобы посмотреть, будет ли это то, что вы ожидаете. Если вы посмотрели, пожалуйста, сообщите нам, что вы видите. – jmcilhinney

ответ

0

Вы никогда не должны компилировать SQL-запрос самостоятельно. Это значительно облегчает и безопаснее (для vaoid SQL-инъекции) для создания параметризованного запроса или использования хранимой процедуры. Затем выполните его, выполнив разбиение на запрос или имя хранимой процедуры и значения параметров.

Кроме того, таким образом, вам не нужно заботиться о том, какой правильный формат предназначен для определенного значения. Например, как вы форматируете дату? И как вы форматируете логическое значение? Скорее всего, проблема с вашим запросом - это значение false или true, которое вы пытаетесь установить для столбца Smoker, потому что в TSQL это значение бит и может быть только 0 или 1.

Проверьте это, чтобы просмотреть образцы параметров: ADO.NET Code Examples (Щелкните вкладку VB, чтобы увидеть ее в VB). Вы увидите, что вы определяете параметр, указывающий имя с префиксом @ в запросе, а затем вы просто передаете значение для каждого параметра в запросе и оно будет передано на сервер в правильном формате без вашего ухода из этого.

Взято из одного из образцов:

Dim queryString As String = _ 
     "SELECT ProductID, UnitPrice, ProductName from dbo.Products " _ 
     & "WHERE UnitPrice > @pricePoint " _ 
     & "ORDER BY UnitPrice DESC;" 
Dim command As New SqlCommand(queryString, connection) 
command.Parameters.AddWithValue("@pricePoint", paramValue) 

'' command.ExecuteXXX 

ВНИМАНИЕ, что вы можете выполнить команду по-разному, в зависимости от ваших потребностей, чтобы просто выполнить его или получить скалярное значение или полный набор данных в результате ,

+0

Когда я добавляю пользователя в базу данных, я использую код: (nevermind, комментарии, которые, я думаю, не позволят мне вставить его и форматировать), но при добавлении пользователя true или false - это то, что я использовал для столбца Да/Нет в доступе, и он работал для добавления, поэтому я предположил, что он будет работать для редактирования. – DatBrummie

+0

В другом месте программы я использовал здесь код: http://pastebin.com/qPwW2zTw (not конечно, если на сайте разрешено использование пастихина, но я не знаю hink, я могу правильно форматировать код в комментариях), и это отлично работает, используя функцию SQL, и используя true в качестве значения для него. (TeamMember - это флажок, как курящий в исходной проблеме), поэтому я уверен, что проблема лежит где-то в другом месте. Я просто не могу найти, где – DatBrummie

+0

Ты вирг, @DatBrummie. Извините, я не понимал, что это Access. Nexttiem, попробуйте соответствующим образом пометить ваш вопрос. Я исправил теги. – JotaBe