2016-11-08 2 views
1

Я пытаюсь обновить таблицу из данных, заполненных в форме.
Переменные вытягивают из формы, как это:Обновление SQL, без ошибок, без обновления

_JEBatchDate = IIf(Me.textJEBatchDate.Text.Trim.Length > 0, Me.textJEBatchDate.Text.Trim, "") 

SQL, обновление выглядит следующим образом ...

UPDATE [MAIN] SET [CheckNumber] = @checknumber, [CheckDate] = @checkdate, [CheckCashDate] = @checkcashdate, [CheckAmount] = @checkamount, [PayeeNumber] = @payeenumber, [AccountNumber] = @accountnumber, [Bank] = @bank, [ToTheOrderOf] = @totheorderof, [CheckType] = @checktype, [DatePaperworkSentToPayee] = @datepaperworksenttopayee, [DatePaperworkSentToBank] = @datepaperworksenttobank, [IncompleteReason] = @incompletereason, [RejectReason] = @rejectreason, [CaseNumber] = @casenumber, [BankStatus] = @bankstatus, [CorrWithPayee] = @corrwithpayee, [Comments] = @comments, [BankCredit] = @bankcredit, [Refund] = @refund, [DateFundsRecdFromBank] = @datefundsrecdfrombank, [DateRefundRecd] = @daterefunded, [DateTargetSent] = @datetargetsent, [NumberOfTargets] = @numberoftargets, [DateCreditPostedToCLI] = @datecreditpostedtocli, [DateSentToSGForRepayment] = @datesenttosgforrepayment, [DateClaimWasRepaid] = @dateclaimwasrepaid, [NewCheckNumber] = @newchecknumber, [NewCheckAmount] = @newcheckamount, [ARCHIVED] = @archived, [JEBatchName] = @jebatchname, [JEBatchDate] = @jebatchdate WHERE [ID] = @ID; 

Все значения построены таким образом:

strValues = strValues & "[JEBatchDate] = @jebatchdate " 

Внутри Try ... Catch, параметры сконструированы таким образом:

Try 
     Using updateCmd As New OleDb.OleDbCommand(UpdateSQL, HMOConnection) 
      updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 
      updateCmd.Parameters.AddWithValue("@checknumber", _checkNumber) 
      updateCmd.Parameters.AddWithValue("@checkdate", _checkDate) 

Я использую updateCmd.ExecuteNonQuery() для выполнения запроса.
Код проходит через Try ... Catch без ошибок, но обновление не записывается в запись. Я дважды проверял все имена, письма, соединение, но обновление не производится. Любые идеи или предложения приветствуются!

EDIT
Если переместить эту линию от верха до низа я получаю ошибку типа данных несоответствие:

updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 
+0

Как проверить, что обновление не работает? Вы использовали | DataDirectory | ярлык в вашей строке соединения? – Steve

+0

Я могу перейти непосредственно в базу данных и проверить. – user3795810

+1

вы профилировали базу данных, чтобы увидеть, что оператор попадает в базу данных, к которой вы ожидаете, и если да, сценарий выглядит так, как должен? Кроме того, попытались ли вы запустить профилированный запрос непосредственно в SSMS, чтобы подтвердить, что запрос фактически обновляет строку? – Kritner

ответ

3

Есть различные вопросы:

Нет обновления

Недостаточно кода, чтобы узнать, что происходит (l возможно, пустой Catch). Это скажет вам, если провайдер удалось:

Dim rows = updateCmd.ExecuteNonQuery() 

Если не ноль, то сделал обновление. Если вы не видите изменения, и БД является частью проекта, вы, вероятно, смотрите на неправильную копию БД. См Why saving changes to a database fails?

Datatype Несовпадение

Не используйте AddWithValue никогда (если ваше имя не Гордон Линофф или Горд Томпсон ... или, может быть, Стив). Это приводит к тому провайдеру предположить тип данных на основе данных:

updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 

Если ID столбца целого числа, вы передаете строку - которая является несоответствием данных. Все может пойти очень, очень неправильно с другими БД; использовать Add:

updateCmd.Parameters.Add("@ID", OleDbType.Integer).Value = Convert.ToInt32(labelID.Text) 

I made sure all of the parameters were correct, matching the parameter name with the variable.

Далее OleDB не использует именованные параметры, как такой - вы должны поставить каждый в точном порядке, что они появляются в SQL.Ваш SQL:

UPDATE [MAIN] SET [CheckNumber] = @checknumber, 
     [CheckDate] = @checkdate, 
     [CheckCashDate] = @checkcashdate,... 

Но вы не поставить параметры в таком порядке:

updateCmd.Parameters.AddWithValue("@ID", Me.labelID.Text) 
updateCmd.Parameters.AddWithValue("@checknumber", _checkNumber) 
updateCmd.Parameters.AddWithValue("@checkdate", _checkDate) 

@ID должен быть последним, так как она в последний раз в SQL

Не используйте IIF

_JEBatchDate = IIf(textJEBatchDate.Text.Trim.Length > 0, 
        textJEBatchDate.Text.Trim, 
        "") 

«Новый» If оператор накоротко, так что только истинная или ложная часть выполнена:

_JEBatchDate = If(textJEBatchDate.Text.Trim.Length > 0, 
         textJEBatchDate.Text.Trim, 
         "") 
Смежные вопросы