Grenzen und Eigenschaften (Referenz)
Grenzen
- Datenbanknamen sind für den Aufrufer nicht sichtbar. Er nennt einen freigegebenen Aliasnamen; die Auflösung geschieht im Dienst.
- Im Dienst filtern, nicht im Client. Auswahl, Filter, Sortierung und Seitenbildung gehören in die Abfrage. Der Dienst liefert je Anfrage höchstens ein Fenster bis zu seiner Obergrenze; wer eine ganze Tabelle lädt, um im Client zu filtern, braucht so viele Anfragen, wie die Tabelle Fenster hat, und überträgt jede Zeile, die er danach verwirft.
- Keine Wiederholung. Eine Zeitüberschreitung beim Aufrufen heißt nicht, dass nichts geschrieben wurde – der Client hat aufgehört zu warten, die Transaktion hat nicht aufgehört zu laufen. Das gilt für
TimedOutund ebenso fürUnavailable, wenn die Verbindung während des Aufrufs abbrach oder der Client nachWriteTimeoutaufgab. Ein automatischer zweiter Versuch würde eine womöglich bestätigte Transaktion wiederholen. Der Datendienst kennt zwar die KopfzeileIdempotency-Key, mit der eine Wiederholung die gespeicherte erste Antwort erhält; der Client sendet sie nicht. Der Grund: Der Dienst hält diese Antworten nur zehn Minuten und nur im Arbeitsspeicher. Nach einem Neustart des Dienstes oder einer längeren Pause würde die Wiederholung doch ein zweites Mal ausgeführt, und der Aufrufer könnte das nicht erkennen. Ob und wie wiederholt wird, entscheidet deshalb die Anwendung, die weiß, ob ihr Aufruf zweimal laufen darf. - Gekürzte Ergebnisse einer Prozedur. Liefert eine Prozedur mehr Zeilen, als die Zeilenobergrenze des Dienstes für ihren Alias erlaubt (
MaxRows), kürzt der Dienst das Ergebnis. Der Client schreibt dazu eine Warnung mit der Korrelationskennung in das Protokoll der Anwendung;GatewayRoutineResultträgt kein Kennzeichen dafür. Eine Prozedur, die große Mengen liefert, gehört deshalb in eine Funktion oder Sicht, die fensterweise gelesen wird. Beim Lesen tritt die Kürzung nicht auf, weil der Dienst kein Fenster größer als die Obergrenze bildet. - Eine Mengenprüfung (
Membership) wird als Kette von Gleichheiten übertragen, weil die Übertragungssyntax keinen Mengenoperator kennt. Das Ergebnis ist dasselbe. Wird die Adresse dadurch länger alsMaxUrlLength, reist die Leseanfrage mit ihren Optionen im Rumpf, und der Dienst gibt eine lange Kette auf einer Spalte als einen einzigen Parameter an die Datenbank. Wie viele Werte eine Mengenprüfung tragen darf, legt das Vertragspaket fest (GatewayFilter.Membership.MaxValues); wie groß der Rumpf sein darf, der Dienst. - Werte, für die es keine vereinbarte Übertragungsform gibt – Aufzählungen, Bytefolgen, Fachobjekte – werden abgewiesen statt mit
ToString()in eine Zeichenkette überführt, die plausibel aussieht und nichts trifft.
Zwei Eigenschaften, die überraschen können
Die Gesamtzahl darf fehlen. GatewayPage.TotalCount ist null, wenn niemand gezählt
hat. Das ist nicht dasselbe wie 0. Wer die Unterscheidung zu einer Null vereinfacht, sagt
einer Liste, es gebe nichts zu laden – über nachweislich vorhandenen Daten und ohne
Fehlermeldung an irgendeiner Stelle. Wer keine Zählung angefordert hat, steuert das
Nachladen über HasMorePotentially: ein volles Fenster kann eine Fortsetzung haben, ein
kurzes ist das Ende.
Ein genauer Betrag reist als Text. SQL Server stellt float über decimal (Microsoft:
Data type precedence): ein
Gleitkommaparameter gegen eine Dezimalspalte lässt die Spalte umwandeln, was den Index
kostet und die letzte Stelle verändern kann. Text steht unter jedem Zahlentyp, also wird der
Parameter umgewandelt – in genau den Typ der Spalte. Ganze Zahlen bis zum Bereich von long bleiben Zahlen, weil
dort die Umwandlung die teure wäre; ein größerer ulong reist als Text.