자습서: Windows 앱에서 SQL Server 데이터베이스 사용

앱은 SQL Server 데이터베이스에 직접 연결한 다음 Microsoft.Data.SqlClient 네임스페이스의 클래스를 사용하여 데이터를 저장 및 검색할 수 있습니다.

이 자습서는 클라이언트에서 직접 데이터베이스 액세스가 허용되는 학습, 프로토타입 및 제어된 환경을 위한 것입니다. 공유 프로덕션 데이터를 사용하는 엔터프라이즈 기간 업무 앱의 경우 데이터베이스 액세스를 소유하고 권한 부여, 유효성 검사, 감사, 버전 관리 및 자격 증명 보호를 중앙 집중화하는 인증된 서비스 계층을 선호합니다. 자세한 내용은 데이터베이스에 WinUI 앱 연결을 참조하세요.

시작

이 가이드에서는 Windows 앱 SDK 사용하는 앱에서 이 작업을 수행하는 한 가지 방법을 보여 드리겠습니다. Northwind 샘플 데이터베이스를 SQL Server 인스턴스에 설치한 다음 이러한 코드 조각을 사용하면 Northwind 샘플 데이터베이스의 제품을 보여 주는 기본 UI가 제공됩니다.

Northwind 제품

팁

SQL Server 샘플 GitHub 리포지토리에서 Northwind 및 pubs 샘플 데이터베이스를 만드는 스크립트도 가져올 수 있습니다.

이 가이드에 표시되는 코드 조각은 이 샘플 앱을 기반으로 합니다.

먼저 솔루션을 설정합니다.

앱을 SQL Server 데이터베이스에 직접 연결하기 위해 앱은 Windows 앱 SDK 지원하는 최소 버전의 Windows 대상으로 지정할 수 있습니다. 프로젝트의 속성 페이지에서 해당 정보를 찾을 수 있습니다.

  1. 매니페스트 디자이너에서 Windows 앱 SDK 프로젝트의 Package.appxmanifest 파일을 엽니다.
  2. 현재 .NET 프로젝트 템플릿에 대한 SQL 클라이언트 패키지를 설치합니다. 패키지 관리자 콘솔에서 실행Install-Package Microsoft.Data.SqlClient합니다.
  3. Capabilities 탭에서 SQL Server 인증에 Windows 인증을 사용하는 경우 Enterprise 인증 확인란을 선택합니다.

엔터프라이즈 인증 기능

중요

또한 Windows 인증을 사용하는지 여부에 관계없이, 인터넷(클라이언트 및 서버), 인터넷(클라이언트) 및 개인 네트워크(클라이언트 및 서버)를 선택해야 합니다.

SQL Server 데이터베이스에서 데이터 추가 및 검색

이 섹션에서는 다음을 수행합니다.

1. 연결 문자열을 추가하십시오.

2️⃣ 제품 데이터를 저장할 클래스를 만듭니다.

3️ SQL Server 데이터베이스에서 제품을 검색합니다.

4️⃣ 기본 사용자 인터페이스를 추가합니다.

5️⃣ UI를 제품으로 채웁니다.

참고

이 섹션에서는 데이터 액세스 코드를 구성하는 방법 중 하나를 설명합니다. 이는 Microsoft.Data.SqlClient를 사용하여 SQL Server 데이터베이스에 데이터를 저장하고 검색하는 방법의 예를 제공하기 위한 것일 뿐입니다. 애플리케이션 디자인에 가장 적합한 방식으로 코드를 구성할 수 있습니다.

연결 문자열 추가

App.xaml.cs 파일에서 솔루션의 다른 클래스가 연결 문자열 액세스할 수 있도록 하는 속성을 App 클래스에 추가합니다.

저희의 연결 문자열은 SQL Server Express 인스턴스의 Northwind 데이터베이스를 가리킵니다. 이 코드 조각의 연결 문자열 SQL Server Express를 설치할 때 기본 인스턴스 이름 SQLEXPRESS 유지한 것으로 가정합니다. SQL Server 인스턴스, 데이터베이스 및 인증 방법과 일치하도록 연결 문자열 변경할 수 있습니다.

sealed partial class App : Application
{
    // Connection string for using Windows Authentication.
    private string connectionString =
        @"Data Source=.\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI;Encrypt=True;TrustServerCertificate=True";

    public string ConnectionString { get => connectionString; set => connectionString = value; }

    ...
}

중요

프로덕션 애플리케이션에서 연결 정보는 앱 구성에 안전하게 저장되어야 합니다(Visual Studio 연결된 서비스를 사용하여 Azure App Configuration 추가 참조). 연결 문자열 및 기타 비밀은 하드 코딩해서는 안 됩니다.

예제 연결 문자열 개발을 위해 로컬 SQL Server Express 인증서를 신뢰합니다. 프로덕션 환경에서 확인 가능한 서버 인증서를 설치하고 설정합니다 TrustServerCertificate=False.

제품 데이터를 저장할 클래스 만들기

INotifyPropertyChanged 이벤트를 구현하는 클래스를 만들어 XAML UI 속성을 이 클래스의 속성에 바인딩합니다.

public class Product : INotifyPropertyChanged
{
    public int ProductID { get; set; }
    public string ProductCode { get { return ProductID.ToString(); } }
    public string ProductName { get; set; }
    public string QuantityPerUnit { get; set; }
    public decimal UnitPrice { get; set; }
    public string UnitPriceString { get { return UnitPrice.ToString("######.00"); } }
    public int UnitsInStock { get; set; }
    public string UnitsInStockString { get { return UnitsInStock.ToString("#####0"); } }
    public int CategoryId { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

SQL Server 데이터베이스에서 제품 검색

Windows 앱 SDK 프로젝트의 MainWindow.xaml.cs 파일에서 Northwind 샘플 데이터베이스에서 제품을 가져오는 메서드를 만든 다음, 인스턴스의 Product 컬렉션으로 반환합니다.

using Microsoft.Data.SqlClient;

public ObservableCollection<Product> GetProducts(string connectionString)
{
    const string GetProductsQuery = "select ProductID, ProductName, QuantityPerUnit," +
       " UnitPrice, UnitsInStock, Products.CategoryID " +
       " from Products inner join Categories on Products.CategoryID = Categories.CategoryID " +
       " where Discontinued = 0";

    var products = new ObservableCollection<Product>();
    try
    {
        using (var conn = new SqlConnection(connectionString))
        {
            conn.Open();
            if (conn.State == System.Data.ConnectionState.Open)
            {
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = GetProductsQuery;
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var product = new Product();
                            product.ProductID = reader.GetInt32(0);
                            product.ProductName = reader.GetString(1);
                            product.QuantityPerUnit = reader.GetString(2);
                            product.UnitPrice = reader.GetDecimal(3);
                            product.UnitsInStock = reader.GetInt16(4);
                            product.CategoryId = reader.GetInt32(5);
                            products.Add(product);
                        }
                    }
                }
            }
        }
        return products;
    }
    catch (Exception eSql)
    {
        Debug.WriteLine($"Exception: {eSql.Message}");
    }
    return null;
}

기본 사용자 인터페이스 추가

다음 XAML을 Windows 앱 SDK 프로젝트의 MainWindow.xaml 파일에 추가합니다.

이 XAML은 이전 코드 조각에서 반환한 각 제품을 표시하는 ListView를 생성하고 ListView의 각 행의 특성을 Product 클래스에서 정의한 속성에 바인딩합니다.

<Grid Background="{ThemeResource SystemControlAcrylicWindowBrush}">
    <RelativePanel>
        <ListView Name="InventoryList"
                  SelectionMode="Single"
                  ScrollViewer.VerticalScrollBarVisibility="Auto"
                  ScrollViewer.IsVerticalRailEnabled="True"
                  ScrollViewer.VerticalScrollMode="Enabled"
                  ScrollViewer.HorizontalScrollMode="Enabled"
                  ScrollViewer.HorizontalScrollBarVisibility="Auto"
                  ScrollViewer.IsHorizontalRailEnabled="True"
                  Margin="20">
            <ListView.HeaderTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal"  >
                        <TextBlock Text="ID" Margin="8,0" Width="50" Foreground="DarkRed" />
                        <TextBlock Text="Product description" Width="300" Foreground="DarkRed" />
                        <TextBlock Text="Packaging" Width="200" Foreground="DarkRed" />
                        <TextBlock Text="Price" Width="80" Foreground="DarkRed" />
                        <TextBlock Text="In stock" Width="80" Foreground="DarkRed" />
                    </StackPanel>
                </DataTemplate>
            </ListView.HeaderTemplate>
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:Product">
                    <StackPanel Orientation="Horizontal" >
                        <TextBlock Name="ItemId"
                                    Text="{x:Bind ProductCode}"
                                    Width="50" />
                        <TextBlock Name="ItemName"
                                    Text="{x:Bind ProductName}"
                                    Width="300" />
                        <TextBlock Text="{x:Bind QuantityPerUnit}"
                                   Width="200" />
                        <TextBlock Text="{x:Bind UnitPriceString}"
                                   Width="80" />
                        <TextBlock Text="{x:Bind UnitsInStockString}"
                                   Width="80" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </RelativePanel>
</Grid>

ListView에 제품 표시

MainWindow.xaml.cs 파일을 열고 ListView의 ItemsSource 속성을 인스턴스의 MainWindowObservableCollection으로 설정하는 클래스의 Product 생성자에 코드를 추가합니다.

public MainWindow()
{
    this.InitializeComponent();
    InventoryList.ItemsSource = GetProducts((App.Current as App).ConnectionString);
}

프로젝트를 시작하고 Northwind 샘플 데이터베이스의 제품들이 UI에 표시되는지 확인합니다.

Northwind 제품

SQL Server 데이터베이스의 데이터로 수행할 수 있는 다른 작업을 알아보려면 Microsoft.Data.SqlClient 네임스페이스를 살펴보세요.

팁

Microsoft Copilot SQL 쿼리에 대한 도움을 요청해 보세요. Copilot SQL 쿼리를 작성하고 코드를 개선하는 방법을 제안하는 데 도움이 될 수 있습니다.

데이터베이스에 연결하는 데 문제가 있나요?

대부분의 경우 SQL Server 구성의 일부 측면을 변경해야 합니다. Windows Forms 또는 WPF 애플리케이션과 같은 다른 유형의 데스크톱 애플리케이션에서 데이터베이스에 연결할 수 있는 경우 SQL Server TCP/IP를 사용하도록 설정했는지 확인합니다. 컴퓨터 관리 콘솔에서 이를 수행할 수 있습니다. 자세한 내용은 Windows 도구/관리 도구 참조하세요.)

컴퓨터 관리

그런 다음 SQL Server Browser 서비스가 실행 중인지 확인합니다.

SQL Server Browser 서비스

다음 단계