2016-12-30 15 views
0

우리는 2000 동안 개발 된 오래된 레거시 응용 프로그램을 가지고 우리는 내가 응용 프로그램의 모듈을 실행하려고 할 때, 그것은 나에게 오류주고있다 2007 액세스 2003 년 이사 :DAO에서 ADO로 코드를 다시 작성하는 방법은 무엇입니까?

"Run-time error 3847. ODBCDirect is no longer supported. Rewrite the code to use ADO instead of DAO".

과 그것은 라인 Set WS = CreateWorkspace("NewWS", "", "", dbUseODBC) 하이라이트. 내가 Access에 정말 처음 왔기 때문에이 문제를 게시하기 전에 조사를했지만 행운은 없습니다. DAO 대신 ADO를 사용하도록 코드를 다시 작성하려고합니다.

다음은 내 오랜 VBA 코드 : 나는 코드를 다시 작성하기 시작했다

Public Function GetID (ByRef SegmentItem As clsSegmentDefinitions) As Long 
    Dim qdf As QueryDef 
    Dim qdfNewID As QueryDef 
    Dim rs As Recordset 
    Dim rsNewID As Recordset 
    Dim NaturalDescription As String 
    Dim WS As Workspace 
    Dim con As Connection 
    Set WS = CreateWorkspace("NewWS", "", "", dbUseODBC) 
    WS.DefaultCursorDriver = dbUseODBCCursor 
    Set con = WS.OpenConnection("", , , SQLConnectString) 
    DoCmd.Hourglass False 
    DoCmd.OpenForm " frmQuickAdd_AddNatural ", , , , , acDialog, SegmentItem.AddValue 
    DoCmd.Hourglass True 
    If Form_frmQuickAdd_AddNatural.Tag Then 
     Set qdf = con.CreateQueryDef("", "{ ? = call sp_Insert(?, ?, ?) }") 
     qdf.Parameters.Refresh 
     qdf![@prmDescription] = Left(Form_frmQuickAdd_AddNatural.txtSegmentDescription, 34) 
     qdf![@prmCreateUser] = CurrentUser 
     qdf![@prmProjectID] = 0 
     qdf.Execute 
     Set qdfNewID = CodeDb.CreateQueryDef("") 
     qdfNewID.Connect = SQLConnectString 
     qdfNewID.ReturnsRecords = True 
     qdfNewID.SQL = "sp_GetNewSegmentID" 
     Set rsNewID = qdfNewID.OpenRecordset 
     If Not IsNull(rsNewID!MaxOfSegmentID) Then 
      GetID = rsNewID!MaxOfSegmentID 
     Else 
      GetID = 0 
     End If   
    Else 
     GetID = 0 
    End If 
    DoCmd.Close acForm, "frmQuickAdd_AddNatural"  
End Function 

하지만 전혀 이런 식으로 생각하면 나는 단서가 없다.

Dim cnn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 

cnn.Open "Provider=mssql;Data Source=" & dbq & ";User Id=" & uid & ";Password=" & pwd 
With rst 
    .Open "SELECT COUNT(*) FROM " & tbl, cnn, adOpenKeyset, adLockOptimistic 
    num = .Fields(0) 
    .Close 
End With 
cnn.Close 
Set rst = Nothing 
Set cnn = Nothing 
+0

ADO에 다시 작성하는 작업이 많습니다. 또는 ODBC 워크 스페이스없이 작업하려면 DAO를 사용하여 수정하십시오. – Gustav

+1

나는 모든 것을 SQL Server 무료 버전으로 이식 할 것입니다. Access와 시간을 보냈는데 최근에는 여전히 버그가 있습니다. 무서운. –

+1

코드 블록을 수정하기 위해 질문을 다시 형식화했지만이 시점에서는 질문이 너무 광범위합니다. ADO에 대한 정보는 [Documentation.SO] (http://stackoverflow.com/documentation/vba/3578/working-with-ado#t=201612301821243706514)에서 확인할 수 있습니다. * 특정 * 문제에 빠질 때 * 구체적인 * 질문이 생기면 * 구체적인 * 답을 줄 수 있습니다. 지금은 다른 사람들에게 스택 오버플로가 아닌 "번역"작업을 요청하는 것처럼 보입니다. –

답변

2

처음에는 DAO를 기반으로 작성되고 설계된 응용 프로그램에 ADO를 도입하고 싶지 않습니다. 더 나쁜 것은, ADO가 약 15 년 동안 나섰다는 것입니다. 실제로 SQL 서버는 ADO가 작동하는 oleDB에 대한 지원을 중단합니다. (그래서 가지 마세요). 업계는 멀리 ADO 및 모든 주요 벤더 이동 한 업계 표준으로 개방형 데이터베이스 연결을 사용하도록 제안하는

http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access.aspx

:

는 SQL 서버 삭제 OLEDB 지원에 대한 링크를 참조하십시오. (즉, ODBC를 의미합니다).

Access에서 통과 쿼리를 만들고 저장합니다.

Public Function GetID(ByRef SegmentItem As String) As Long 

    Dim strSQL  As String 

    strSQL = "sp_Insert('" & _ 
      Left(Form_frmQuickAdd_AddNatural.txtSegmentDescription, 34) & "'," & _ 
      "'" & CurrentUser & "', 0)" 

    With CurrentDb.QueryDefs("qryPass") 
    .SQL = strSQL 
    .ReturnsRecords = False 
    .Execute 
    End If 

    With CurrentDb.QueryDefs("qryPass") 
    .SQL = "sp_GetNewSegmentID" 
    .ReturnsRecords = True 
    GetID = Nz(.OpenRecordset()("MaxOfSegmentID"),0) 
    End With 

End Function 

그래서 하나 개의 통과하지만 쿼리를 만들 : 같이 코드는 다시 쓸 수 있습니다. 그리고 당신은 JET-DIRECT를 사용하고있는 모든 장소에서 그것을 아주 많이 사용할 수 있습니다. 액세스 2007에서는 제트 다이렉트 지원이 중단되었지만 단순한 통과 쿼리를 사용하는 것만으로 충분할뿐만 아니라 코딩 및 개발자 시간을 절약 할 수 있습니다. 가지고있는 "왼쪽"표현식이 null을 반환 할 수 있다면 그 표현식을 ""(null 문자열) 또는 적절한 값을 반환하기 위해 nz()에 랩핑해야 할 가능성이 높습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 pass-through query online에 대해 공부하고 있습니다. 그래서 위의 "qrypass"는 통과 쿼리입니다. 맞습니까? 패스 스루 쿼리에는 무엇이 들어 있습니까? 저장 프로 시저 sp_insert입니까? – toofaced

+0

통과 쿼리에 원하는 것을 넣을 수 있습니다. 따라서 tblCustomers에서 간단한 select count (*)로 PT를 테스트하십시오. PT 쿼리는 합법적 인 t-SQL 문으로 시작할 수 있습니다. 위의 그림에서 PT 쿼리의 .SQL 텍스트 속성을 "자주"수정합니다. 먼저 PT 쿼리를 클릭하여 테스트합니다. 위의 코드가 작동하면 위에서 설명한대로 .SQL 속성이 변경됩니다. 이렇게하면 PT 쿼리에 ANY t-sql을 채우고 사용할 수 있습니다. 또한 코드에서 연결 문자열을 엉망으로 만들지 않고 제트 직접 코드를 대체 할 수 있음을 의미합니다. –

+0

qryPass는 PT 쿼리에 사용한 이름입니다. 원하는 이름이 될 수 있습니다. DAO 레코드 세트 코드의 나머지는 다시 쓰지 않아도 이전처럼 작동 할 것이므로이 방법이 바람직합니다. 따라서이 접근 방식은 기존 DAO 레코드 세트 코드의 변경 사항을 최소화합니다. –