Erste Schritte mit SQL Server Data Services (SSDS) - Teil 2.2: Zugriff auf SSDS mittels SOAP (Anlegen und Bearbeiten von Containern und Entitys)

Erste Schritte mit SQL Server Data Services (SSDS) - Teil 2.2: Zugriff auf SSDS mittels SOAP (Anlegen und Bearbeiten von Containern und Entitys)

  • Comments 1

Die SQL Server Data Services (SSDS) sind in Microsofts "Software + Services" Strategie im Bereich der Entwickler-Services angesiedelt. In diesem mehrteiligen Blog möchte ich beschreiben, wie dieser Service zur Datenspeicherung genutzt werden kann. In Teil 1 bin ich bereits auf Registrierung und das Datenmodell eingegangen und in Teil 2.1 habe ich beschrieben, wie mittels SOAP-Webservices Authoritys angelegt werden können.

In diesem zweiten Teil dieses zweiten Teils möchte ich beschreiben, wie mittels des Simple Object Access Protocols (SOAP) auf SSDS zugegriffen werden kann, um Container und Entitys anzulegen, auszulesen und zu löschen.

Schritt 4: Anlegen eines Containers

Das Anlegen eines Containers geschieht im Grunde genommen analog zum Anlegen einer Authority. Signifikanter Unterschied ist natürlich, dass als Scope nun nicht der Service selbst sondern die Authority, in der der Container angelegt werden soll, verwendet wird. In folgendem Listing, welches ebenfalls analog zum Programm zur Authority-Anlage geschrieben ist, findet die Anlage des Containers in der Methode createContainer(string , string) statt.

... 

    partial class MySsdsProgram

    {

        private static string userName;

        private static string password;

        private const string sampleAuthorityId = "hsirtl-demo-auth";

        private const string sampleContainerId = "demo-container";

 

        static void Main(string[] args)

        {

            getUserCredentials();

 

            createContainer(sampleAuthorityId, sampleContainerId);

 

            Console.WriteLine("Press any key.");

            Console.ReadKey(true);

        }

 

        private static void createContainer(string authorityId, string containerId)

        {

            using (SitkaSoapServiceClient proxy =

                new SitkaSoapServiceClient("SitkaSoapEndpoint"))

            {

                proxy.ClientCredentials.UserName.UserName = userName;

                proxy.ClientCredentials.UserName.Password = password;

 

                Scope myAuthorityScope = new Scope();

                myAuthorityScope.AuthorityId = authorityId;

 

                Container c1 = new Container();

                c1.Id = containerId;

 

                proxy.Create(myAuthorityScope, c1);

 

                Console.WriteLine("Container {0} created!", c1.Id);

            }

        }

    }

...

Im Service-Proxy-Objekt werden wieder die Credentials gesetzt. Anschließend wird der Scope gesetzt. Im Scope wird die ID der Authority gesetzt. Damit ist festgelegt, dass der Container in dieser Authority angelegt wird. Der Container selbst wird als Objekt instanziiert, die ID wie gewünscht gesetzt und die Service-Methode Create aufgerufen. Aus Gründen der Übersichtlichkeit wurde hier auf ein Exception-Handling verzichtet. Im Projektcode, den ich noch anfügen werde, ist dieses Handling enthalten.

Ausführung des Programms führt dann zur folgenden Ausgabe:

Container demo-container created!
Press any key.

Um später die Authority wieder "aufräumen" zu können, als nächstes nun das Löschen eines Containers. Im Prinzip läuft wieder alles analog, d.h. Anlegen des Proxy-Objekts für den Service, Definition des Scopes und Auführen der Lösch-Operation.

... 

    private static void deleteContainer(string authorityId, string containerId)

    {

        using (SitkaSoapServiceClient proxy =

            new SitkaSoapServiceClient("SitkaSoapEndpoint"))

        {

            proxy.ClientCredentials.UserName.UserName = userName;

            proxy.ClientCredentials.UserName.Password = password;

 

            Scope myContainerScope = new Scope();

            myContainerScope.AuthorityId = authorityId;

            myContainerScope.ContainerId = containerId;

 

            proxy.Delete(myContainerScope);

 

            Console.WriteLine("Container {0} deleted!", containerId);

        }

    }
...

Man beachte, dass in diesem Fall im Scope neben der Authority-ID auch die Container-ID gesetzt werden muss (denn schließlich will man hier den Container und nicht die Authority löschen). Auch hier habe ich aus Gründen der Übersichtlichkeit Exception-Handling ausgelassen.

Ausführung des Programms führt dann zur folgenden Ausgabe:

Container demo-container deleted!
Press any key.

Damit stehen die wichtigsten Operationen zum Strukturieren der Daten (genauer der Entitys) zur Verfügung: das Anlegen von Authoritys und das Anlegen und Löschen von Containern. Nachdem wir in SSDS aber natürlich auch irgendwann mal Daten ablegen wollen, wird es nun interessant: das Anlegen, Ändern und Löschen von Entitys.

Zunächst also das Anlegen von Entitys. Und wieder geht alles nach der bewährten Vorgehensweise

  1. Anlegen eines Proxy-Objekts für den Service
  2. Definition des Scopes
  3. Anlegen des Entity-Objekts
  4. Aufruf der Create-Methode des Service

Hier das entsprechende Listing einer createEntity-Methode:

... 

    private static void createEntity(string authorityId, string containerId, string entityId)

    {

        using (SitkaSoapServiceClient proxy =

            new SitkaSoapServiceClient("SitkaSoapEndpoint"))

        {

            proxy.ClientCredentials.UserName.UserName = userName;

            proxy.ClientCredentials.UserName.Password = password;

 

            Scope myContainerScope = new Scope();

            myContainerScope.AuthorityId = authorityId;

            myContainerScope.ContainerId = containerId;

 

            Entity e1 = new Entity();

 

            e1.Id = entityId;

            e1.Kind = "UsedBookKind";

 

            e1.Properties = new Dictionary<string, object>();

            e1.Properties["Name"] = "My Book";

            e1.Properties["Address"] = "1-57880-066-36";

            e1.Properties["Birthday"] = DateTime.Parse("27.01.2004");

 

            proxy.Create(myContainerScope, e1);

 

            Console.WriteLine("Entity {0} created!", e1.Id);

        }

    }

...

Im Wesentlichen sollte der Code nahezu selbsterklärend sein. Auf ein paar Details möchte ich hinweisen: Als Scope wird hier der Container angegeben, in dem die Entity angelegt werden soll. Die Definition der Entity geschieht in folgenden Code-Zeilen:

            Entity e1 = new Entity();

 

            e1.Id = entityId;

            e1.Kind = "UsedBookKind";

 

            e1.Properties = new Dictionary<string, object>();

            e1.Properties["Name"] = "Max Mustermann";

            e1.Properties["Address"] = "Musterstrasse 1, 12345 Musterort";

            e1.Properties["Birthday"] = DateTime.Parse("01.01.1980");

Analog zu Authoritys und Containern wird zunächst ein Entity-Objekt instanziiert. Anschließend werden die Pflichtattribute "ID" und "Kind" gesetzt. Dem folgt die Definition der "flexible Properties" (d.h. der frei definierbaren Schlüssel/Wert-Paare). Man beachte hier, dass verschiedene Werttypen (String und DateTime) eingetragen werden.

Nachdem es so einfach ist, nun gleich zum Ändern von Entitys:

    private static void updateEntity(string authorityId, string containerId, string entityId)

    {

        using (SitkaSoapServiceClient proxy =

            new SitkaSoapServiceClient("SitkaSoapEndpoint"))

        {

            proxy.ClientCredentials.UserName.UserName = userName;

            proxy.ClientCredentials.UserName.Password = password;

 

            Scope myEntityScope = new Scope();

            myEntityScope.AuthorityId = authorityId;

            myEntityScope.ContainerId = containerId;

            myEntityScope.EntityId = sampleEntityId;

 

            Entity myBook = proxy.Get(myEntityScope);

 

            // 1) Einfuegen einer neuen flex property

            string newPropName = "NewProp";

            myBook.Properties[newPropName] = "New Prop Value";

 

            // 2) Aendern einer bestehenden flex property

            if (myBook.Properties.ContainsKey("Name"))

            {

                myBook.Properties["Name"] = "Tina Testfrau";

            }

 

            proxy.Update(myEntityScope, myBook);

            Console.WriteLine("Entity {0} updated!", myEntityScope.EntityId);

        }

    }

Ich denke, auch hier ist der Code im Großen und Ganzen selbsterklärend. Der Scope wird jetzt bis zur Entity definiert, d.h. es werden Authority-, Container- und Entity-ID angegeben. Letztere muss man natürlich kennen. In unserem Beispiel ist dies natürlich gegeben. Im "echten Leben" würde man die ID häufig über Suchoperationen herausfinden. Suche werde ich in einem späteren Blog behandeln.

Das Beispiel oben zeigt, dass ohne Schwierigkeiten bestehende Propertys hinzugefügt und bestehende geändert werden können. Der Aufruf der Update-Methode überschreibt dann die alte Entity in SSDS.

Abschließend noch zum Löschen von Entitys. Es ist keine Überraschung, dass dies wieder analog den anderen Operationen geschieht, d.h. Proxy-Objekt definieren, Scope (bis zur Entity!) festlegen, Delete-Operation aufrufen...

    private static void deleteEntity(string authorityId, string containerId, string entityId)

    {

        using (SitkaSoapServiceClient proxy =

            new SitkaSoapServiceClient("SitkaSoapEndpoint"))

        {

            proxy.ClientCredentials.UserName.UserName = userName;

            proxy.ClientCredentials.UserName.Password = password;

 

            // The scope must be set to the entity you want to update

            Scope myEntityScope = new Scope();

            myEntityScope.AuthorityId = authorityId;

            myEntityScope.ContainerId = containerId;

            myEntityScope.EntityId = sampleEntityId;

 

            proxy.Delete(myEntityScope);

            Console.WriteLine("Entity {0} deleted!", myEntityScope.EntityId);

        }

    }

Damit stehen im Grunde alle wichtigen Methoden zum Anlegen, Ändern und Löschen von SSDS-Inhalten zur Verfügung. Obige Beispiele sind natürlich sehr einfach gehalten und enthalten noch keine Fehlerbehandlung. Dies sollte für echte Anwendungen natürlich geändert werden.

In weiteren Teilen dieser Blog-Reihe gehe ich unter anderem noch auf folgende Themen ein:

  • Suche nach Entitys
  • Fehlerbehandlung im Zusammenhang mit SSDS

Stay tuned!

Ich bin Referent auf dem Microsoft Technical Summit 2008 - treffen Sie mich vor Ort!

Leave a Comment
  • Please add 5 and 4 and type the answer here:
  • Post