programing

VBA에서 감가상각되지 않는 방법으로 SQL Server에 액세스하는 방법은 무엇입니까?

lastmoon 2023. 9. 9. 10:07
반응형

VBA에서 감가상각되지 않는 방법으로 SQL Server에 액세스하는 방법은 무엇입니까?

VBA 프로젝트에서 SQL Server 데이터베이스에 직접 액세스하는 모든 방법은 사용하지 않는 것으로 보입니다.

  • DAO with ODBCDirect:Access 2007과 함께 지원이 중단되었습니다.
  • 제트 경유 DAO: 진심이 아니죠?어쨌든, 마이크로소프트는 이 제품을 더 이상 쓸모없는 것으로 간주합니다.
  • SQLOLEDB 프로바이더와의 ADO:감가상각.
  • SQL Server Native OLEDB 프로바이더와의 ADO:SQL Sever 2012 이후에는 지원되지 않습니다.
  • ODBC용 마이크로소프트 OLE DB 공급자와의 ADO: 지원되지 않음: "SQL Server Native Client는 ODBC용 마이크로소프트 OLE DB 공급자(MSDASQL)에서 지원되지 않습니다."

제가 놓친 게 뭐죠?Microsoft가 승인한 공식적인 방법으로 VBA에서 SQL Server 데이터베이스에 액세스하는 방법은 무엇입니까?(결국 권장되지 않고 Office 2013에 포함된 공식 개발 언어입니다.)

제가 놓친 게 뭐죠?

기존 ODBC가 없습니다.Access 이외의 Office 애플리케이션을 위한 VBA 프로젝트에서는 ADO를 통한 ODBC가 가장 간단합니다.

Sub AdoOdbcExample()
    Dim con As Object
    Set con = CreateObject("ADODB.Connection")
    con.Open _
            "Driver={SQL Server Native Client 11.0};" & _
            "Server=.\SQLEXPRESS;" & _
            "Database=myDb;" & _
            "Trusted_Connection=yes;"
    con.Execute "UPDATE Clients SET FirstName='Gord' WHERE ID=5;"
    con.Close
    Set con = Nothing
End Sub

Access의 VBA 프로젝트의 경우 항상 그래왔던 것처럼 ACE DAO를 통한 ODBC 링크 테이블과 패스스루 쿼리를 사용할 수 있는 옵션도 있습니다.

Sub DaoOdbcExample()
    Dim cdb As DAO.Database, qdf As DAO.QueryDef
    Set cdb = CurrentDb
    Set qdf = cdb.CreateQueryDef("")
    qdf.Connect = "ODBC;" & _
            "Driver={SQL Server Native Client 11.0};" & _
            "Server=.\SQLEXPRESS;" & _
            "Database=myDb;" & _
            "Trusted_Connection=yes;"
    qdf.sql = "UPDATE Clients SET FirstName='Gord' WHERE ID=5;"
    qdf.ReturnsRecords = False
    qdf.Execute dbFailOnError
    Set qdf = Nothing
    Set cdb = Nothing
End Sub

주의:

  1. SQL Server Native Client 11.0은 SQL Server 2014(ref: here)와 함께 제공되는 버전입니다.

  2. 오래된 Data Access Technologies의 인용 목록에는 "DAO 3.6이 이 기술의 최종 버전입니다.64비트 윈도우즈 운영 체제에서는 사용할 수 없습니다."Jet DAO("Microsoft DAO 3.6 Object Library")를 말합니다.64비트 버전의 Access Database Engine이 설치되어 있는 경우 ACE DAO("Microsoft Office 14.0 Access Database Engine Object Library")를 실제로 64비트 응용 프로그램에서 사용할 수 있습니다.

ACE 객체 모델을 사용하는 것이 정확하고 미래적인 방법입니다.SQL 서버에서 native oleDB를 삭제하는 것이 100% 맞습니다.또한 .net이 나왔을 때 "일반" 개발자 커뮤니티가 ADO를 삭제하기 시작했다는 점에 유의해야 합니다(ado.net 프로바이더는 매우 다른 비스트이며 oleDB에 의존하지 않는 sql 프로바이더입니다).

그래서 이 때문에 우리 업계에서는 중요한 트렌드가 발생하고 있습니다.

우리는 oleDB에서 멀어지고 있습니다.이것은 일반적으로 윈도우 전용 기술입니다.iPad, 스마트폰, Android 등이 부상하면서 이러한 플랫폼 특정 공급업체가 없고 oleDB도 없습니다.따라서 ODBC(Open Database Connectivity) 표준을 사용하는 방향으로 되돌아가야 합니다.오라클, 마이크로소프트, MySQL 모두 이것이 미래의 선택이자 선택이라고 말했습니다.

JET는 구식으로 간주되지만 ACE는 그렇지 않습니다.

Access 2007(현재 완전한 3가지 버전) 이후로 DAO에 대한 참조가 없고 있어서도 안 됩니다.마지막 3가지 버전의 Access에서는 DAO 객체 라이브러리에 대한 참조를 필요로 하지 않거나 사용하지 않습니다.

이제 새로운 내장 ACE 데이터베이스 엔진을 사용해야 합니다.즉, DAO에 대한 별도의 참조가 필요하지 않습니다.

ACE 엔진에는 다음과 같은 몇 가지 장점이 있습니다.

이제 DAO 레퍼런스가 필요 없습니다.

데이터 엔진을 참조하면 이전의 두 라이브러리 참조가 처리됩니다.

x32 및 x64 비트 에디션이 모두 사용 가능합니다(따라서 .net 애플리케이션 등은 이 데이터 엔진의 x64 비트 에디션을 사용할 수 있습니다).JET는 x32 비트만 있었습니다.

ACE 공급자는 계속해서 업데이트 및 향상된 기능을 제공받습니다.JET에 대해서도, ADO에 대해서도 마찬가지라고 말할 수 없습니다.

ACE는 이제 저장 프로시저와 테이블 트리거를 지원합니다.또한 웹 서비스를 기반으로 하는 쉐어포인트 목록도 지원합니다.

SQL Azure와 함께 작동하도록 Access/ACE도 변경되었습니다.

Access with SQL Server를 사용할 경우 ACE와 Linked Table만 사용하면 됩니다.ADO MUCH에서 멀어지는 추세는 약 13년 전에 .net이 등장하면서 시작되었습니다.

따라서 현재 표준 접근 방식 및 권장 사항은 ACE + odbc입니다.

그럼 여기서 하나도 놓치지 않으셨군요.혼란은 상태 JET가 더 이상 사용되지 않는다는 기사에서 비롯되지만 마지막 3가지 버전에 대한 액세스가 JET를 사용하지 않고 ACE라는 새로운 라이브러리를 사용한다는 매우 중요한 세부 사항이 누락됩니다.

액세스 응용프로그램에서 DAO에 대한 참조를 더 이상 필요로 하지 않거나 원하지 않는다는 것이 중요합니다.

호환되는 DAO 라이브러리를 사용하고 있는 것이 확실하며, reocrdset 코드를 DAO로 접두사를 지정하는 것도 좋습니다(예전에 이 코드를 사용했다면 기존 코드는 잘 작동하거나 레코드 세트를 선언할 때 항상 DAO 한정자를 생략했습니다).

sql 패스스루와 같은 경우 저장된 패스스루 쿼리를 간단히 사용하여 다음과 같은 작업을 수행할 수 있습니다.

   CurrentDb.QueryDefs("MyPass").Execute

또는 t-sql을 사용하면 다음을 수행할 수 있습니다.

With CurrentDb.QueryDefs("MyPass")
  .SQL = "ALTER TABLE Contacts ADD MiddleName nvarchar(50) NULL"
  .Execute
End If

또는 매개 변수를 사용하여 선택한 저장 절차를 "즉시" 호출합니다.

With CurrentDb.QueryDefs("MyPass")
  .SQL = "Exec MyStoreProc " & strMyParm1
  .Execute
End If

위의 내용이 너무 좋고 깨끗하지 않습니까?언급한 바와 같이 위의 코드 예제는 게시된 oleDB/ADO 예제를 사용하는 것보다 훨씬 덜 코드화되고 번거로운 경향이 있습니다.

ODBC와 sql 서버를 중심으로 기술을 개발한 Access의 오랜 사용자들은 업계에서 항상 하던 것이 권장하는 접근 방식이라고 판단했기 때문에 아무것도 할 필요가 없습니다.

ACE에서는 JET-DIRECT가 지원되지 않지만 JET Direct 대신 위와 같은 패스스루 쿼리 정의 예제를 사용하여 이 선택을 놓친 경우는 전혀 생각할 수 없습니다.

vba에서 adodb. 연결을 초기화할 때 교체했습니다.

          .Provider = "sqloledb"
          .Properties("Data Source").Value = sServer
          .Properties("Initial Catalog").Value = sDB
          .Properties("Integrated Security").Value = "SSPI"

와 함께

           .ConnectionString = _
               "DRIVER={ODBC Driver 11 for SQL Server}; " & _
               "SERVER=" & sServer & "; " & _
               "Trusted_Connection=Yes; " & _
               "DATABASE=" & sDB & "; "

그거 쓰잖아요.공급자 = "MSDASQL.1"이지만 추가할 필요는 없습니다.

언급URL : https://stackoverflow.com/questions/26356672/how-to-access-sql-server-from-vba-in-a-non-deprecated-way

반응형