내보내기(0) 인쇄
모두 확장

유연한 쿼리 응용 프로그램 만들기

업데이트 날짜: 2014년 2월

 

DataMarket 로고

데이터 게시자가 유연한 쿼리 데이터 집합으로 지정한 마켓플레이스 데이터 집합을 프로그래밍 방식으로 사용하려면 Visual Studio에서 서비스 참조를 사용합니다.

Important중요
서비스 참조의 코드를 수정하는 경우 참조가 비정상적으로 작동하고 부작용이 발생할 수 있으므로 수정하면 안 됩니다. 또한 서비스 참조를 새로 고칠 때마다 수정 내용을 덮어씁니다.

이 문서의 단계를 진행하기 전에 다음 항목을 준비해야 합니다.

  • 유효한 Windows Live ID 계정. Live ID가 없으면 Windows Live 홈 페이지로 이동하여 등록합니다.

  • 유효한 마켓플레이스 계정. 마켓플레이스가 없으면 마켓플레이스 계정 만들기 항목으로 이동하여 해당 지침을 따릅니다.

  • 응용 프로그램에서 사용하려는 마켓플레이스 유연한 쿼리 데이터 집합에 대한 구독. 유연한 데이터 집합을 구독하지 않은 경우 데이터 제품 구독으로 이동하여 해당 지침을 따릅니다.

 

섹션 설명

1단계: Visual Studio에서 프로젝트 만들기

마켓플레이스용 새 콘솔 프로젝트를 시작하기 위해 Visual Studio에서 수행해야 하는 단계를 설명합니다.

2단계: 데이터 서비스에 대한 서비스 참조 추가

마켓플레이스 데이터를 사용하기 위해 서비스 참조를 추가하려면 수행해야 하는 단계를 설명합니다.

3단계: 관리 코드를 통해 데이터 사용

마켓플레이스 유연한 쿼리 데이터 집합을 사용하기 위해 작성하는 코드에 대해 설명합니다.

완성된 코드

C# 및 VB로 작성된 전체 콘솔 응용 프로그램을 제공합니다.

메타데이터

이 유연한 쿼리 데이터 집합의 예제 XML 메타데이터가 나와 있습니다.

관리자 권한으로 Visual Studio 실행

  1. 시작 메뉴에서 Visual Studio를 찾습니다.

  2. Visual Studio를 마우스 오른쪽 단추로 클릭합니다.

  3. 드롭다운 메뉴에서 관리자 권한으로 실행을 클릭합니다.

  4. 컴퓨터를 변경하도록 이 프로그램(devenv.exe)에 허용할지 묻는 메시지가 표시되면 를 클릭합니다.

새 프로젝트 만들기

  1. Visual Studio 시작 페이지에서 새 프로젝트...를 선택합니다.

  2. 새 프로젝트 대화 상자에서 Visual C#콘솔 응용 프로그램을 선택합니다. Visual Basic을 사용하려는 경우 Visual Basic콘솔 응용 프로그램을 선택합니다.

  3. 새 프로젝트 대화 상자 윗부분의 왼쪽 드롭다운 목록에서 .NET Framework 4를 선택합니다.

    Visual Studio 2010에서는 .NET Framework 4가 기본적으로 선택되어 있습니다. 이전 버전의 Visual Studio를 사용하며 .NET Framework 4가 설치되어 있지 않으면 .NET Framework 4 다운로드 페이지로 이동하여 .NET Framework 4를 다운로드 및 설치합니다.

  4. 프로젝트에 적절한 이름을 지정합니다. 예를 들어 이 항목의 프로젝트에는 USCrime2006and2007이라는 이름을 지정할 수 있습니다.

  5. 확인을 클릭합니다.

  6. 데이터 집합에 대한 액세스를 인증하는 데 필요한 다음 코드를 Program.cs(Program.vb) 맨 위에 추가합니다.

    using System.Net; // needed for authentication
    

1단계에서 관리자 권한으로 Visual Studio를 시작하고 새 콘솔 응용 프로그램을 만든 후에는 사용하려는 데이터 서비스에 대한 서비스 참조를 추가합니다.

서비스 루트 URL 가져오기

  1. 마켓플레이스 홈 페이지로 이동합니다.

  2. 내 데이터 탭을 클릭합니다.

  3. 2006 - 2008 Crime in the United States 데이터 서비스를 찾습니다.

  4. 데이터 집합 이름 오른쪽의 사용을 클릭합니다. 그러면 해당 데이터 집합의 세부 정보 페이지로 이동합니다.

  5. 페이지 아래쪽으로 스크롤하여 Visual Studio에서 이 데이터를 사용하는 방법 알아보기 아래의 탭으로 이동합니다.

  6. 세부 정보 탭을 클릭합니다.

  7. 서비스 루트 URL을 찾습니다.

    서비스 루트 URL


    그림 1 - 서비스 루트 URL

  8. 서비스 루트 URL을 클립보드에 복사합니다.

프로젝트에 서비스 참조 추가

  1. Visual Studio 프로젝트로 돌아옵니다.

  2. 솔루션 탐색기에서 참조를 마우스 오른쪽 단추로 클릭합니다.

  3. 드롭다운 메뉴에서 서비스 참조 추가...를 선택합니다.

  4. 서비스 루트 URL을 클립보드에서 주소 드롭다운에 붙여 넣습니다.

  5. 이동을 클릭합니다.
    서비스 텍스트 상자가 프로젝트에 사용할 수 있는 서비스로 채워질 때까지 잠시 기다립니다.

  6. 네임스페이스 텍스트 상자에 적절한 네임스페이스 이름을 입력합니다.
    예를 들어 DataGovCrimes를 입력합니다.

  7. 확인을 클릭합니다.
    서비스 참조의 이름이 솔루션 탐색기서비스 참조 아래에 표시됩니다.

코드에 서비스 참조 추가

  1. Visual Studio 코드 창에서 Program.cs(Program.vb)를 선택합니다.

  2. 다음 문을 추가하면 응용 프로그램에서 서비스 참조에 액세스할 수 있습니다.

    note참고
    프로그램 네임스페이스와 위의 6단계에서 만든 서비스 참조 네임스페이스 이름을 사용합니다.

    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    

작업을 수행할 클래스 만들기

  1. 프로젝트 네임스페이스 내에서 CrimeData 공용 클래스를 만듭니다.

  2. 클래스 내에서 다음의 두 전용 변수를 만듭니다.

    • 서비스에 대한 URI

    • 서비스 컨텍스트에서 서비스 자격 증명을 저장하는 서비스 컨테이너

      엔터티 형식 찾기

      1. "세부 정보 페이지"로 이동합니다.

      2. 이 데이터 집합 시작을 클릭합니다.

      3. 개요 탭을 클릭합니다.
        엔터티 집합 이름 및 엔터티 컬렉션 이름이 표시됩니다.

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    }  // end class CrimeData
    
    
  3. CrimeData 클래스에 대한 생성자를 만듭니다.
    생성자는 두 전용 변수와 사용자 자격 증명을 초기화합니다.
    SERVICE_ROOT_URL은 위에서 클립보드에 복사한 https 링크입니다. 서비스 루트 URL 가져오기를 참조하세요.
    context는 사용자 자격 증명에 사용되는 서비스 컨테이너입니다.
    서버의 형식에 추가되는 속성과 관련하여 클라이언트의 효율성을 유지하기 위해 IgnoreMissingProperties 속성은 true로 설정합니다. 추가 정보는 MSDN 설명서를 참조하세요.
    USER_ID는 사용자의 Live ID입니다.
    SECURE_ACCOUNT_KEY는 이 응용 프로그램에 사용하는 마켓플레이스 계정 키입니다. (마켓플레이스 계정 관리 참조)

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    
        // constructor for the CrimeData class
        public CrimeData()  
        {
            serviceURI = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceURI);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential(USER_ID,
                                                        SECURE_ACCOUNT_ID); // Your Marketplace account key
        }  // end constructor
    
    }  // end class CrimeData
    
    
  4. 클래스 내에서 제네릭 목록을 반환하는 공용 메서드를 만듭니다. 이 프로그램에서 제네릭 목록 형식은 CityCrime입니다.
    이 메서드는 서비스를 쿼리하며 쿼리가 성공하면 결과 집합을 목록으로 반환합니다. 쿼리가 실패하면 메서드는 null(Nothing)을 반환합니다.

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    
        // constructor for the CrimeData class
        public CrimeData()
        {
            serviceURI = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceURI);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential(USER_ID,
                                                        SECURE_ACCOUNT_ID);
        }  // end constructor
    
        // -- public method that returns a list of crime data
        public IList<CityCrime> GetCrimeData()
        {
            IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
    
            try
            {
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex.Message);
                return null;
            }  // end try
    
        }  // end function GetCrimeData
    
    }  // end class CrimeData
    
    

    쿼리는 모든 유효한 마켓플레이스 LINQ 쿼리일 수 있으며 필요에 따라 where(Where) 필터 및/또는 orderby(Order By)를 포함할 수 있습니다.
    LINQ 쿼리에 대한 자세한 내용은 LINQ 쿼리 식(C# 프로그래밍 가이드)(Visual Basic의 LINQ)을 참조하세요.
    마켓플레이스 내의 LINQ 쿼리 제한에 대한 내용은 지원되는 OData 쿼리 옵션을 참조하세요.

    마켓플레이스 내에서 유효한 LINQ 쿼리는 다음과 같습니다.

    
    query = from crimes in context.CityCrime
                where crimes.City == "Newport" 
                orderby crimes.Year Ascending
                select crimes;
    //  this query could also be written as
    //  IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
    
    
  5. CrimeData 클래스 및 GetCrimeData() 메서드를 활용하여 데이터를 사용하고 표시하는 코드를 Main()에서 작성합니다.

    
    using System.Net;
    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    
    namespace USCrime2006and2007
    {
       class Program
       {
          public static void Main(string[] args)
          {
              IList<CityCrime> crimeList;  // CityCrime is the entity type returned by the service
              CrimeData crimeData = new CrimeData();
    
              crimeList = crimeData.GetCrimeData();
    
              if (crimeList != null)
              {
                  Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}","Year",
                                                                          "City",
                                                                          "State",
                                                                          "Population",
                                                                          "Violent Crime");
    
                  foreach (CityCrime c in crimeList)
                  {
                      Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}", c.Year, 
                                                                               c.City, 
                                                                               c.State, 
                                                                               c.Population,
                                                                               c.ViolentCrime);
                  } // end foreach
    
              }  // end if
    
              Console.Write("Tap any key to exit. ");
              Console.ReadKey();
    
          }  // end Main
    
        }  // end class Program
    
    }  // end namespace
    
    


using System.Net;
using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName

namespace USCrime2006and2007
{
   class Program
   {
      public static void Main(string[] args)
      {
          IList<CityCrime> crimeList;  // CityCrime is the entity type returned by the service
          CrimeData crimeData = new CrimeData();

          crimeList = crimeData.GetCrimeData();

          if (crimeList != null)
          {
              Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}","Year",
                                                                      "City",
                                                                      "State",
                                                                      "Population",
                                                                      "Violent Crime");

              foreach (CityCrime c in crimeList)
              {
                  Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}", c.Year, 
                                                                           c.City, 
                                                                           c.State, 
                                                                           c.Population,
                                                                           c.ViolentCrime);
              } // end foreach

          }  // end if

          Console.Write("Tap any key to exit. ");
          Console.ReadKey();

      }  // end Main

    }  // end class Program

    class CrimeData
    {
        private Uri serviceUri;
        private datagovCrimesContainer context;

        // constructor for the CrimeData class
        public CrimeData()
        {
            serviceUri = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceUri);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential USER_ID,
                                                        SECURE_ACCOUNT_KEY); // Your Marketplace account key
        }  // end constructor
 
        // – public function that returns a list of crime data
        public IList<CityCrime> GetCrimeData()
        {
            IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
 
            try
            {
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex.Message);
                return null;
            }  // end try

        }  // end function

    }  // end class CrimeData

}  // end namespace

코드를 작성하면 데이터 집합의 메타데이터가 IntelliSense에 알립니다. IDE가 IntelliSense를 지원하지 않거나 IntelliSense가 작동하지 않으면 서비스에서 메타데이터를 가져올 수 있습니다.

  1. 데이터 집합의 서비스 루트 URL을 가져옵니다.
    서비스 루트 URL을 가져오는 방법에 대한 지침은 위의 서비스 루트 URL 가져오기 섹션을 참조하세요.

  2. 서비스 루트 URL 끝에 /$metadata를 추가합니다.
    예를 들어 서비스 루트 URL이 https://api.datamarket.azure.com/Data.ashx/fabrikam.com/inventory이면 메타데이터 URL은 https://api. datamarket.azure.com/Data.ashx/fabrikam.com/inventory/$metadata입니다.

  3. 브라우저에서 메타데이터 URL로 이동합니다.

  4. 메타데이터를 구문 분석합니다.
    2006 - 2008 Crime in the United States 데이터 집합용 메타데이터는 다음과 같습니다(https://api.datamarket.azure.com/Data.ashx/data.gov/Crimes/$metadata).

    
    <?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
    <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:dr="http://schemas.microsoft.com/dallas/2010/04">   
       <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">      
          <Schema Namespace="data.gov.Crimes"xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
                  xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
                  xmlns="http://schemas.microsoft.com/ado/2007/05/edm">
             <EntityType Name="CityCrime">
                <Key>
                   <PropertyRef Name="ROWID" />
                </Key>
                <Property Name="ROWID" Type="Edm.Int32" Nullable="false" dr:Queryable="true" dr:Returned="true" />
                <Property Name="State" Type="Edm.String" Nullable="true" dr:Queryable="true" dr:Returned="true" />
                <Property Name="City" Type="Edm.String" Nullable="true" dr:Queryable="true" dr:Returned="true" />
                <Property Name="Year" Type="Edm.Int32" Nullable="false" dr:Queryable="true" dr:Returned="true" />
                <Property Name="Population" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="ViolentCrime" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="MurderAndNonEgligentManslaughter" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="ForcibleRape" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Robbery" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="AggravatedAssault" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="PropertyCrime" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Burglary" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="LarcenyTheft" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="MotorVehicleTheft" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Arson" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
             </EntityType>
             <EntityContainer Name="datagovCrimesContainer" m:IsDefaultEntityContainer="true">
                <EntitySet Name="CityCrime" EntityType="data.gov.Crimes.CityCrime" />
             </EntityContainer>
          </Schema>
       </edmx:DataServices>
    </edmx:Edmx>
    
    

    코드 예제 1 - 메타데이터 XML

    스키마에서 다음과 같은 여러 유용한 정보를 가져올 수 있습니다.

    • 엔터티 컨테이너 이름
      <EntityContainer Name="datagovCrimesContainer" m:IsDefaultEntityContainer="true">
      서비스에 대한 액세스를 인증하는 데 사용되는 개인 context 식별자의 유형입니다.


    • 엔터티 집합 이름 및 유형
      <EntitySet Name="CityCrime" EntityType="data.gov.Crimes.CityCrime" />
      IEnumerable<T> 및 IList<T>의 유형입니다.


    • 엔터티 및 유형
      <EntityType Name="CityCrime">
      쿼리 및 foreach(For Each) 루프 변수에 사용되는 유형입니다.


    • 쿼리에서 반환하는 각 필드의 이름
      Name=”State”


    • 각 필드의 데이터 형식
      Type=”Edm.String”


    • 필드가 null일 수 있는지 여부
      Nullable=”false”


    • 필드를 사용하여 쿼리 결과를 필터링할 수 있는지 여부
      dr:Queryable=”true”
      dr:Queryable="false"
      쿼리 가능 필드는 쿼리의 where(Where) 절에서 사용할 수 있습니다. 쿼리 불가능 필드는 쿼리 where(Where) 절에서 사용할 수 없습니다.


    • 데이터 집합을 쿼리할 때 이 필드가 반환되는지 여부
      dr:Returned=”true”

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft