Przeglądanie metadanych SAS używając C#

Do przeglądania metadanych SAS potrzebne będą:

  • dostęp do serwera metadanych SAS
  • posiadanie SAS Integration Technologies (instalują się np.  razem z Enterprise Guide (dalej: EG), ale można też pobrać oddzielnie)
  • jakieś środowisko do pisania kodu w C# (użyłem Visual C# 2008 Express)

Zasady komunikacji z serwerem metadanych opisano w dokumentacji Open Metadata Interface (PDF dla wersji 9.2. np. tu: http://support.sas.com/documentation/cdl/en/omaref/59983/PDF/default/omaref.pdf). Zanim przejdziemy do .NET – jak to wygląda w samym SASie.

Poniższy kod wpisany w EG  pobiera listę dostępnych repozytoriów (przy założeniu, że połączyliśmy się już do serwera metadanych – nie musimy podawać parametrów uwierzytelnienia):

proc metadata
    in='<GetRepositories>
    <Type>Repository</Type>
    </GetRepositories>';
run;

Wystarczy, że podamy odpowiednio przygotowany kod XML na wejściu i otrzymujemy odpowiedź XML z serwera na wyjściu. Przykładowa odpowiedź:

<GetRepositories>
  <Type>Repository</Type>
  <Repositories>
    <Repository Id="A0000001.R0000001" Name="Foundation" Desc="" DefaultNS="SAS"/>
    <Repository Id="A0000001.R0000002" Name="BILineage" Desc="BILineage" DefaultNS="SAS"/>
  </Repositories>
</GetRepositories>

Jak podobny efekt uzyskać we własnej aplikacji na przykładzie C#?

W nowym projekcie do referencji podłączamy biblioteki UserContext.dll (autoryzacja) oraz SASOMIInterop.dll (interakcja) znajdujące się w katalogu z  SAS Integration technologies (np. C:\Program Files\SAS\SharedFiles\Integration Technologies).

Na początek musimy się podłączyć do serwera. Wykorzystujemy do tego SAS.BI.AuthenticationService.ClientUserContext (dokładny opis w pliku AuthenticationService.chm znajdującym się w katalogu SAS Integration Services).

// w sekcji z using:
using cx = SAS.BI.AuthenticationService.ClientUserContext;

class Test
{
    private cx.UserContext userContext;
    private SASOMI.IOMI iomi;

    // autoryzacja
    public int connect()
    {
        cx.Login login = new cx.Login("_nazwa_uzytkownika", "_haslo_", "");
        int port = 12345;
        string host = "_nazwa_hosta_";

        try
        {
            userContext = new cx.UserContext();
            userContext.SetOmrCredentials(login, host, port);

            // GetRepository wyzwala połączenie się do serwera metadanych
            cx.Repository repository = userContext.GetRepository();

            // połączenie do repozytorium
            iomi = (SASOMI.IOMI)repository.IOmi;

            return 1;

        }
        catch (Exception)
        {
            return 0;
        }
    }
}

UserContext przechowuje informacje o połączeniu do serwera OMR (Open Metadata Repository) – czyli do metadanych. Ustawiamy w nim informacje o parametrach użytkownika (cx.Login) i serwera (host, port) za pomocą SetOMRCredentials(). Podłączenie się do serwera następuje za pomocą GetRepository(), GetLogin() albo GetUserName()) Kiedy się podłączymy mamy połączenie dostępne przez repository.IOmi;

Jesteśmy podłączeni do metadanych, to na początek powtórzymy zadanie pobrania repozytoriów. Są dwie metody komunikacji: Standard Interface (dedykowane API) lub wywołanie polecenia DoRequest() z odpowiednio przygotowanym zapytaniem w formacie XML.

// wersja API Test.GetReposiories()
public XElement GetRepositories()
{
    int omiFlags = (int)SASOMI.CONSTANTS.OMI_ALL;
    string omiOptions = "";
    string repositoriesXml;

    int rc = iomi.GetRepositories(out repositoriesXml, omiFlags, omiOptions);

    return XElement.Parse(repositoriesXml);
}

// wersja DoRequest() Test.GetReposioriesDoRequest()
public XElement GetRepositoriesDoRequest()
{
    string repositoriesXml;

    int rc = iomi.DoRequest("<GetRepositories><Repositories /></GetRepositories>", out repositoriesXml);

    return XElement.Parse(repositoriesXml);
}

// wersja z flagami i opcjami Test.GetReposioriesDoRequesWithFlags()
public XElement GetRepositoriesDoRequestWithFlags()
{
    string repositoriesXml;

    string inMetadata = @"<GetRepositories>
<Repositories/>
<Flags>1</Flags>
<Options/>
</GetRepositories>";

    int rc = iomi.DoRequest(inMetadata, out repositoriesXml);

    return XElement.Parse(repositoriesXml);
}

Pobieranie danych dotyczących jakiegoś elementu znajdującego się w metadanych. Tak jak poprzednio można to zrobić na dwa sposoby – albo przez DoRequest(), albo przez API.

// wersja API Test.GetMetadata()
public XElement GetMetadata(string element, int omiFlags, string omiOptions)
{
    string metadataXml;

    int rc = iomi.GetMetadata(element, out metadataXml, "SAS", omiFlags, omiOptions);

    return XElement.Parse(metadataXml);

}

// wersja DoRequest() Test.GetMetadataDoRequest()
public XElement GetMetadataDoRequest(string element, int omiFlags, string omiOptions)
{
    string metadataXml;

    string inMetadata = @"<GetMetadata>
<Metadata>
" + element + @"
</Metadata>
<NS>SAS</NS>
<Flags>" + omiFlags.ToString() + @"</Flags>
<Options>"
+ omiOptions + @"
</Options>
</GetMetadata>";

    int rc = iomi.DoRequest(inMetadata, out metadataXml);

    return XElement.Parse(metadataXml);

}

// przykładowe wywołanie dla konkretnego zainstalowanego przebiegu lub zadania
Test.GetMetadata("<JFJob Id='A0000001.J0000001' />", (int)SASOMI.CONSTANTS.OMI_ALL, "");
Test.GetMetadataDoRequest("<JFJob Id='A0000001.J0000001' />", (int)SASOMI.CONSTANTS.OMI_ALL, "");

Przy wywołaniach za pomocą API i DoRequest() pojawiają się subtelne różnice. Dane zwracane przez API dotyczą tylko poszukiwanego elementu. DoRequest() zwraca także szablon wywołania (tak jak w przykładzie na początku uruchamianym w EG). Przykład dla repozytoriów (bez włączonych flag):

// wersja API
<Repositories>
	<Repository Id="A0000001.R0000001" Name="Foundation" Desc="" DefaultNS="SAS"/>
	<Repository Id="A0000001.R0000002" Name="BILineage" Desc="BILineage" DefaultNS="SAS"/>
</Repositories>

// wersja DoRequest() dla <GetRepositories><Repositories /></GetRepositories>
<GetRepositories>
	<Repositories>
		<Repository Id="A0000001.R0000001" Name="Foundation" Desc="" DefaultNS="SAS"/>
		<Repository Id="A0000001.R0000002" Name="BILineage" Desc="BILineage" DefaultNS="SAS"/>
	</Repositories>
</GetRepositories>

Linki:
SAS 9.2 Open Metadata Interface: Reference and usage http://support.sas.com/documentation/cdl/en/omaref/59983/PDF/default/omaref.pdf
Przykład interakcji z OMI za pomocą C# https://github.com/paulhomes/DotNetOMIDemo

Reklamy

Jedna uwaga do wpisu “Przeglądanie metadanych SAS używając C#

  1. Pingback: Uruchamianie procesu gotowego SAS w .NET | Takietam

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s