2012-04-23 4 views
0

Я использую следующий SQL для записей ADO против SQLServer бэкэндом в VB6:Update ADO Recordset для вычисляемого поля

select c.name, taxid= 
    case when exists(select 1 from sometable where fld='abc') 
    then c.SSN else null end 

Когда я пытаюсь обновить поле taxid в ряд в локально записей ADO жалуется на ошибку «Многоступенчатые операции сгенерированные ошибки. Проверьте каждое значение состояния». Я предполагаю, что это беспокоит тот факт, что поле налогообложения исходит из вычисленного поля, а не как столбец сырой таблицы. Для моих целей я никогда не буду настаивать на этих изменениях в базе данных, поэтому я ищу способ сообщить ADO, у которых нет намерения сохранять изменения, чтобы он позволял мне локально изменять данные.

+0

Я бы ожидать ошибку, так как taxid не реальный столбец. Такая же ошибка, когда вывод - 'taxid = c.name + c.SSN'. Лично я бы не использовал набор записей в VB6 для сохранения обновлений в базе данных, а скорее использовал хранимую процедуру и отправил параметризованные вызовы в эту хранимую процедуру. Разумеется, эта процедура должна быть написана только для разрешения ввода для обновляемых столбцов. Я не знаю, есть ли способ заставить ADO подчиняться базовому определению. –

+0

thx @Aaron, но я не сохраняю обновления в базе данных. Я только пытаюсь изменить значения в наборе записей для моих местных потребностей. Будет ли способ настроить набор записей так, чтобы ADO не «беспокоился» о проблемах с сохранением, которые никогда не произойдут? – sisdog

+2

Вы пытались отключить набор записей? Установите rst.ActiveConnection = Nothing. – HK1

ответ

1

Я думаю, что предложение @ HK1 является хорошим, хотя я не уверен, что происходит с вашей способностью изменять любые значения в наборе записей, независимо от того, вычисляется ли столбец, который вы пытаетесь обновить, или нет. Прошло много времени с тех пор, как я играл с классическим ADO, но если набор записей отключен, он может быть прочитан только в этот момент.

Но если у вас нет интереса к использованию набора записей для выполнения обновлений, вам необходимо изменить значения локально, возможно, вам стоит сначала сохранить результаты в локальном массиве? Таким образом, вы можете минимизировать блокировку и параметры курсора набора записей, например, и сразу закрыть набор записей и освободить эти ресурсы.

rs.Open cmd, conn, adOpenForwardOnly, adLockReadOnly 

Dim MyArray 
MyArray = rs.GetRows() 

rs.Close: set rs = nothing 

Теперь вы можете манипулировать однако вы хотите ...

+0

Это ошибочно было отклонено, затем я получил телефонный звонок. Теперь SO не позволит мне отменить его, пока вы не сделаете редактирование. – Bob77

+0

Downvote вернулась! – Bob77

+0

Упс, сделано. Мне нужно сойти с проклятого телефона здесь, пока серфинг! – Bob77

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