다음을 통해 공유


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

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

시작

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

Northwind 제품

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

이 가이드에 나오는 코드 조각은 이 UWP 샘플 앱을 기반으로 합니다.

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

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

  1. 매니페스트 디자이너에서 Windows App SDK 프로젝트의 Package.appxmanifest 파일을 엽니다.
  2. Capabilities 탭에서 SQL Server 인증에 Windows 인증을 사용하는 경우 Enterprise 인증 확인란을 선택합니다.

엔터프라이즈 인증 기능

중요

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

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

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

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

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

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

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

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

참고

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

connection string 추가

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

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

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

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

    ...
}

중요한

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

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

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

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 App 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 파일을 열고, Product 인스턴스의 ObservableCollectionListViewItemSource 속성으로 설정하는 코드를 MainWindow 클래스의 생성자에 추가합니다.

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

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

Northwind 제품

System.Data.SqlClient 네임스페이스를 탐색하여 SQL Server 데이터베이스의 데이터로 수행할 수 있는 다른 작업을 확인합니다.

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

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

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

컴퓨터 관리

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

SQL Server Browser Service

다음 단계