2012-04-23 3 views
0

을 위해 내가 VB6에서 SQLServer에 백엔드에 대한 ADO 레코드에 대해 다음 SQL을 사용하고 있습니다 :업데이트 ADO 레코드 계산 된 필드를

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 = 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 

이제 taxid 실제 열이 아니기 때문에 나는 오류를 기대

+0

이것은 잘못 내려져서 전화가 왔습니다. 이제 편집을하기 전까지는 취소 할 수 없습니다. – Bob77

+0

Downvote가 되돌 렸습니다! – Bob77

+0

죄송합니다. 서핑을하는 동안 여기서 전화를 끊어야합니다! – Bob77

관련 문제