2016-09-27 3 views
1

Я пытаюсь обновить базу данных Access из XML-файла с помощью VB.NET и OleDB. Я использую следующий код, но не могу заставить обновление работать. Я не получаю никаких ошибок, но обновление не происходит - похоже, обработка CRSID является строкой, несмотря на .DbType.Int32. Отладочный вывод показывает все правильные значения, и аналогичный метод для Insert SQL отлично работает. Если я жестко кодирую значение в CRSID, db обновляется, но данные находятся в неправильных столбцах. LastName содержит CRSID и FirstName содержит LastName. Надеюсь, кто-то может помочь.Обновление SQL в VB.NET с использованием OLEDB

For Each drCurrent In dt.Rows 
      Using cmd As New OleDb.OleDbCommand With 
       { 
        .Connection = cn, 
        .CommandText = 
        <SQL> 
         Update NewPMS SET LastName = @LastName, FirstName = @Firstname WHERE CRSID = @CRSID 
        </SQL>.Value 
       } 
       cmd.Parameters.AddRange(New OleDb.OleDbParameter() _ 
        { 
         New OleDb.OleDbParameter With {.ParameterName = "@CRSID", .DbType = DbType.Int32}, 
         New OleDb.OleDbParameter With {.ParameterName = "@LastName", .DbType = DbType.String}, 
         New OleDb.OleDbParameter With {.ParameterName = "@FirstName", .DbType = DbType.String} 
        } 
       ) 
       cmd.Parameters(0).Value = drCurrent("CRSID") 
       cmd.Parameters(1).Value = drCurrent("LastName") 
       cmd.Parameters(2).Value = drCurrent("FirstName") 
       cn.Open() 
       cmd.ExecuteNonQuery() 
       cn.Close() 
       cmd.Parameters.Clear() 
      End Using 
     Next  

ответ

2

В OleDb параметры являются позиционными. Они не признаются по имени. (См Remarks section на OleDbCommand.Parameters collection)

Заполнитель параметр @CRSID выступает в качестве последнего в запросе, но первая OleDbCommand.Parameter есть, названный по имени, и заполняется значением для @CRSID.

Это означает, что все ваши параметры используются для неправильных полей или условий, и вы в конечном итоге получаете предложение where. Команда выполняет поиск в поле CRSID со значением FirstName (и, конечно, не может найти никакого совпадения).

Правильный код для SQL является

Update NewPMS SET 
    LastName = @LastName, 
    FirstName = @Firstname 
WHERE CRSID = @CRSID 

.... 

cmd.Parameters.AddRange(New OleDb.OleDbParameter() _ 
    { 
     New OleDb.OleDbParameter With {.ParameterName = "@LastName", .DbType = DbType.String}, 
     New OleDb.OleDbParameter With {.ParameterName = "@FirstName", .DbType = DbType.String} 
     New OleDb.OleDbParameter With {.ParameterName = "@CRSID", .DbType = DbType.Int32}, 
    } 
) 
cmd.Parameters(0).Value = drCurrent("LastName") 
cmd.Parameters(1).Value = drCurrent("FirstName") 
cmd.Parameters(2).Value = drCurrent("CRSID") 

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

+0

Это сработало отлично. Вы заслуживаете золотую звезду! – RGold

+0

Рад помочь. Являясь новым пользователем сайта, я рекомендую прочитать [Как работает прием ответа] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Steve

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