IT 이모저모

UWP 응용 프로그램, SQL Server 사용하기 - 3

exien 2018. 3. 28. 18:45

.NET Standard 2.0 규격의 ADO.NET 코딩

 SQL Server를 사용하는 경우 데이터베이스를 읽고 쓰는 방법은 기존의 ADO.NET 2.0 와 같습니다. DbConnection 을 사용하여 데이터베이스에 연결 한 후 DbDataAdapter 와 DataSet 에서 도카と교환하는 것도 좋고, DbDataReader 에서 1 레코드 씩 처리하는 것도 좋고,입니다. 그들은 .NET Standard 2.0에 포함되어 있습니다. 차이는 그 인스턴스를 얻기위한 DbProviderFactory 의 구현이 .NET Standard에 포함되지 않은, 즉 플랫폼 독립적이라는 것입니다.

기존과 ADO.NET의 차이

 SQL Server를 사용하기위한 DbProviderFactory의 구현은 SqlClientFactory 클래스 (System.Data.SqlClient 네임 스페이스)인데, 그것은 .NET Standard 2.0 규격에 포함되지 않습니다. 따라서 응용 프로그램의 플랫폼 의존 코드 측에서 SqlClientFactory의 인스턴스를 취득하여 .NET Standard의 PCL에 전달할 수 있습니다 (아래 그림). .NET Standard의 PCL 측은 그것을 (SqlClientFactory 상속 원래 클래스 인) DbProviderFactory로 받고, ADO.NET 코드를 실행합니다. 여기 마저 눌러두면 나머지는 기존의 ADO.NET 기술로 코딩 할 것입니다.

SqlClientFactory 인스턴스는 플랫폼 의존 코드 측으로부터 전달
SqlClientFactory 인스턴스는 플랫폼 의존 코드 측으로부터 전달

 또한 SqlClientFactory가 플랫폼 의존한다는 것은 거기에서 생성되는 DbConnection 등의 구현도 플랫폼 의존 이라기됩니다. 각 플랫폼의 테스트가 필요하다는 것이군요. 뿐만 아니라 SQL Server를 사용하는 경우, UWP에서는 연결에 제한이 걸립니다.

  • UWP : 연결할 수는 다른 PC에서 실행중인 Windows 인증 의 SQL Server 만
  • 기타 플랫폼 : SQL Server의 사용자 인증 에 연결 가능

 UWP 이외의 플랫폼에서는 사용자 이름과 암호를 사용하여 연결이 가능합니다. UWP에서는 Active Directory를 사용하여 Windows 인증으로 제한되어 있습니다. 보안 시스템 구축이 UWP 정책 때문에 이러한 제한에도 당연 이겠지만 전체 시스템을 설계 할 때 고려해야합니다. 또한 SQL Server의 LocalDB도 UWP는 사용할 수 없습니다 (WPF와 Windows Forms에서 사용할 수있는 것은 확인할 수 있었다 .Android / iOS 등은 미확인). UWP에서 로컬 데이터베이스를두고 싶은 경우는 SQLite 데이터베이스 를 이용합니다.

SQL Server에서 데이터를 검색하는 코드 예

 그럼 실제 코드 예제를 살펴 보겠습니다. 먼저 .NET Standard PCL 측에서 SQL Server에서 데이터를 검색하는 쪽에서 (⇒ Northwind 클래스 ).

 여기까지 설명한 바와 같이, .NET Standard 2.0 ADO.NET에서주의 할 점은 두 가지가 있습니다. 하나는 SqlClientFactory의 인스턴스를 플랫폼 측 코드에서받을 것. 다른 하나는 플랫폼에 SQL Server 인증 방법을 전환하는 것입니다. 여기에서는 모두 메소드의 인자로 받게되었습니다. SqlClientFactory 인스턴스는 인수 그 자체로도 인증 방법의 전환은 선택적 bool 값을 인수로받습니다.

 먼저 클래스 멤버에 연결 문자열 상수를 두 정의해야합니다 (다음 코드).

Northwind 클래스에 정의 된 연결 문자열의 예
// SQL 사용자 인증을위한 연결 문자열
private const string CONN_STR_SQLSERVER
  = @ "Data Source = Win10VM-RS3.corp.BluewaterSoft.jp \ SQLEXPRESS;"
    + "Initial Catalog = NORTHWIND; User ID = nwtestuser; Password =";

// Windows 인증을위한 연결 문자열 (UWP 응용 프로그램 연결 용)
private const string CONN_STR_ENTERPRISE
  = @ "Data Source = Win10VM-RS3.corp.BluewaterSoft.jp \ SQLEXPRESS;"
    + "Initial Catalog = NORTHWIND; Integrated Security = SSPI";

 위는 어디 까지나 연결 문자열의 예입니다. 시험 할 때 실제 상황에 적절히 다시 작성하십시오. 또한, Android 나 iOS 등에서도 사용하는 경우 연결 문자열의 호스트 이름 (SQL Server의 명명)는 DNS 이름 확인하지 못하면 안될 것입니다 (Windows는 물론 NetBIOS 이름 확인도 OK). 또한 테스트하는 것으로, SQL 사용자 인증 암호를 비워 있지만 프로덕션 환경에서는 절대로 해선없는 일 것은 말할 것도 없습니다.

 SQL Server의 Categories 테이블에서 모든 레코드를 추출하여 반환하는 메서드는 다음 코드와 같이됩니다. SqlClientFactory의 인스턴스를 DbProviderFactory 클래스로 사용 (제 1 인자) 거기에서 DbConnection 등의 DB 접근에 필요한 개체를 얻을 수 있습니다. 또한, 제 2 인수에 따라 연결 문자열을 전환하고 있습니다.

SQL Server에서 데이터를 검색하는 방법
public static DataTable GetCategories (DbProviderFactory factory ,
                                      bool useEnterpriseAuthentication = false)
{
  using (DbConnection conn = factory .CreateConnection ())
  {
    // 두번째 파라미터에 따라 연결 문자열을 전환
    conn.ConnectionString = useEnterpriseAuthentication ?
                            CONN_STR_ENTERPRISE : CONN_STR_SQLSERVER;

    using (DbCommand command = factory .CreateCommand ())
    {
      command.Connection = conn;
      command.CommandText = "select * from Categories order by CategoryID asc";

      using (DbDataAdapter da = factory .CreateDataAdapter ())
      {
        da.SelectCommand = command;

        var dt = new DataTable ( "Categories");
        da.Fill (dt);
        return dt;
      }
    }
  }
}

데이터 취득 라이브러리를 호출하는 코드 예

 그런 다음에 GetCategories 메서드를 호출 측의 코드입니다. 플랫폼 의존 코드에서 호출하지 않으면 안되기 때문에, PCL을 사용한 Xamarin.Forms 만은 복잡합니다 (이것은 Xamarin.Forms의 '정석'입니다).

Windows Forms / WPF

 기존의 Windows 데스크톱 응용 프로그램에서 호출에는 단 한줄하면됩니다 (⇒ Form1.cs / MainWindow.xaml.cs ). SqlClientFactory 클래스의 Instance 정적 필드가 SqlClientFactory의 인스턴스를 돌려주기 때문에 그것을 인수하여 .NET Standard 측의 메소드를 호출 할뿐입니다. 그러나 .NET Standard 2.0을 지원하는 .NET Framework "본가"는 버전 4.6.1 이상 (+ .NET Core 2 SDK)이라는 것은 잊지 마세요.

Windows Forms / WPF에서 데이터를 검색하는 메소드를 호출
DataTable dt = UF03StdLib.Northwind. GetCategories (SqlClientFactory.Instance) ;

Xamarin.Forms

 Xamarin.Forms에서 "PCL 프로젝트 '를 만든 경우 (위의".NET Standard 2.0 표준 클래스 라이브러리를 사용 하는가? "에서 설명한 [Code Sharing Strategy 섹션에서 .NET Standard]를 선택한 경우) UI의 코드 숨김은 (.NET Standard 2.0) PCL에 배치됩니다. 즉, 코드 숨김 및 거기에서 호출 코드는 플랫폼 독립적 인 SqlClientFactory의 인스턴스를 만들 수 없습니다.

 그럼 어떻게 할 것인가라고하면, 이것이 Xamarin.Forms의 '정석'이되는 것입니다 만, DependencyService 라는 일종의 DI 컨테이너를 사용합니다. 그 코딩 단계는 다음과 같습니다.

  1. PCL 프로젝트 (UI를 코딩하는 프로젝트)에 인터페이스를 정의합니다
  2. 플랫폼 별 프로젝트에서 인터페이스를 구현하는 클래스를 작성합니다. 그 클래스는 Dependency 속성 (Xamarin.Forms 네임 스페이스)를 붙여 둡니다
  3. PCL 프로젝트에서 DependencyService 클래스의 Get 메소드를 사용하여 플랫폼에 의존하는 객체를 검색하고 사용합니다

 먼저 PCL 프로젝트에 정의하는 인터페이스입니다 (⇒ ISqlClientFactoryDS.cs ). PCL 프로젝트 SqlClientFactory 클래스를 쓸 수 없기 때문에, 상위 클래스 인 DbProviderFactory 추상 클래스를 반환하도록 정의합니다.

DependencyService의 정의
public interface ISqlClientFactoryDS
{
  DbProviderFactory Instance {get;}
}

 다음은 플랫폼 별 DependencyService의 구현입니다. 네임 스페이스 기술이 다른 이외는 동일하므로 여기에서는 Android 판만을 실어 둡니다 (⇒ SqlClientFactoryDS.cs ). 구현은 SqlClientFactory.Instance을 DbProviderFactory 추상 클래스로서 돌려 줄뿐입니다.

DependencyService 구현 (Android의 예)
[assembly : Xamarin.Forms.Dependency (typeof (XamarinFormsSample.Droid.SqlClientFactoryDS))]
namespace XamarinFormsSample.Droid
{
  public class SqlClientFactoryDS : ISqlClientFactoryDS
  {
    public DbProviderFactory Instance
      => System.Data.SqlClient.SqlClientFactory.Instance;
  }
}

 마지막으로, PCL 프로젝트에 다시 데이터 취득 메소드를 호출하는 코드를 작성합니다 (⇒ MainPage.xaml.cs ). DependencyService를 사용하여 플랫폼 의존의 SqlClientFactory 인스턴스를 취득 해, 그것을 인수하여 .NET Standard 2.0의 코드를 호출합니다. 또한 UWP와 그렇지 플랫폼에서 SQL Server의 인증 방식이 다르기 때문에 호출 할 때 두번째 파라미터를 전환합니다.

DependencyService를 사용하여 데이터를 취득하는 메소드를 호출
// SQL Server의 Windows 인증을 사용하거나 (UWP는 true / 그렇지 않으면 false)
bool useEnterpriseAuthentication = (Device.RuntimePlatform == Device.UWP);

// DependencyService를 사용하여 SqlClientFactory 인스턴스를 얻을
var sqlClient = DependencyService.Get <ISqlClientFactoryDS> () .Instance;

// .NET Standard 2.0 PCL의 데이터 취득 메소드를 호출
DataTable dt
  = UF03StdLib.Northwind. GetCategories (sqlClient, useEnterpriseAuthentication) ;

UWP

 UWP도 기존의 데스크톱 애플리케이션과 마찬가지로 호출하는 코드 한 줄만합니다. (⇒ MainPage.xaml.cs )

UWP에서 데이터를 검색하는 메소드를 호출
DataTable dt = UF03StdLib.Northwind. GetCategories (SqlClientFactory.Instance, true) ;

 그러나 UWP는 Package.appxmanifest의 "기능"(capability)에 "기업 인증 '선언을 추가해야합니다 (Xamarin.Forms의 UWP 응용 프로그램도 동일). 이것은 공식 문서 " Use a SQL Server database in a UWP app "의 "First, set up your solution"절에 설명되어 있습니다. "기업 인증 '선언은 Windows 인증 (Active Directory 의한 사용자 인증)을 사용하는 것입니다. 이 "기능"(capability)이 필요하다는 점에서 UWP 응용 프로그램에서 SQL Server 로의 연결은 Windows 인증으로 제한되어 있다고 압니다. "기업 인증 '(enterpriseAuthentication)은 공식 문서"응용 프로그램 기능의 선언 "의" 특수한 용도 및 제한된 용도에 관한 기능 '섹션에 '특수 용도의 기능 "으로 분류되어 있으며, 「스토어에 제출 때 회사의 계정이 필요하다 "고되어 있습니다.

 또한 .NET Core 2.0를 지원하는 Windows 10에 build 16299 이상이라는 것을 잊지 마십시오. 16299 미만에서 멈춰 버린 Windows 10 Mobile (이 글을 쓰는 시점에서 15254.248 )에서는 작동하지 않습니다.

정리

 .NET Standard 2.0 규격에 포함 된 API는 크게 늘었습니다. 업무 로직을 .NET Standard 2.0 PCL에 정리해두면, 그것은 Windows Forms / WPF / ASP.NET 등 기존의 .NET Framework의 코드에서 사용할뿐만 아니라 UWP / Xamarin / ASP.NET Core 등 새로운 애플 리케이션 코드에서 사용할 수 있습니다 (Xamarin.Android과 Xamarin.iOS 등에서도!). 새로운 업무 로직을 개발하는 경우에는 .NET Standard에 쓸 수 있는지 검토해보십시오.

 또한 UWP 응용 프로그램에서도 마침내 SQL Server에 직접 액세스 할 수있게되었습니다.

UWP 응용 프로그램에 관심이 솟아 사람에

 Windows 데스크톱 용 앱 개발과 Windows Forms이라면 경험이 있지만, 조금 UWP 응용 프로그램 개발도 신경이 쓰여 왔다는 분에게. 적합한 전자 책을 썼습니다!

UWP 응용 프로그램 개발 101 제 2 판 : Windows Forms 개발자를위한 C # / XAML에 따르면 UWP 앱 개발 입문」(BluewaterSoft 2017/7/1) 
· Kindle 버전 과 UWP 응용 프로그램 버전 이 있습니다. 
· 모두 무료로 앞부분을 읽을 수 있으므로 우선 시도해 보시기을보십시오.