2011-08-23 6 views
1

우리는 간단한 액세스 데이터베이스를 가지고 있으며 직원의 멤버를 선택하기 위해서만 폼의 단추를 사용할 수 있습니다. (버튼에 연결된 이벤트가 있음). 나는 별도의 테이블에 버튼을 클릭 할 수있는 직원의 사용자 이름을 저장하고 싶습니다.MS Access 2007, 현재 사용자를 테이블과 대조

사용자가 테이블에 사용자 이름이 있는지 확인하기 위해 간단한 쿼리를 수행하고 결과에 따라 버튼의 활성화 상태를 설정합니다.

내 배경은 C# 및 SQL Server이지만 VBA 및 액세스는 새로운 것이므로이 환경의 단점을 해결하기 위해 고심하고 있습니다.

advapi32.dll에서 GetUserNameA를 호출하여 fOSUserName 문자열로 로그온 한 사용자의 사용자 이름을 얻었지만 가장 간단한 쿼리로 인해 사용자 이름이 테이블에 존재하는지 확인하는 데 어려움을 겪고 있습니다.

매개 변수가 너무 적습니다 :

Dim strSQL As String 
Dim intResult As Integer 
Dim db As DAO.Database 
Dim rs As Recordset  
Set db = CurrentDb  
strSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" & _ 
    fOSUsername & "'"   
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) 
If Not rs.EOF Then 
    intResult = rs.Fields(0) 
Else 
    intResult = 0 
End If 
rs.Close 
db.Close 

이 오류를 나에게

런타임 오류 '3061'를 제공 db.OpenRecordset에 실패합니다. 예상 됨 1.

누구든지 몇 가지 지침을 제공 할 수 있습니까? 당신이 그것을 사용하는 방식에 완전히 익숙하지 해요,하지만 난 항상 이런 식으로했던

답변

1

[USERS] 객체 과 같은 소리는이 아니지만 Query (매개 변수 사용)입니다. 또한 '& _'(유효하지 않음)과 달리 '& _'(유효하지 않음)과 같은 구문 오류가있는 경우 데이터베이스가 컴파일되지 않습니다. 따라서 테이블 대 쿼리가 귀하의 경우라면 다음을 사용하십시오 :

... 
Dim rs As Recordset 
Dim qdf As QueryDef 

Set qdf = CurrentDb.QueryDefs("Users") 
qdf.Parameters("UserNameParameter") = fOSUsername 
Set rs = qdf.OpenRecordset 
... 
+0

죄송합니다. '& _' /'& _'은 내 실수입니다. 나는 그 형식을 향상시키기 위해 줄을 나누어서 엉망으로 만들었다. 이제 수정되었습니다. – Bryan

+0

@Bryan - 또한 fOSUsername 값을 확인하십시오. 예를 들어, 다음과 같이 SQL을 얻으면 런타임 오류도 발생할 수 있습니다. SELECT COUNT (*) FROM TestTable WHERE NewColumn = [username]. [username]은 매개 변수 –

+0

으로 간주 될 것이기 때문에 제가보기에는 문제라고 생각합니다 (내 런타임 오류 텍스트는 매개 변수를 나타냄). 여러 사이트에서 매개 변수를 언급하는 몇 가지 게시물을 보았지만 정직하게 작동하는 방식을 이해하지 못했고 내가 본 예를 통해 많은 성공을 거두지 못했습니다. 솔직히 말해서, 나는 지금이 시간을 보냈을 때 SQL Express 인스턴스와 인터페이스하는 기본 C# 데스크톱 응용 프로그램을 만들었을 것입니다. 지금이 방법이 나에게 가장 좋은 방법이라고 생각하기 시작했습니다. – Bryan

1

: 당신은 VBA에서 선을 계속하면

 

Dim sSQL As String 
Dim rs As ADODB.Recordset 
Dim cn As ADODB.Connection 

Set cn = New ADODB.Connection 
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[your access db file path and name];Persist Security Info=False" 

sSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" &_ 
    fOSUsername & "'" 

Set rs = New ADODB.Recordset 
rs.Open sSQL, cn 

If Not rs.EOF Then 
    intResult = rs.Fields(0) 
Else 
    intResult = 0 


rs.Close 
Set rs = Nothing 
cn.Close 
Set cn = Nothing 

 
+0

감사합니다. 코드가 데이터베이스에 있으므로 어떻게 데이터 소스를 지정합니까? – Bryan

+1

@Bryan이 경우에 ADO를 사용하려면 cn을 '새 ADODB.Connection'으로 설정하는 대신 Set cn = CurrentProject.Connection을 사용하십시오. – HansUp

+1

@HansUp은 CurrentProject.Connection을 사용할 수 있습니다. 당신에게 현재 DB를 제공 ... –

3

, 당신은 전에 사이의 공간이 필요 줄 연속 문자 ("_"). 그래서 대신의 :

strSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" &_ 
    fOSUsername & "'" 

사용이 : @Igor 투르 마늄는 지적

strSQL = "SELECT COUNT(*) FROM [USERS] WHERE [USERS].[NAME] = '" & _ 
    fOSUsername & "'" 

그러나, 밑줄 문자 앞에 공백의 부족은 컴파일 오류를 트리거합니다. 그래서 나는 어떤 일이 일어나는지 확신 할 수 없지만 어쨌든 혼란을 피하기 위해 그것을 고칠 것을 제안합니다.

필자는 레코드 집합을 연 다음 해당 레코드 집합에서 값을 읽는 대신 DCount() 함수를 사용하여 간단히 처리 할 수 ​​있다고 제안합니다.

Dim strCriteria As String 
strCriteria = "[USERS].[NAME] = '" & fOSUsername & "'" 
Debug.Print "strCriteria: '" & strCriteria & "'" 
If DCount("*", "USERS", strCriteria) = 0 Then 
    Debug.Print "not found" 
Else 
    Debug.Print "found" 
End IF 

USERS가 테이블이 아닌 쿼리이기 때문에 오류가있는 경우 DCount()에 대신 테이블을 사용하도록 요청할 수 있습니다. 또는 쿼리를 수정하십시오.

+0

1) & _ vs & _는 런타임이 아닌 _syntax_ 오류를 발생시킵니다. strSQL이 빈 문자열이면 "... 입력 테이블/쿼리를 찾을 수 없습니다"... " –

+0

@Igor Turman You 're 권리. 나는 여전히 DCount()에주의를 돌리고 싶다. – HansUp

+0

Igor의 대답에 대한 의견으로 게시 된 바와 같이,'& _' /'& _'는 오타였습니다. 사과. – Bryan

관련 문제