2012-11-08 2 views
0

"지속적인 양식"하위 폼이있는 Microsoft Access 응용 프로그램이 있습니다. 내 응용 프로그램에서 해당 양식에 액세스 할 때 SQL Server에 "많은"잠금 (1000 개 이상)이 있음을 발견했습니다. [master 데이터베이스보기 sys.dm_trans_locks에서 1000 개의 레코드를 선택하여 찾았습니다.어떻게 데이터베이스를 잠근 액세스를 금지합니까?

양식의 데이터 소스는 qryProspect 요약이라는 Pass Through Query입니다. 그것은 차례 차례로 SQL "EXEC qryProspectSummary"를 사용하여 필요한 데이터를 반환하는 저장 프로 시저를 호출합니다.

저장 프로 시저 "qryProspectSummary"는 일부 선택 항목과 합집합을 사용하고 여러 테이블에 조인하는 복잡한 선택 문입니다. SQL Server Management Studio에서 실행하면 올바른 결과가 생성되고 데이터베이스의 일부가 잠기지 않습니다.

데이터 소스 레코드 세트 유형을 "스냅 샷"으로 설정했습니다.

Access에서 이러한 모든 잠금을 제거하지 못하게하려면 어떻게해야합니까? 데이터 스냅 샷으로 간주되는 작업에 대한 다중 사용자 작업을 효과적으로 파기합니다.

+1

NOLOCK (http://msgroups.net/microsoft.public.sqlserver.server/nolock-on-view-stored-proce/40229)을 보았습니까? – Fionnuala

+0

NOLOCK이 있음을 알고 있습니다. 그러나 SQL Server에 대한 요청에서 프로필을 실행했을 때 한 가지 발견 한 사실은 잠금이 실행 중 SQL Server가 아닌 저장 프로 시저에서 결과를 가져 오는 즉시 ACCESS에서 수행되었음을 나타냅니다. 저장 프로 시저 액세스 잠금이 양식을 닫을 때까지 잠금 장치가 그대로 유지됩니다. – akc42

답변

1

링크 된보기를 사용하여이 스냅 샷의 결과를 반환 할 수 있습니다. 일부 경우에는 Access에서 SQL Server의 대용량 데이터 세트를 처리 할 때 훨씬 더보기가 사용되는 것으로 나타났습니다. 어떤 방법으로도 사용할 수 있습니까 qryProspectSummary보기? 이것은 작동하는 것이 보장되지 않지만 제가 시도 할 수있는 하나의 옵션입니다.

+0

다른 방법으로 작업하고 있으므로 시도하지 않았습니다. 응용 프로그램에서보기를 사용하면 효과가 있지만 뷰의 한 가지 어려움은보기 정의에서 출력을 주문할 수 없다는 것입니다. (ACCESS가 주문할 수는 있지만 비효율적입니다.) 이 쿼리의 중요한 점 중 하나는 행을 반환하는 순서입니다. – akc42

+0

사용중인 SQL Server 버전은 무엇입니까? [핫픽스가 있음] (http://support.microsoft.com/kb/926292) 2008 년에보기에서 주문을 사용할 수 있습니다. – HelloW

+0

SQL Server Express 2008 R2를 사용하고 있습니다. 내가보기에 주문하는 데 실수를 범한 적이 있습니까? – akc42

0

어제 내 문제에 대한 답변을 찾았지만 어떤 이유로이 사이트에 액세스 할 수 없습니다. 저장 프로 시저에 대한 액세스로 패스 스루 쿼리를 만드는 대신 폼의 ON LOAD 이벤트에 다음 코드를 추가했습니다.

Dim cmd As ADODB.Command, rst As ADODB.Recordset 
Set cmd = New ADODB.Command 
cmd.ActiveConnection = getStrConn 
cmd.CommandText = "qryProspectSummary" 
cmd.CommandType = adCmdStoredProc 
Set rst = cmd.Execute() 
Set Me.Form.Recordset = rst 
Set cmd = Nothing 

getStrConn

데이터베이스 연결 문자열을 (I 시작시 데이터베이스를 변경하는 관리 기능을, 그래서 난 그냥 하드 코드 수 없습니다) 시도하는 기능입니다. 이렇게하면 문제가 해결되며 양식을 열면 일상적인 문제가 잠겨 있지 않은 것으로 나타납니다.

하나의 단점이 있지만 Form.Requery를 사용했지만 쿼리를 다시 실행하지 않습니다. 위의 코드를 다시 실행해야합니다. 하지만 지불 할 작은 가격

+0

이 기능적으로 작동하지만이 응용 프로그램에 필요한 필터링 문제가 있습니다. 실제로 저장 프로 시저와 다시 쿼리에 매개 변수를 전달해야했습니다. 결과 집합에 필터를 추가하거나 제거하십시오. 그래서 나는 그것이 장기적으로 올바른 대답인지 아직 확신하지 못하고있다. – akc42

관련 문제