문제

나는 MSSQL2000 데이터베이스에 링크 된 Multiuser Access 2000 DB를 유지하고 있습니다.

데이터베이스 디자인은 매우 열악하므로 저와 함께해야합니다.

'고객'양식에는 기본적으로 다음 사용 가능한 고객 ID를 가져와야하는 'Customer_ID'필드가 있지만 사용자는 기존 고객 ID 로이 선택을 재정의 할 수있는 옵션이 있습니다.

이제 Customer_ID 필드는 고객 테이블의 PK가 아닙니다. 또한 독특하지 않습니다.

고객이 두 번 전화를 걸어 작업을 제출하면 테이블에는 각각 동일한 고객 정보가있는 두 개의 레코드와 동일한 고객 ID가 표시됩니다.

사용자가 새 티켓을 작성하는 경우 Access는 다음 사용 가능한 고객 ID를 빠르게 조회하여 작성합니다. 그러나 레코드를 저장하지는 않습니다. 분명히 문제 - 두 사용자 편집은 서로의 작업을 추적하여 고객 ID를 속이지 않아야합니다.

따라서 "새 레코드"버튼을 수정하여 새 항목을 만든 직후 티켓을 저장하고 싶습니다.

문제는 변경 사항을 테스트 할 때 "편집을 시작한 이후 다른 사용자 가이 레코드가 변경되었습니다"라는 것입니다.

확실히 DB의 다른 사용자는 없습니다. '다른 사용자'는 아마도 내 강제 저장 일 것입니다.

어떤 아이디어?

도움이 되었습니까?

해결책

SQL Server 2000에서 링크 된 테이블을 살펴보십시오. 비트 데이터 유형이 포함 된 필드가 있습니까? Access는 비트 필드가있는 경우 링크 된 테이블 시나리오 에서이 오류 메시지를 제공합니다. 기본값이 없습니다.

귀하의 경우에 문제가되지는 않지만 Access 2007 데이터베이스에서 동일하게 경험했으며 기본값이없는 비트 필드로 문제를 추적했습니다.

다른 팁

나는 전에이 행동을 보았고 이것은 나를 위해 그것을 고쳤다.

테이블에 타임 스탬프 필드를 추가하십시오 (이 필드를 추가하고 링크 된 테이블을 업데이트하십시오.이 필드에 모든 종류의 데이터로 채울 필요가 없습니다).

당신이받는 오류는 일반적으로 다음과 같은 경우에 발생합니다.

  1. 양식으로 레코드를 편집하고 있으며 양식이 더럽습니다 (예 : 저장되지 않음),

그리고

  1. DAO 또는 ADO를 사용하여 SQL을 실행하여 동일한 레코드를 업데이트하는 코드를 실행합니다.

Jet에게는 두 개의 "사용자"입니다. 두 개의 다른 편집 작업이기 때문입니다. 기본 테이블은 SQL 업데이트로 업데이트되었으며 양식 버퍼의 데이터는 이제 구식입니다.

일반적인 솔루션은 SQL 업데이트를 실행하기 전에 저장을 강제하는 것입니다.

  If Me.Dirty Then
     Me.Dirty = False
  End If
  [run your SQL update here]

그러나 양식을 사용하여 레코드를 편집하는 경우 업데이트를 수행하기 위해 SQL에 의지하지 않고 양식의 모든 업데이트를 수행해야합니다.

자신만의 시퀀스를 생성 할 때 설명하는 상황은 이러한 방식으로 수행되어야합니다.

  1. 사용자는 새 레코드 버튼을 누릅니다.

  2. calc 다음 시퀀스 값 및 변수에 저장하십시오.

  3. SQL 인서트를 통해 해당 시퀀스 값으로 새 레코드를 삽입하십시오.

4a. 양식이 테이블의 모든 레코드에 바인딩 된 경우, 데이터 편집 양식을 요청하고 (새 레코드 버튼이 사용자가 데이터를 편집하는 양식에 있다고 가정하고) 북마크 내비게이션을 사용하여 시퀀스 값이있는 새 레코드로 이동합니다. 2 단계의 변수에 저장되었습니다.

4B. 당신의 양식이라면 ~ 아니다 모든 레코드에 결합하여 (잘 설계된 데이터베이스 인 경우) 양식의 레코드 소스를 변경하여 새 레코드 만로드합니다.

또 다른 대안은 SQL Insert and Requery (또는 레코드 소스 재설정)를 피하고 기존 양식에 새 레코드를 추가하고 시퀀스 필드를 새 값으로 설정하고 즉시 레코드를 저장하는 것입니다.

핵심 요점은 이것이 다중 사용자 환경에서 작동하기 위해서는 시퀀스 값이 할당 되 자마자 레코드를 저장해야한다는 것입니다. 이는 레코드를 구축하지 못하게 할 수 없습니다. 동일한 시퀀스 값은 다른 사용자가 사용할 수 있으며, 이는 단지 재난을 요구하는 것입니다.

이것은 Google에서 만난 오래된 질문이므로 답변을 제출하겠습니다.

ODBC 드라이버에서는 행 버전을 켜야합니다. 테이블이 이미 액세스중인 경우 테이블을 떨어 뜨려 소스 테이블로 다시 링크해야합니다.

Access가 호출 된 테이블에 열을 추가해야하므로 행 버전을 활성화하는지 여부를 알 수 있어야합니다. xmin.

사용자가 자신의 가치로 새로운 고객 _id를 무시했는지 여부를 추적합니다. 그렇지 않은 경우, 앱은 저장하기 전에 바로 중복을 확인하고 다시 자체적으로 증가시킬 수 있어야하며 사용자는 기본값을받지 않았습니다. 어쩌면 다른 값을 자동으로 선택해야한다는 사용자의 표시기조차도 어쩌면 어쩌면 어쩌면 다른 값을 선택해야 할 수도 있습니다.

나는 또한 같은 문제가있었습니다. 스프링 MVC와 최대 절전 모드를 사용하여 테이블에서 업데이트하려고했습니다. 내 경우 테이블의 버전 열에는 1 (즉 3) 이상의 값이 포함되어 있지만 업데이트 쿼리의 업데이트 정보에는 버전 값 1이 있습니다.

우리의 문제는 액세스 프론트 엔드가 int (예/아니오)를 MSSQL 비트 (0/1) 필드에 저장하려고한다는 것입니다. MSSQL 데이터베이스를 Int 필드로 변경하는 것은 매력처럼 작동했습니다.

방금이 오류를 생성하는 또 다른 상황이 발생했습니다. MySQL 테이블에는 초기에 기본값 '0000-00-00'이있는 두 개의 날짜 열이있었습니다. 나중에 기본 널로 변경되었지만 많은 행이 '0000-00-00'값을 유지했습니다. 오류를 중지하기 위해 값을 null로 수동으로 재설정해야했습니다.

오류를 유발하는 것이 무엇인지 알아내는 데 많은 시간이 걸렸습니다.

SQL Server 테이블에 DateTime2 열이 포함되어 있으면이 오류가 발생할 수도 있습니다 (내 경우 SysDateTime ()의 기본값 인 경우). DateTime으로 다시 DateTime Default Current_TimeStamp로 변경하면 오류가 중지됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top