You are on page 1of 506

Adaptive Server® Anywhere Handbuch für Programmierer

Stand: Bestellnummer:

Oktober 2002 03946-01-0802-01

Copyright © 1989–2002 Sybase, Inc. Teil-Copyright © 2002 iAnywhere Solutions, Inc. Alle Rechte vorbehalten. Diese Publikation darf ohne vorheriges schriftliches Einverständnis der iAnywhere Solutions, Inc. weder ganz noch teilweise, weder elektronisch, mechanisch, manuell, optisch, noch auf sonst eine Weise reproduziert, übertragen oder übersetzt werden. iAnywhere Solutions, Inc ist eine Tochtergesellschaft der Sybase Inc. Sybase, das SYBASE-Logo, AccelaTrade, ADA Workbench, Adaptable Windowing Environment, Adaptive Component Architecture, Adaptive Server, Adaptive Server Anywhere, Adaptive Server Enterprise, Adaptive Server Enterprise Monitor, Adaptive Server Enterprise Replication, Adaptive Server Everywhere, Adaptive Server IQ, Adaptive Warehouse, AnswerBase, Anywhere Studio, Application Manager, AppModeler, APT Workbench, APT-Build, APT-Edit, APT-Execute, APT-FORMS, APT-Library, APT-Translator, ASEP, Backup Server, BayCam, Bit-Wise, BizTracker, Certified PowerBuilder Developer, Certified SYBASE Professional, Certified SYBASE Professional (Logo), ClearConnect, Client Services, Client-Library, CodeBank, Column Design, ComponentPack, Connection Manager, Convoy/DM, Copernicus, CSP, Data Pipeline, Data Workbench, DataArchitect, Database Analyzer, DataExpress, DataServer, DataWindow, DB-Library, dbQueue, Developers Workbench, Direct Connect Anywhere, DirectConnect, Distribution Director, Dynamo, e-ADK, E-Anywhere, e-Biz Integrator, E-Whatever, EC-GATEWAY, ECMAP, ECRTP, eFulfillment Accelerator, Electronic Case Management, Embedded SQL, EMS, Enterprise Application Studio, Enterprise Client/Server, Enterprise Connect, Enterprise Data Studio, Enterprise Manager, Enterprise SQL Server Manager, Enterprise Work Architecture, Enterprise Work Designer, Enterprise Work Modeler, eProcurement Accelerator, eremote, Everything Works Better When Everything Works Together, EWA, Financial Fusion, Financial Fusion Server, First Impression, Formula One, Gateway Manager, GeoPoint, iAnywhere, iAnywhere Solutions, ImpactNow, Industry Warehouse Studio, InfoMaker, Information Anywhere, Information Everywhere, InformationConnect, InstaHelp, Intellidex, InternetBuilder, iremote, iScript, Jaguar CTS, jConnect for JDBC, KnowledgeBase, Logical Memory Manager, MainframeConnect, Maintenance Express, MAP, MDI Access Server, MDI Database Gateway, media.splash, MetaWorks, MethodSet, ML Query, MobiCATS, MySupport, Net-Gateway, Net-Library, New Era of Networks, Next Generation Learning, Next Generation Learning Studio, O DEVICE, OASiS, OASiS (logo), ObjectConnect, ObjectCycle, OmniConnect, OmniSQL Access Module, OmniSQL Toolkit, Open Biz, Open Business Interchange, Open Client, Open Client/Server, Open Client/Server Interfaces, Open ClientConnect, Open Gateway, Open Server, Open ServerConnect, Open Solutions, Optima++, Partnerships that Work, PB-Gen, PC APT Execute, PC DB-Net, PC Net Library, PhysicalArchitect, Pocket PowerBuilder, PocketBuilder, Power Through Knowledge, Power++, power.stop, PowerAMC, PowerBuilder, PowerBuilder Foundation Class Library, PowerDesigner, PowerDimensions, PowerDynamo, Powering the New Economy, PowerJ, PowerScript, PowerSite, PowerSocket, Powersoft, Powersoft Portfolio, Powersoft Professional, PowerStage, PowerStudio, PowerTips, PowerWare Desktop, PowerWare Enterprise, ProcessAnalyst, Rapport, Relational Beans, Replication Agent, Replication Driver, Replication Server, Replication Server Manager, Replication Toolkit, Report Workbench, Report-Execute, Resource Manager, RW-DisplayLib, RW-Library, S Designor, S-Designor, S.W.I.F.T. Message Format Libraries, SAFE, SAFE/PRO, SDF, Secure SQL Server, Secure SQL Toolset, Security Guardian, SKILS, smart.partners, smart.parts, smart.script, SQL Advantage, SQL Anywhere, SQL Anywhere Studio, SQL Code Checker, SQL Debug, SQL Edit, SQL Edit/TPU, SQL Everywhere, SQL Modeler, SQL Remote, SQL Server, SQL Server Manager, SQL Server SNMP SubAgent, SQL Server/CFT, SQL Server/DBM, SQL SMART, SQL Station, SQL Toolset, SQLJ, Stage III Engineering, Startup.Com, STEP, SupportNow, Sybase Central, Sybase Client/Server Interfaces, Sybase Development Framework, Sybase Financial Server, Sybase Gateways, Sybase Learning Connection, Sybase MPP, Sybase SQL Desktop, Sybase SQL Lifecycle, Sybase SQL Workgroup, Sybase Synergy Program, Sybase User Workbench, Sybase Virtual Server Architecture, SybaseWare, Syber Financial, SyberAssist, SybMD, SyBooks, System 10, System 11, System XI (Logo), SystemTools, Tabular Data Stream, The Enterprise Client/Server Company, The Extensible Software Platform, The Future Is Wide Open, The Learning Connection, The Model For Client/Server Solutions, The Online Information Center, The Power of One, TradeForce, Transact-SQL, Translation Toolkit, Turning Imagination Into Reality, UltraLite, UNIBOM, Unilib, Uninull, Unisep, Unistring, URK Runtime Kit for UniCode, Viewer, Visual Components, VisualSpeller, VisualWriter, VQL, Warehouse Control Center, Warehouse Studio, Warehouse WORKS, WarehouseArchitect, Watcom, Watcom SQL, Watcom SQL Server, Web Deployment Kit, Web.PB, Web.SQL, WebSights, WebViewer, WorkGroup SQL Server, XA-Library, XA-Server und XP Server sind Marken von Sybase, Inc. oder ihren Tochtergesellschaften. Alle anderen Marken sind Eigentum ihrer jeweiligen Eigentümer. Stand: Oktober 2002. Bestellnummer: 03946-01-0802-01.

Inhalt

Über dieses Handbuch .................................................... vii
Dokumentation zu SQL Anywhere Studio ..............................viii Konventionen in dieser Dokumentation ................................... xi Adaptive Server Anywhere-Beispieldatenbank.......................xiv Wenn Sie mehr wissen und uns Ihre Anregungen mitteilen möchten .................................................................... xv

1

Überblick über die Programmierschnittstelle .................. 1
Die ODBC-Programmierschnittstelle ........................................ 2 Die Programmierschnittstelle OLE DB...................................... 3 Die Embedded SQL-Programmierschnittstelle ......................... 4 Die JDBC-Programmierschnittstelle ......................................... 5 Die Open Client-Programmierschnittstelle................................ 6

2

SQL in Anwendungen verwenden .................................... 9
SQL-Anweisungen in Anwendungen ausführen ..................... 10 Anweisungen vorbereiten ....................................................... 12 Der Cursor............................................................................... 15 Mit Cursorn arbeiten................................................................ 20 Cursortypen auswählen .......................................................... 26 Adaptive Server Anywhere-Cursor ......................................... 30 Ergebnismengen beschreiben ................................................ 47 Transaktionen in Anwendungen steuern ................................ 49

3

Einführung in Java für Datenbanken.............................. 53
Einleitung ................................................................................ 54 Fragen und Antworten zu Java in der Datenbank .................. 57 Ein Java-Seminar.................................................................... 64 Die Laufzeitumgebung für Java in der Datenbank.................. 75 Praktische Einführung: Eine Übung mit Java in der Datenbank......................................................................... 84

iii

4

Java in der Datenbank benutzen .................................... 93
Einleitung ................................................................................ 94 Datenbank für Java aktivieren ................................................ 97 Java-Klassen in einer Datenbank installieren....................... 103 Spalten für die Aufnahme von Java-Objekten erstellen................................................................................. 109 Java-Objekte einfügen, aktualisieren und löschen ............... 111 Java-Objekte abfragen.......................................................... 117 Java-Felder und Objekte vergleichen ................................... 119 Besondere Funktionen von Java-Klassen in der Datenbank............................................................................. 123 So werden Java-Objekte gespeichert................................... 130 Java-Datenbankdesign ......................................................... 133 Berechnete Spalten mit Java-Klassen verwenden ............... 137 Speicher für Java konfigurieren ............................................ 140

5

Datenzugriff über JDBC ................................................ 143
Überblick über JDBC ............................................................ 144 jConnect-JDBC-Treiber verwenden...................................... 150 JDBC-ODBC-Brücke verwenden .......................................... 155 JDBC-Verbindungen herstellen ............................................ 157 JDBC für den Zugriff auf Daten verwenden.......................... 165 Verteilte Anwendungen erstellen .......................................... 174

6

Programmieren mit Embedded SQL ............................ 181
Überblick ............................................................................... 182 Beispielprogramme mit Embedded SQL .............................. 190 Datentypen in Embedded SQL ............................................. 196 Hostvariable benutzen .......................................................... 200 SQL-Kommunikationsbereich (SQLCA) ............................... 208 Daten abrufen ....................................................................... 214 Statische und dynamische SQL............................................ 223 Der SQL-Deskriptor-Bereich (SQLDA) ................................. 228 Lange Werte senden und abfragen ...................................... 237 Gespeicherte Prozeduren verwenden .................................. 243 Programmiertechniken für Embedded SQL.......................... 247 SQL-Präprozessor ................................................................ 249 Referenz der Bibliotheksfunktion .......................................... 253 Befehlszusammenfassung für Embedded SQL.................... 272

7

ODBC-Programmierung ................................................ 277
Einführung in ODBC ............................................................. 278 ODBC-Anwendungen erstellen............................................. 280 ODBC-Beispiele.................................................................... 285

iv

ODBC-Handles ..................................................................... 287 Verbindung mit einer Datenquelle herstellen........................ 290 SQL-Anweisungen ausführen ............................................... 294 Mit Ergebnismengen arbeiten ............................................... 299 Gespeicherte Prozeduren aufrufen....................................... 304 Umgang mit Fehlern.............................................................. 306

8

Die DBTools-Schnittstelle ............................................. 311
Einführung in die DBTools-Schnittstelle................................ 312 DBTools-Schnittstelle verwenden ......................................... 314 DBTools-Funktionen ............................................................. 323 DBTools-Strukturen............................................................... 335 DBTools-Aufzählungstypen .................................................. 367

9

Die OLE DB- und ADO-Programmierschnittstellen ..... 371
Einführung zu OLE DB.......................................................... 372 ADO-Programmierung mit Adaptive Server Anywhere .............................................................................. 374 Unterstützte OLE DB-Schnittstellen...................................... 382

10

Die Open Client-Schnittstelle........................................ 389
Was Sie für die Entwicklung von Open ClientAnwendungen brauchen ....................................................... 390 Datentyp-Zuordnungen ......................................................... 391 SQL in Open Client-Anwendungen verwenden .................... 394 Bekannte Open Client-Einschränkungen von Adaptive Server Anywhere ................................................... 398

11

Dreischichtige Datenverarbeitung und verteilte Transaktionen ................................................................ 399
Einleitung .............................................................................. 400 Dreischichtige Datenverarbeitungsarchitektur ...................... 401 Verteilte Transaktionen verwenden ...................................... 405 EAServer mit Adaptive Server Anywhere verwenden............................................................................. 407

12

Deployment: Datenbanken und Anwendungen im System bereitstellen ................................................................... 411
Systemeinführung - Überblick............................................... 412 Installationsverzeichnisse und Dateinamen.......................... 415 InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden........................................................ 420 v

Dialogfreie Installation für die Systemeinführung ................. 422 Clientanwendungen im System bereitstellen........................ 426 Tools zur Verwaltung bereitstellen........................................ 437 Datenbankserver im System bereitstellen ............................ 438 Eingebettete Datenbankanwendungen im System bereitstellen........................................................................... 441

13

Fehlermeldungen des SQL-Präprozessors.................. 445
Fehlermeldungen des SQL-Präprozessors, sortiert nach Fehlernummern................................................ 446 SQLPP-Fehler....................................................................... 450

Index............................................................................... 467

vi

Über dieses Handbuch

Gegenstand

In diesem Handbuch wird beschrieben, wie Datenbankanwendungen in den Programmiersprachen C, C++ und Java aufgebaut und bereitgestellt werden. Benutzer von Programmen wie Visual Basic und PowerBuilder können deren Programmierschnittstellen einsetzen. Das Handbuch ist für Anwendungsentwickler bestimmt, die Programme schreiben, welche direkt mit einer der Schnittstellen von Adaptive Server Anywhere interagieren. Sie brauchen das Handbuch nicht zu lesen, wenn Sie ein Entwicklungstool wie PowerBuilder oder Visual Basic verwenden, die eine eigene DatenbankSchnittstelle nach dem ODBC-Standard benutzen.

Zielgruppe

vii

Dokumentation zu SQL Anywhere Studio
Diese Dokumentation ist Teil der SQL Anywhere-Dokumentation. Dieser Abschnitt enthält eine Liste der Handbücher und Hinweise zu ihrer Verwendung.

Dokumentation zu SQL Anywhere Studio
Die Dokumentation zu SQL Anywhere Studio besteht aus folgenden Handbüchern: ♦
SQL Anywhere Studio Erste Orientierung Dieses Handbuch enthält

einen Überblick über die Datenbankverwaltungs- und Synchronisationstechnologien von SQL Anywhere Studio. Es enthält praktische Einführungen zu einzelnen Bestandteilen von SQL Anywhere Studio. ♦
Neues in SQL Anywhere Studio Dieses Handbuch richtet sich an Benutzer früherer Versionen dieser Software. Es enthält eine Liste neuer Funktionen in dieser und in früheren Versionen des Programms und eine Beschreibung der Upgrade-Prozeduren.

♦ Adaptive Server Anywhere Erste Schritte Dieses Handbuch richtet sich an Personen, die noch nicht mit relationalen Datenbanken bzw. mit Adaptive Server Anywhere gearbeitet haben. Es enthält eine Kurzeinführung in das Datenbankverwaltungssystem Adaptive Server Anywhere und einführende Hinweise zum Entwerfen und Aufbauen von Datenbanken sowie zur Arbeit mit Datenbanken. ♦
Adaptive Server Anywhere Datenbankadministration Dieses Handbuch befasst sich mit der Ausführung, Verwaltung und Konfiguration von Datenbanken. Adaptive Server Anywhere SQL-Benutzerhandbuch In diesem

Handbuch wird beschrieben, wie Datenbanken entworfen und eingerichtet, Daten importiert, exportiert, geändert bzw. abgerufen und gespeicherte Prozeduren und Trigger aufgebaut werden. ♦
Adaptive Server Anywhere SQL-Referenzhandbuch Dieses Handbuch

ist eine umfassende Referenz für die in Adaptive Server Anywhere verwendete SQL-Sprache. Auch die Adaptive Server AnywhereSystemtabellen und Prozeduren werden darin beschrieben.

viii

Adaptive Server Anywhere Handbuch für Programmierer In diesem Handbuch wird beschrieben, wie Datenbankanwendungen in den Programmiersprachen C, C++ und Java aufgebaut und bereitgestellt werden. Benutzer von Programmen wie Visual Basic und PowerBuilder können deren Programmierschnittstellen einsetzen. Adaptive Server Anywhere Fehlermeldungen Dieses Handbuch enthält eine vollständige Liste der Fehlermeldungen in Adaptive Server Anywhere sowie Diagnosehinweise. Adaptive Server Anywhere Ergänzung zu C2-Sicherheitssystemen

Adaptive Server Anywhere 7.0 wurde die Sicherheitseinstufung TCSEC (Trusted Computer System Evaluation Criteria) C2 der US-Regierung verliehen. Dieses Handbuch kann für den Personenkreis von Interesse sein, der die aktuelle Version von Adaptive Server Anywhere in einer Umgebung ausführen möchte, die dem C2-Zertifikat entspricht. Nach der Zertifizierung hinzugefügte Sicherheitsfunktionen werden im Handbuch nicht erwähnt. ♦
MobiLink Benutzerhandbuch In diesem Handbuch werden alle

Aspekte des MobiLink-Datensynchronisationssystems für die mobile Datenverarbeitung erläutert. Mit diesem System können Daten von einzelnen Oracle-, Sybase-, Microsoft- oder IBM-Datenbanken und vielen Adaptive Server Anywhere- bzw. UltraLite-Datenbanken gemeinsam genutzt werden. ♦
SQL Remote Benutzerhandbuch In diesem Handbuch werden alle Aspekte des SQL Remote-Datenreplikationssystems für mobile Datenverarbeitung beschrieben, das die gemeinsame Datennutzung von einer einzelnen Adaptive Server Anywhere- bzw. Adaptive Server Enterprise-Datenbank und vielen Adaptive Server AnywhereDatenbanken über eine indirekte Verbindung wie etwa E-Mail oder Datenübertragung ermöglicht. UltraLite Benutzerhandbuch In diesem Handbuch wird beschrieben,

wie Datenbankanwendungen für kleine Geräte wie Organizer mit der UltraLite-Bereitstellungstechnologie für Adaptive Server AnywhereDatenbanken aufgebaut werden. ♦
UltraLite User’s Guide for PenRight! MobileBuilder (nur in englischer Sprache verfügbar) Dieses Handbuch richtet sich an

Benutzer des Entwicklungsprogramms PenRight! MobileBuilder. Hier wird beschrieben, wie die UltraLite-Technologie in der MobileBuilderProgrammierumgebung eingesetzt wird. ♦
SQL Anywhere Studio-Hilfe Dieses Handbuch ist nur online verfügbar.

Es enthält die kontextsensitive Hilfe für Sybase Central, Interactive SQL und andere grafische Programme.

ix

Zusätzlich zu dieser Dokumentation werden SQL Modeler und InfoMaker mit eigener Dokumentation geliefert.

Dokumentationsformate
SQL Anywhere Studio umfasst Dokumentationen in folgenden Formaten: ♦
Online-Dokumentation Die Online-Dokumentation enthält die

vollständige SQL Anywhere Studio-Dokumentation, einschließlich der gedruckten Handbücher und der kontextsensitiven Hilfe für die SQL Anywhere-Dienstprogramme. Die Online-Dokumentation wird mit jeder Wartungsversion des Produkts aktualisiert. Dies ist die vollständigste und aktuellste Informationsquelle. Wenn Sie unter Windows-Betriebssystemen auf die OnlineDokumentation zugreifen wollen, klicken Sie auf Start®Programme®Sybase SQL Anywhere 8®Online-Dokumentation. Der Zugriff auf den Inhalt erfolgt über die HTML-Inhaltsangabe, den Index und die Suchfunktion im linken Fensterausschnitt sowie über Links und Menüs im rechten Fensterausschnitt. Unter UNIX-Betriebssystemen geben Sie den folgenden Befehl in einer Befehlszeile ein, damit die Dokumentation aufgerufen wird:
dbbooks

Ausdruckbare Handbücher Die SQL Anywhere-Handbücher werden in Form von PDF-Dateien geliefert, die mit dem Adobe Acrobat Reader eingesehen werden können.

Die PDF-Dateien finden sich auf der CD-ROM im Verzeichnis pdf_docs. Während der Installation können Sie entscheiden, ob sie installiert werden sollen. ♦
Gedruckte Handbücher Die folgenden Handbücher finden Sie in der

SQL Anywhere Studio-Box: ♦ ♦ ♦ SQL Anywhere Studio Erste Orientierung Adaptive Server Anywhere Erste Schritte SQL Anywhere Studio Kurzreferenz. Dieses Handbuch ist nur in gedruckter Form verfügbar.

Der gesamte Handbuchsatz kann als SQL Anywhere-Dokumentation über den Sybase-Vertrieb bzw. den e-Shop - den Sybase-OnlineVertrieb - bezogen werden, und zwar unter der Adresse http://eshop.sybase.com/cgi-bin/eshop.storefront/.

x

[ ASC | DESC ] Sie können z. ♦ Alternativen Wenn nur eine der vorhandenen Optionen gewählt werden darf.B. ♦ Optionen Wenn aus einer Liste kein oder nur ein Element ausgewählt werden darf. werden die Elemente durch Senkrechtstriche voneinander getrennt. entweder ASC. wie SpaltenIntegritätsregel im folgenden Beispiel: ADD Spaltendefinition [ Spalten-Integritätsregel.]Tabellenname ♦ Wiederholungen Listen mit sich wiederholenden Elementen werden mit einem Element der Liste. werden wie die Wörter Eigentümer und Tabellenname im folgenden Beispiel angezeigt: ALTER TABLE [ Eigentümer. [ QUOTES { ON | OFF } ] xi . dass der Savepoint-Name fakultativ ist. werden die Alternativen in geschweifte Klammern gesetzt.Konventionen in dieser Dokumentation In diesem Abschnitt werden die Konventionen für die Schreibweise und der grafische Aufbau beschrieben. RELEASE SAVEPOINT [ Savepoint-Name ] Diese eckigen Klammern zeigen an. Syntaxkonventionen Folgende Konventionen werden bei SQL-Syntaxbeispielen verwendet: ♦ Schlüsselwörter Alle SQL-Schlüsselwörter werden wie die Wörter ALTER TABLE im folgenden Beispiel angezeigt: ALTER TABLE [ Eigentümer. Wenn mehr als ein Element angegeben wird. muss eine Trennung der Elemente durch Kommas erfolgen. und die komplette Liste wird in eckige Klammern gesetzt. Die eckigen Klammern werden nicht eingegeben. Die eckigen Klammern werden nicht eingegeben. DESC oder keines wählen. die durch entsprechende Identifizierer oder Ausdrücke ersetzt werden müssen. … ] Ein oder mehrere Listenelemente sind zulässig.]Tabellenname ♦ Platzhalter Elemente. gefolgt von drei Punkten gezeigt. der in dieser Dokumentation verwendet wird. ♦ Fakultative Bestandteile Fakultative Bestandteile einer Anweisung werden in eckige Klammern gesetzt.

{ CONNECT. ♦ Eine oder mehrere Optionen Wenn Sie mehr als eine wählen. Eckige und geschweifte Klammern sind nicht einzugeben. trennen Sie die Eingaben durch Kommas. DBA. muss entweder ON oder OFF angegeben werden. RESOURCE } Grafische Symbole Folgende Symbole werden in dieser Dokumentation verwendet: xii .Wenn die Option QUOTES ausgewählt wird.

Ein Sybase Replication Server API Eine Programmierschnittstelle xiii . der SQL Remote-Nachrichtenagent und der Replication Agent (Log Transfer Manager). der sie steuert. Mit Hilfe derartiger Software können Daten in mehreren Datenbanken gleichzeitig verwendet werden.oder Synchronisations-Middleware. Beispiele sind der MobiLink Synchronisationsserver. Replikations. wie etwa Sybase Adaptive Server Anywhere oder Adaptive Server Enterprise Eine UltraLite-Anwendung und der Datenbankserver. repräsentieren. Bei UltraLite sind der Datenbankserver und die Anwendung Teil des gleichen Prozesses. der in Replication Server eingesetzt wird. In einigen abstrakten Diagrammen kann dieses Symbol die Datenbank und gleichzeitig auch den Datenbankserver.Symbol Bedeutung Eine Clientanwendung Ein Datenbankserver. Eine Datenbank.

fk> <pk> <fk> integer smallint integer integer date employee emp_id manager_id emp_fname emp_lname dept_id street city state zip_code phone status ss_number salary start_date termination_date birth_date bene_health_ins bene_life_ins bene_day_care sex <pk> integer integer char(20) char(20) <fk> integer char(40) char(20) char(4) char(9) char(10) char(1) char(11) numeric(20. Alle Daten in der Datenbank sind frei erfunden.fk> char(4) char(2) char(2) numeric(9) department dept_id dept_name dept_head_id <pk> integer char(40) <fk> integer xiv .2) sales_order_items id line_id id = prod_id prod_id quantity ship_date <pk. customers.db im Installationsverzeichnis von SQL Anywhere. In der nachstehend abgebildeten Strukturdarstellung werden die Tabellen der Beispieldatenbank und ihre Beziehungen zueinander erläutert. Die Beispieldatenbank befindet sich in einer Datei mit dem Namen asademo. Abteilungen (departments) und Finanzdaten (finances) sowie Produktinformationen (products) und Verkaufsinformationen (sales orders.Adaptive Server Anywhere-Beispieldatenbank Viele der in der Dokumentation beschriebenen Beispiele verwenden die Adaptive Server Anywhere-Beispieldatenbank.db product id name description size color quantity unit_price <pk> integer char(15) char(30) char(18) char(6) integer numeric(15. Sie enthält interne Informationen über das Unternehmen wie Mitarbeiter (employees). Die Beispieldatenbank stellt ein kleines Unternehmen dar.3) date date date char(1) char(1) char(1) char(1) id = id emp_id = sales_rep customer id fname lname address city state zip phone company_name <pk> integer char(15) char(20) char(35) char(20) char(2) char(10) char(12) char(35) sales_order id cust_id order_date id = cust_id fin_code_id region sales_rep <pk> integer <fk> integer date <fk> char(2) char(7) <fk> integer code = fin_code_id fin_code contact id last_name first_name title street city state zip phone fax <pk> integer char(15) char(15) char(2) char(30) char(20) char(2) char(5) char(10) char(10) code type description <pk> char(2) char(10) char(50) dept_id = dept_id emp_id = dept_head_id code = code fin_data year quarter code amount <pk> <pk> <pk. contacts). asademo.

sqlanywhere. indem Sie Newsgroups nutzen.public.product_futures_discussion.sqlanywhere. sybase. sofern sie Zeit dazu haben. mehr bereitzustellen als einen Systemadministrator.public. Lösungen. Informationen oder Ideen in seinen Newsgroups bereitzustellen. sybase.public. Die technischen Mitarbeiter von iAnywhere Solutions stehen.public. noch ist Sybase verpflichtet.public.sqlanywhere.com.replication. sybase. sybase.linux. für den Newsgroup-Service bereit.mobilink. ebenso wie andere Mitarbeiter.Wenn Sie mehr wissen und uns Ihre Anregungen mitteilen möchten Wir würden gerne Ihre Meinung kennen und sind an Ihren Vorschlägen und Anregungen zu dieser Dokumentation interessiert. um Lösungen und Informationen bereitzustellen. der den Service überwacht und seine Abwicklung sowie die Verfügbarkeit gewährleistet.ultralite. Sie stellen ihre Hilfe freiwillig zur Verfügung und sind möglicherweise nicht regelmäßig verfügbar. xv .sybase. Sie finden diese Newsgroups auf dem Newsserver forums. die zur Diskussion über SQL Anywhere-Technologien eingerichtet wurden. Newsgroup-Verpflichtungsausschluss Sybase ist weder verpflichtet.sqlanywhere. Dazu gehören: ♦ ♦ ♦ ♦ ♦ ♦ sybase.general.public. Ihre Einsatzfähigkeit ist abhängig von ihrer aktuellen Arbeitsauslastung.sqlanywhere. sybase. Sie können uns Ihre Anregungen zu dieser Dokumentation und der Software übermitteln.sqlanywhere.

xvi .

Alle ClientAnwendungen verwenden eine dieser Schnittstellen für die Kommunikation mit der Datenbank. Thema Die ODBC-Programmierschnittstelle Die Programmierschnittstelle OLE DB Die Embedded SQL-Programmierschnittstelle Die JDBC-Programmierschnittstelle Die Open Client-Programmierschnittstelle Seite 2 3 4 5 6 Inhalt 1 .K A P I T E L 1 Überblick über die Programmierschnittstelle Über dieses Kapitel Dieses Kapitel ist eine Einführung in die einzelnen Programmierschnittstellen für Adaptive Server Anywhere.

ODBC ist eine Schnittstelle auf niedriger Ebene . wenn Ihre Anwendung auf andere Datenquellen portierbar sein soll. Sie basiert auf der SQL Access Group CLI Spezifikation. Das vorliegende Handbuch enthält einige zusätzliche Hinweise. CLI). ODBC ist unter Windows Betriebssystemen außer Windows CE als DLL verfügbar. sollten Sie ODBC verwenden. Unter UNIX steht der Treiber als Bibliothek zur Verfügung. Die wichtigste Dokumentation für ODBC ist der Microsoft ODBC Software Development Kit. Sie müssen ODBC verwenden. Fast alle Funktionen von Adaptive Server Anywhere sind mit dieser Schnittstelle verfügbar. 2 . die einen ODBC-Treiber bereitstellt. die sich an Entwickler richten. $ ODBC wird im Abschnitt "ODBC-Programmierung" auf Seite 277 beschrieben. ODBCAnwendungen können mit jeder Datenquelle ausgeführt werden. die von Microsoft entwickelt wurde. die ODBC-Anwendungen für Adaptive Server Anywhere bereitstellen. die mit ODBCTreibern arbeiten.etwa auf demselben Niveau wie Embedded SQL. Auch wenn Sie die Arbeit mit einer API bevorzugen.Die ODBC-Programmierschnittstelle Die ODBC-Programmierschnittstelle ODBC (Open Database Connectivity) ist eine Standardschnittstelle auf Aufrufebene (Call Level Interface.

die die OLE DBProgrammierschnittstelle verwenden. $ Weitere Hinweise finden Sie unter "Die OLE DB. diese zu ändern und zu aktualisieren. Diese Schnittstellen unterstützen so viele DBMS-Funktionen. Die primäre Dokumentation für das Programmieren mit OLE DB und ADO ist das Microsoft Developer Network. ADO wurde ebenfalls von Microsoft entwickelt. das ermöglicht. Das vorliegende Handbuch enthält einige zusätzliche Hinweise. über Programme und OLE DBSystemschnittstellen auf eine große Anzahl von Datenquellen zuzugreifen. die OLE DBund ADO-Anwendungen für Adaptive Server Anywhere bereitstellen. die von Microsoft entwickelt wurden und Anwendungen einen gleichförmigen Zugriff auf Daten bieten. Die meisten Entwickler. Adaptive Server Anywhere umfasst einen OLE DB-Provider für OLE DBund ADO-Programmierer. die sich an Entwickler richten. die in unterschiedlichen Informationsquellen gespeichert sind.und ADOProgrammierschnittstellen" auf Seite 371 3 . tun dies in dem sie die ADO API einsetzen und nicht direkt die OLE DB API. wie sie für die gemeinsame Nutzung des Datenspeichers erforderlich sind. zusätzliche Datenbankdienste zu implementieren. ADO ist ein Objektmodell.Kapitel 1 Überblick über die Programmierschnittstelle Die Programmierschnittstelle OLE DB OLE DB ist eine Gruppe von Component Object Model-Schnittstellen (COM). und darüber hinaus die Möglichkeit bieten.

4 . Embedded SQL kann auf andere Datenbanken und andere Umgebungen portiert werden und ist in allen Betriebsumgebungen funktional äquivalent. $ Embedded SQL wird unter "Programmieren mit Embedded SQL" auf Seite 181 beschrieben.oder C++-Quelldatei eingebettet sind. Embedded SQL ist ein ISO/ANSI. wenn auch eine gewisse Eingewöhnung erforderlich ist. in dem SQL-Befehle direkt in eine C. Die Arbeit mit Embedded SQL ist einfach und geradlinig.Die Embedded SQL-Programmierschnittstelle Die Embedded SQL-Programmierschnittstelle Embedded SQL ist ein System. Embedded SQL Anweisungen (und nicht Funktionsaufrufe) in einem C-Programmcode zu verwenden. Sie stellt alle im Produkt verfügbaren Funktionen bereit.und IBM-Standard. Ein Präprozessor übersetzt diese Anweisungen in Aufrufe einer Laufzeitbibliothek.

Der Treiber wurde von Sun Microsystems entwickelt und bietet JavaProgrammierern eine einheitliche Schnittstelle zu einer Vielzahl von relationalen Datenbanken.Kapitel 1 Überblick über die Programmierschnittstelle Die JDBC-Programmierschnittstelle JDBC ist eine Schnittstelle auf Aufrufebene für Java-Anwendungen. sowie eine gemeinsame Basis. Eine Beschreibung des JDBC-Treibers entnehmen Sie dem Kapitel "Datenzugriff über JDBC" auf Seite 143. Hinweise zur Auswahl eines Treibers finden Sie unter "JDBCTreiber wählen" auf Seite 145. Aus diesem Grund wird JDBC als Teil von Java in der Datenbankdokumentation dokumentiert. um Java-Daten in der Datenbank abzurufen. 5 . $ JDBC wird in diesem Handbuch nicht beschrieben. JDBC ist jetzt ein Standardbestandteil von Java und wurde in den JDK aufgenommen. SQL Anywhere enthält einen einen reinen Java-JDBC-Treiber namens Sybase jConnect an. auf der Tools und Schnittstellen auf höherer Ebene aufgebaut werden können. Beide werden im Abschnitt "Datenzugriff über JDBC" auf Seite 143 beschrieben. Zusätzlich zum Einsatz von JDBC als clientseitige Anwendungsprogrammierschnittstelle können Sie JDBC innerhalb des Datenbankservers verwenden. Dieser enthält außerdem einen JDBC-ODBC-Brücke.

wenn Ihnen die Kompatibilität von Adaptive Server Enterprise wichtig ist oder wenn Sie andere Sybase-Produkte verwenden. DB-Bibliothek ist dokumentiert im Open Client DB-Library/C Reference Manual. Die Open Client DB-Library bietet Unterstützung für ältere Open Client Anwendungen und ist eine von der Client-Library vollständig getrennte Programmierschnittstelle. Die Open Client-Architektur Das Konzept "Open Client" kann man sich als System mit zwei Komponenten vorstellen: Programmierschnittstellen und Netzwerkdiensten. Dieses Produkt kann separat erworben werden. 6 . die die Open Client-Schnittstelle benötigen.als auch Server-LibraryAnwendungen bereitstellt. Client-Library-Anwendungen können auch Routinen der Bulk-Library benutzen. $ Weitere Hinweise über die Open Client-Schnittstelle finden Sie unter "Adaptive Server Anywhere als Open Server" auf Seite 117 der Dokumentation ASA Datenbankadministration. Einsatzbereich des Open Clients Der Einsatz der Open Client-Schnittstelle ist zu überlegen. das zum Lieferumfang des Produkts Sybase Open Client gehört. $ Eine Beschreibung der Open Client-Schnittstelle entnehmen Sie dem Abschnitt "Die Open Client-Schnittstelle" auf Seite 389. Die CS-Library und die Bulk-Library sind in Sybase Open Client enthalten. um die HochgeschwindigkeitsDatenübertragung zu erleichtern.Die Open Client-Programmierschnittstelle Die Open Client-Programmierschnittstelle Sybase Open Client bietet Kundenanwendungen. Produkten von Drittanbietern und anderen Sybase-Produkten die erforderlichen Schnittstellen zur Kommunikation mit dem Adaptive Server Anywhere und anderen Open Servern. Client-Library und DB-Library Open Client bietet zwei Kern-Programmierschnittstellen für das Schreiben von Clientanwendungen: DB-Library und Client-Library. die Routinen sowohl für den Einsatz in Client-Library. Client-Library-Programme sind auch von der CS-Library abhängig. zum Beispiel Replication Server.

oder durch die Kompilierung und Verknüpfung Ihrer Programme. $ Hinweise zum Aufbau von Client-Library-Programmen finden Sie in der Dokumentation Open Client/Server Programmer’s Supplement. die die Unterstützung für bestimmte Netzwerkprotokolle wie TCP/IP und DECnet bereithält. 7 . Je nach Ihrer Hostplattform wird der Net-LibraryTreiber entweder durch die Konfiguration der Sybase-Produkte des Systems bestimmt. Die Net-Library-Schnittstelle ist für Anwendungsprogrammierer unsichtbar.Kapitel 1 Überblick über die Programmierschnittstelle Netzwerkdienste Open Client-Netzwerkdienste enthalten die Sybase Net-Library. $ Hinweise zur Treiberkonfiguration finden Sie in der Dokumentation Open Client/Server Configuration Guide. Auf manchen Plattformen benötigt eine Anwendung unter Umständen einen anderen Net-Library-Treiber für unterschiedliche SystemNetzwerkkonfigurationen.

Die Open Client-Programmierschnittstelle 8 .

Das Kapitel ist keine detaillierte Anweisung für die Programmierung mit einer bestimmten Schnittstelle. die für die meisten oder alle Schnittstellen gelten. von der Datenbank-Schnittstelle und von der Programmiersprache ab.K A P I T E L 2 SQL in Anwendungen verwenden Über dieses Kapitel Viele Aspekte der Entwicklung von Datenbankanwendungen hängen vom Entwicklungstool. Außerdem enthält das Kapitel Verweise auf weiterführende Informationen. Inhalt Thema SQL-Anweisungen in Anwendungen ausführen Anweisungen vorbereiten Der Cursor Mit Cursorn arbeiten Cursortypen auswählen Adaptive Server Anywhere-Cursor Ergebnismengen beschreiben Transaktionen in Anwendungen steuern Seite 10 12 15 20 26 30 47 49 9 . Einige Probleme und Grundsätze sind jedoch allgemein gültig und wirken sich auf mehrere Aspekte der Entwicklung von Datenbankanwendungen aus. In diesem Kapitel werden einige Grundsätze und Techniken beschrieben.

Schnittstelle verwenden. "DELETE FROM employee WHERE emp_id = 105". hängt vom Entwicklungstool und der Programmierschnittstelle ab. SQL_NTS ). ♦ Embedded SQL Wenn Sie Embedded SQL verwenden. Der Code wird dann im Präprozessor verarbeitet. Zum Beispiel: EXEC SQL EXECUTE IMMEDIATE ’DELETE FROM employee WHERE emp_id = 105’. erscheinen Ihre SQL-Anweisungen in Funktionsaufrufen. Beispiel: Der folgende C-Funktionsaufruf führt eine DELETEAnweisung aus: SQLExecDirect( stmt. erscheinen Ihre SQL-Anweisungen in Funktionsaufrufen. ♦ ODBC Wenn Sie direkt in die ODBC-Programmierschnittstelle schreiben. bevor er kompiliert wird. Die folgenden beiden Aufrufe führen zum Beispiel eine DELETEAnweisung aus: ret = ct_command(cmd.executeUpdate( "DELETE FROM employee WHERE emp_id = 105" ). 10 . "DELETE FROM employee WHERE emp_id=105" CS_NULLTERM. ret = ct_send(cmd). indem Sie Methoden des Statement-Objekts aufrufen. ♦ Anwendungs-Entwicklungstools Anwendungs-Entwicklungstools wie die Mitglieder der Sybase Enterprise-Familie bieten ihre eigenen SQLObjekte. CS_UNUSED). ♦ Sybase Open Client Wenn Sie die Sybase Open Client. können Sie SQL-Anweisungen ausführen. die Sie verwenden. ♦ JDBC Wenn Sie die JDBC-Programmierschnittstelle verwenden. Zum Beispiel: stmt. die entweder ODBC (PowerBuilder) oder JDBC (Power J) verwenden. erhalten die SQL-Anweisungen der C-Sprachen das Schlüsselwort EXEC SQL als Präfix.SQL-Anweisungen in Anwendungen ausführen SQL-Anweisungen in Anwendungen ausführen Wie Sie SQL-Anweisungen in Ihre Anwendung einbauen. CS_LANG_CMD.

11 . Weitere Hinweise zur Arbeit mit JDBC finden Sie unter "Datenzugriff über JDBC" auf Seite 143. Gespeicherte Prozeduren benutzen Anweisungen. In diesem Kapitel werden einige Aspekte von JDBC beschrieben.Kapitel 2 SQL in Anwendungen verwenden $ Genauere Hinweise zur Aufnahme von SQL-Anweisungen in Ihre Anwendungen finden Sie in der Dokumentation Ihres Entwicklungstools. $ Weitere Hinweise zu gespeicherten Prozeduren und Triggern finden Sie unter "Prozeduren. die im Server laufen. Wenn Sie ODBC oder JDBC verwenden. Trigger und Anweisungsfolgen verwenden" auf Seite 565 der Dokumentation ASA SQL-Benutzerhandbuch. Sie können viele der hier beschriebenen Techniken auch in gespeicherten Prozeduren verwenden. $ Eine genaue Beschreibung der Programmierung mit Embedded SQL finden Sie unter "Programmieren mit Embedded SQL" auf Seite 181. finden Sie weitere Hinweise im Software Development Kit für diese Schnittstellen. die Embedded SQL sehr ähnlich sind. Java-Klassen in der Datenbank können die JDBC-Schnittstelle genauso benutzen wie Java-Anwendungen dies außerhalb des Servers tun. Anwendungen im Server Auf vielerlei Weise funktionieren gespeicherte Prozeduren und Trigger als Anwendungen oder Teile von Anwendungen.

wenn eine Anweisung an eine Datenbank geschickt wird. Der Einsatz von vorbereiteten Anweisungen ist besonders dann nützlich. Die Anweisung braucht nicht jedes Mal vorbereitet zu werden. bieten einige Datenbank-Programmierschnittstellen eine Möglichkeit zur Verwendung von vorbereiteten Anweisungen. muss der Server die Anweisung zunächst vorbereiten. Wiederholtes Ausführen der vorbereiteten Anweisung In diesem Schritt liefern Sie Werte. die eine Reihe von Platzhaltern enthält. 12 . wie etwa das Einfügen von vielen Zeilen. kommt es zu bedeutenden und unnötigen Overheads durch die wiederholte Vorbereitung der Anweisung. Ausführung der Anweisung. ob in der Abfrage genannte Spalten existieren. die für die vorbereitete Anweisung in Beschlag genommen wurden. wenn viele ähnliche Aktionen ausgeführt werden. Um dies zu vermeiden. Prüfung. Optimierer für Abfragen veranlassen. etwa das Einfügen von mehreren Zeilen in eine Tabelle. Einige Programmierschnittstellen verarbeiten diesen Schritt automatisch. z.B. Prüfung der Richtigkeit aller Referenzen auf Datenbankobjekte. Eine vorbereitete Anweisung ist eine Anweisung. nachdem alle diese Schritte durchgeführt wurden. wenn die Anweisung ausgeführt wird. die jedes Mal benutzt werden sollen.Anweisungen vorbereiten Anweisungen vorbereiten Jedes Mal. einen Zugriffsplan zu erstellen. falls die Anweisung Joins oder Unterabfragen umfasst. Wenn Sie die Anweisung ausführen wollen. Im Allgemeinen erfordern vorbereitete Anweisungen die folgenden Schritte: 1 2 Anweisung vorbereiten In diesem Schritt versehen Sie die Anweisung im Allgemeinen mit einigen Platzhalter-Zeichen anstelle von Werten. müssen Sie den Platzhaltern nur Werte zuweisen. Wenn Sie dieselbe Anweisung immer wieder verwenden. 3 Anweisung löschen In diesem Schritt geben Sie die Ressourcen frei. Zur Vorbereitung können folgende Schritte gehören: ♦ ♦ ♦ ♦ Die Wiederverwendung von vorbereiteten Anweisungen kann die Performance verbessern Syntaktische Analyse der Anweisung und Umwandlung in eine interne Form. anstatt die gesamte Anweisung erneut vorzubereiten.

und außerdem werden dadurch unnötig komplizierte Schritte in die Anwendung eingefügt. Weisen Sie den Bindungsparametern in der Anweisung Werte zu. Weisen Sie den Parametern in der Anweisung Werte zu. Setzen Sie Bindungsparameter. So verwenden Sie vorbereitete Anweisungen In diesem Abschnitt wird ein kurzer Überblick über die Verwendung von vorbereiteten Anweisungen gegeben. wenn Sie fertig sind. da der Abfalldatenmechanismus von JDBC dies erledigt. Bei getrennter Vorbereitung und Durchführung kommt es zu leichten Einbußen bei der Performance. Führen Sie die Anweisung mit dem Befehl EXE SQL EXECUTE aus. um Werte in der Anweisung zu halten. die nur einmal verwendet werden. $ Hinweise zu Cursorn finden Sie unter "Der Cursor" auf Seite 15. aber die Details unterscheiden sich je nach Schnittstelle. Löschen Sie die Anweisung. Wiederholen Sie nötigenfalls Schritte 3 und 4. v So verwenden Sie eine vorbereitete Anweisung (generisch): 1 2 3 4 5 6 Bereiten Sie die Anweisung vor. wenn sie nur einmal ausgeführt werden sollen. um sie mit einem Cursor zu verbinden. die benutzt werden. Bei manchen Schnittstellen müssen Sie allerdings eine Anweisung vorbereiten. Im Allgemeinen sollten Sie Anweisungen nicht vorbereiten. 13 .Kapitel 2 SQL in Anwendungen verwenden Bereiten Sie keine Anweisungen vor. Die allgemeine Vorgehensweise ist identisch. Jede Programmierschnittstelle des Adaptive Server Anywhere bietet eine Methode für die Verwendung von vorbereiteten Anweisungen. v So verwenden Sie eine vorbereitete Anweisung (Embedded SQL): 1 2 3 Bereiten Sie die Anweisung mit dem Befehl EXEC SQL PREPARE vor. Führen Sie die Anweisung aus. Dieser Schritt ist in JDBC nicht erforderlich. Die Aufrufe für die Vorbereitung und Ausführung von Anweisungen sind nicht Teil der SQL und unterscheiden sich daher je nach verwendeter Schnittstelle. Ein Vergleich der Verwendung von vorbereiteten Anweisungen in den einzelnen Schnittstellen kann diesen Punkt vielleicht klarer darstellen.

Weitere Hinweise über die Verwendung von vorbereiteten Anweisungen in Open Client finden Sie unter "SQL in Open Client-Anwendungen verwenden" auf Seite 394. 2 3 $ Weitere Hinweise zur Verwendung von vorbereiteten Anweisungen in JDBC finden Sie unter "Vorbereitete Anweisungen für effizienteren Zugriff verwenden" auf Seite 171. Binden Sie die Anweisungsparameter mit SQLBindParameter. Für Einfügungen. Daraus wird ein PreparedStatement-Objekt erzeugt. Hier ist Type der Datentyp. Löschen Sie die Anweisung mit SQLFreeStmt. Setzen Sie die Anweisungsparameter ct_param. Aktualisierungen und Löschungen ist dies die Methode executeUpdate. $ Weitere Hinweise finden Sie unter "Vorbereitete Anweisungen ausführen" auf Seite 297 und in der Dokumentation zum ODBC SDK. indem Sie ct_dynamic mit einem CS_DEALLOC-Typparameter verwenden. Führen Sie die Anweisung mit SQLExecute aus.Anweisungen vorbereiten 4 Geben Sie die mit der Anweisung verbundenen Ressourcen frei. Geben Sie die mit der Anweisung verbundenen Ressourcen frei. der zugewiesen wird. indem Sie den Befehl EXEC SQL DROP benutzen. Führen Sie die Anweisung mit ct_dynamic mit CS_EXECUTE als Typparameter aus. v So verwenden Sie eine vorbereitete Anweisung (Open Client): 1 2 3 4 Bereiten Sie die Anweisung mit der Funktion ct_dynamic mit CS_PREPARE als type-Parameter vor. Führen Sie die Anweisung mit der geeigneten Methode für das PreparedStatement-Objekt aus. v So verwenden Sie eine vorbereitete Anweisung (JDBC): 1 Bereiten Sie die Anweisung mit der Methode prepareStatement des Verbindungsobjekts vor. 14 . v So verwenden Sie eine vorbereitete Anweisung (ODBC): 1 2 3 4 Bereiten Sie die Anweisung mit SQLPrepare vor. Setzen Sie die Anweisungsparameter mit den entsprechenden setTypeMethoden des PreparedStatement-Objekts.

und Rückwärts-Bewegungen durch die Abfrageergebnisse. wie viele Zeilen die Anwendung empfangen wird. Wie Sie Cursor einsetzen. In Adaptive Server Anywhere unterstützen Cursor Vorwärts. was beträchtliche Performance-Vorteile für Ihre Anwendung bietet. Sie können mit einem Cursor folgende Aufgaben innerhalb einer Programmierschnittstelle durchführen: ♦ ♦ Die Ergebnisse einer Abfrage mittels Schleifen bearbeiten. wie Ergebnismengen an Ihre Anwendung zurückgegeben werden. Aktualisierungen und Löschungen auf den darunterliegenden Daten an einem beliebigen Punkt in einer Ergebnismenge durchführen Zusätzlich ermöglichen Ihnen einige Programmierschnittstellen die Verwendung von Sonderfunktionen. 15 . Zu jedem Zeitpunkt hat der Cursor eine genau definierte Position innerhalb der Ergebnismenge. Mit einem Cursor können Sie die Daten zeilenweise untersuchen und gegebenenfalls bearbeiten. Im Allgemeinen wissen Sie nicht. Die Ergebnismenge erhalten Sie durch eine SELECT-Anweisung oder den Aufruf einer gespeicherten Prozedur. um die Art zu optimieren. Mit einem Cursor können Sie Ergebnismengen von Abfragen in Anwendungen verarbeiten. die Sie benutzen. Ein Cursor ist ein Handle auf der Ergebnismenge. JDBC 1. Cursorpositionen Cursor können an den folgenden Stellen positioniert werden: ♦ Vor der ersten Zeile der Ergebnismenge. Was sind Cursor? Ein Cursor ist ein Name. besteht die Ergebnismenge aus einer Reihe von Zeilen.Kapitel 2 SQL in Anwendungen verwenden Der Cursor Wenn Sie eine Abfrage in einer Anwendung ausführen. während ODBC und Embedded SQL über viele unterschiedliche Cursorarten verfügen. hängt von der Programmierschnittstelle ab. Mit einem Cursor in Open Client kann man sich in einer Ergebnismenge nur vorwärts bewegen. bevor die Abfrage ausgeführt worden ist. $ Weitere Hinweise zur den verfügbaren Cursorarten in den einzelnen Programmierschnittstellen finden Sie unter "Cursorverfügbarkeit" auf Seite 26. und welche Cursorarten verfügbar sind. Einfügungen.0 bietet nur eine Basisverarbeitung von Ergebnismengen. der einer Ergebnismenge zugeordnet ist.

Vorteile der Cursorbenutzung Sie müssen nicht unbedingt Cursor in Datenbankanwendungen verwenden. Nach der letzten Zeile der Ergebnismenge. 16 . Diese Vorteile beruhen darauf. Cursorposition und Ergebnismenge werden im Datenbankserver aufrechterhalten. wenn Sie keine Cursor verwenden: ♦ Clientseitiger Speicher Bei umfangreichen Ergebnismengen kann das Halten der gesamten Ergebnismenge auf dem Client zu zusätzlichem Speicherbedarf führen. Dem Client muss nicht die gesamte Ergebnismenge übermittelt werden. dass die gesamte Ergebnismenge an den Client zur Ansicht und Verarbeitung übermittelt werden muss. Zeilen werden vom Client zur Anzeige oder Verarbeitung einzeln oder in Gruppen abgerufen.Der Cursor ♦ ♦ Auf einer Zeile in der Ergebnismenge. aber ihr Einsatz bietet eine Reihe von Vorteilen.

Cursor verwenden üblicherweise einen Anweisungs-Handle statt einer Zeichenfolge. 2 Deklarieren Sie den Cursor. auf die er sich bezieht.Kapitel 2 SQL in Anwendungen verwenden ♦ Antwortzeit Cursor können die ersten Zeilen liefern. Wenn Sie einen Cursor deklarieren. Corsor sind wie Zeiger auf die darunter liegenden Daten und geben dadurch entsprechende Parallelitätsbeschränkungen für die durchgeführten Änderungen vor. bevor die gesamte Ergebnismenge zusammengestellt wird. ♦ Parallelitätskontrolle Wenn Sie Ihre Daten aktualisieren und keine Cursor in Ihrer Anwendung verwenden. bevor eine Zeile von Ihrer Anwendung angezeigt werden kann. damit ein Handle verfügbar ist. $ Weitere Hinweise finden Sie unter "OPEN-Anweisung [ESQL] [GP]" auf Seite 523 der Dokumentation ASA SQL-Referenzhandbuch. falls sich die Ergebnismenge seit der Abfrage durch den Client geändert hat. v So verwenden Sie einen Cursor (Embedded SQL): 1 Bereiten Sie eine Anweisung vor. muss die gesamte Ergebnismenge übermittelt werden. Wenn Sie keine Cursor verwenden. $ Weitere Hinweise finden Sie unter "DECLARE CURSORAnweisung [ESQL] [GP]" auf Seite 412 der Dokumentation ASA SQLReferenzhandbuch. Das wiederum kann möglicherweise zu Aktualisierungsverlusten führen. 17 . Schritte der Cursorbenutzung Die Verwendung eines Cursors in Embedded SQL unterscheidet sich von der Verwendung eines Cursors in anderen Schnittstellen. $ Hinweise über das Vorbereiten einer Anweisung finden Sie unter "Anweisungen vorbereiten" auf Seite 12.oder CALLAnweisung. Sie müssen eine Anweisung vorbereiten. müssen Sie separate SQLAnweisungen an den Datenbankserver senden. geben Sie den Namen des Cursors und die Anweisung an. 3 Öffnen Sie den Cursor. Jeder Cursor bezieht sich auf eine einzelne SELECT. Dadurch können Probleme mit der Parallelität entstehen. um die Änderungen anzuwenden.

schließen Sie ihn. JDBC. Sie können die Anweisung vorbereiten und dann ausführen. 18 . Um den Speicher freizugeben. die eine Ergebnismenge erstellt. v So verwenden Sie einen Cursor (ODBC. 2 Überprüfen Sie. Die verfügbaren Abruf-Operationen hängen davon ab. $ Weitere Informationen finden Sie unter "DROP STATEMENTAnweisung [ESQL]" auf Seite 439 der Dokumentation ASA SQLReferenzhandbuch. ermöglicht Adaptive Server Anywhere auch kompliziertere Bewegungen in der Ergebnismenge. Obwohl eine einfache Abruf-Operation den Cursor in die nächste Zeile der Ergebnismenge bewegt. an dem die erste Zeile bezogen werden kann. ob die Anweisung eine Ergebnismenge zurückgibt. wie Sie den Cursor deklarieren. 4 Rufen Sie die Ergebnisse ab. 6 Löschen Sie die Anweisung. 3 Rufen Sie die Ergebnisse ab. oder die Anweisung direkt ausführen.Der Cursor Bei der CALL-Anweisung wird durch das Öffnen des Cursors die Abfrage bis zu dem Punkt ausgeführt. ermöglicht Adaptive Server Anywhere auch kompliziertere Bewegungen in der Ergebnismenge. Ein Cursor wird implizit geöffnet. $ Weitere Hinweise finden Sie unter "CLOSE-Anweisung [ESQL] [GP]" auf Seite 285 der Dokumentation ASA SQL-Referenzhandbuch. Das löst etwaige Sperren auf den darunterliegenden Daten. wenn eine Anweisung ausgeführt wird. $ Weitere Hinweise finden Sie unter "FETCH-Anweisung [ESQL] [GP]" auf Seite 458 der Dokumentation ASA SQL-Referenzhandbuch und "Daten abrufen" auf Seite 214. Obwohl eine einfache Abruf-Operation den Cursor in die nächste Zeile der Ergebnismenge bewegt. Open Client): 1 Bereiten Sie eine Anweisung vor und führen Sie sie aus: Führen Sie eine Anweisung mit der normalen Methode für die Schnittstelle aus. müssen Sie die Anweisung freigeben. 5 Schließen Sie den Cursor Wenn Sie die Arbeit mit dem Cursor abgeschlossen haben. Beim Öffnen eines Cursors wird er vor die erste Zeile der Ergebnismenge gesetzt. der mit dem Cursor und der ihm zugeordneten Anweisung verbunden war.

schließen Sie ihn. geben Sie sie frei.B. Wenn Sie eine vorbereitete Anweisung verwendet haben. sodass diese Schritte in der Clientanwendung möglicherweise nicht den Vorgängen in der Software entsprechen. damit die ihm zugewiesenen Ressourcen freigegeben werden. Prefetch von Zeilen In manchen Fällen kann die Interface-Bibliothek PerformanceOptimierungen im Hintergrund durchführen (z. 19 .Kapitel 2 SQL in Anwendungen verwenden 4 Schließen Sie den Cursor Wenn Sie die Arbeit mit dem Cursor abgeschlossen haben. 5 Geben Sie die Anweisung frei. um den benutzten Speicher wieder verfügbar zu machen. Prefetch von Ergebnissen).

Ist der Cursor vor der ersten Zeile oder nach der letzten Zeile positioniert. Sie können spezielle positionsbasierte Aktualisierungs. ist er vor der ersten Zeile positioniert. um die Zeile an der aktuellen Cursorposition zu aktualisieren oder zu löschen.oder Löschungsoperationen verwenden. wobei es sich um die größtmögliche Ganzzahl minus 1 handelt. Die Anzahl der Zeilenpositionen. Mit einem FetchVorgang können Sie Zeilen bis zu Nummer 2147483646 abrufen. wie bestimmte Cursorvorgänge ausgeführt werden. können Sie FetchVorgänge nach unten bis zum kleinsten negativen Wert. Sie können den Cursor an eine absolute Position in Verhältnis zum Anfang oder zum Ende der Abfrageergebnisse positionieren oder ihn relativ zur aktuellen Cursor-Position verschieben. die Sie mit einem Fetch-Vorgang abrufen können. wird der Fehler No current row of cursor zurückgeben. 20 . Cursor positionieren Wird ein Cursor geöffnet. Wie Sie im Einzelnen den Cursor verschieben und welche Operationen möglich sind. wird durch die Größe einer Ganzzahl bestimmt. Wenn Sie negative Werte verwenden (Zeilen in Bezug auf das Ende). plus 1 ausführen.Mit Cursorn arbeiten Mit Cursorn arbeiten In diesem Abschnitt wird beschrieben. der in einer Ganzzahl möglich ist. hängt von der Programmierschnittstelle ab.

Adaptive Server Anywhere platziert eingefügte Zeilen an unvorhersehbaren Positionen innerhalb eines Cursors. bis die Verbindung beendet wird oder bis Sie ihn explizit schließen. wenn eine Arbeitstabelle erstellt werden musste. Die UPDATE-Anweisung kann bewirken. bis der Cursor geschlossen und wieder geöffnet wurde. JDBC und Open Client lassen Cursor beim Ende von Transaktionen standardmäßig geöffnet. allerdings ist mehr Speicher und Verarbeitungsaufwand erforderlich. $ Weitere Informationen finden Sie unter "ISOLATION_LEVELOption" auf Seite 637 der Dokumentation ASA Datenbankadministration. ♦ Offen halten Standardmäßig werden Cursor in Embedded SQL am Ende einer Transaktion geschlossen. dass sie von der aktuellen Isolationsstufe der Transaktion verschieden sind. wenn der Cursor eine ORDER BY-Klausel hat. können Sie ihn offen halten. Mit der Verwendung eines statisch abrollenden Cursors werden diese Probleme vermieden. In einigen Fällen erscheint die eingefügte Zeile überhaupt nicht.Kapitel 2 SQL in Anwendungen verwenden Probleme mit der Cursorpositionierung Einfügungen und manche Aktualisierungsvorgänge mit nichtempfindlichen Cursorn können Probleme mit der Positionierung von Cursorn verursachen. dass sich eine Zeile im Cursor verschiebt. Bei Adaptive Server Anywhere passiert dies. wenn Sie einen Cursor öffnen: ♦ Isolationsstufe Sie können die Isolationsstufen der Vorgänge für einen Cursor explizit so setzen. Cursor beim Öffnen konfigurieren Sie können die folgenden Aspekte des Cursorverhaltens konfigurieren. die einen vorhandenen Index benutzt (es wird keine Arbeitstabelle erstellt). Wenn Sie einen Cursor mit der WITH HOLD-Option öffnen. Das passiert. 21 . ODBC. Dazu stellen Sie die ISOLATION_LEVEL-Option ein. falls die SELECT-Anweisung keine ORDER BY-Klausel hat. um den Cursor zu öffnen (unter "Arbeitstabellen in der Abfrageverarbeitung verwenden" auf Seite 178 der Dokumentation ASA SQL-Benutzerhandbuch finden Sie eine diesbezügliche Beschreibung).

welche Schnittstelle Sie verwenden. ist eine Schleife zum Absuchen aller Zeilen in der Ergebnismenge. eine Ergebnismenge aus einer Abfrage mit einem Cursor zu verarbeiten. die eine Ergebnismenge zurückgibt (ODBC.Mit Cursorn arbeiten Zeilen durch einen Cursor abrufen Die einfachste Art. JDBC. $ Weitere Hinweise über die Verwendung von Cursorn in Embedded SQL finden Sie unter "Cursor in Embedded SQL verwenden" auf Seite 215. oder führen Sie eine Anweisung aus. v So führen Sie einen Schleifendurchlauf auf Zeilen einer Ergebnismenge durch: 1 Deklarieren und öffnen Sie den Cursor (Embedded SQL). Zum Beispiel: ♦ ODBC SQLFetch. ♦ JDBC Die next-Methode des ResultSet-Objekts bewegt den Cursor weiter und gibt die Daten zurück. Open Client). Setzen Sie die Fetch-Vorgänge für die nächste Zeile fort. $ Weitere Hinweise zur Verwendung eines Cursors in ODBC finden Sie unter "Mit Ergebnismengen arbeiten" auf Seite 299. $ Weitere Hinweise zur Verwendung des ResultSet-Objekts in JDBC finden Sie unter "Abfragen mit JDBC" auf Seite 169. Mehrere Zeilen abrufen In diesem Abschnitt wird besprochen. ♦ Open Client Die ct_fetch-Funktion verschiebt den Cursor in die nächste Zeile und gibt die Daten zurück. ♦ Embedded SQL Die FETCH-Anweisung führt dieselbe Operation aus. 22 . $ Weitere Hinweise zur Verwendung eines Cursors in Open ClientAnwendungen finden Sie unter "Cursor verwenden" auf Seite 395. Schließen Sie den Cursor 2 3 Die Ausführung des zweiten Schrittes hängt davon ab. SQLExtendedFetch oder SQLFetchScroll verschieben den Cursor in die nächste Zeile und geben die Daten zurück. wie Sie mehrere Zeilen mit einem Fetch-Vorgang abrufen können. bis der Fehler Zeile nicht gefunden (Row Not Found) erscheint. bis keine Zeilen mehr vorhanden sind.

Diese Methoden ermöglichen das gleichzeitige Vorwärtsbewegen oder Rückwärtsbewegen über mehrere Zeilen in einer Ergebnismenge. Sie verwenden Prefetch-Vorgänge. um die Anzahl der Zeilen zu steuern. indem Sie das Attribut SQL_ROWSET_SIZE setzen. während ein Vorab-Abrufen für die Anwendung nicht erkennbar ist und eine ähnliche Performance-Steigerung bietet. Open Client und JDBC unterstützen mehrzeilige Fetch-Vorgänge nicht.Kapitel 2 SQL in Anwendungen verwenden Der mehrzeilige Abruf darf nicht mit dem Vorab-Abrufen von Zeilen verwechselt werden. Ein Cursor. der MehrzeilenAbrufe ausführt. In Embedded SQL verwendet die FETCH-Anweisung eine ARRAYKlausel. wird auch ein weiter Abruf genannt. Mehrzeilen-FetchVorgänge Einige Schnittstellen bieten Methoden zum gleichzeitigen Abrufen mehrerer Zeilen in die nächsten Felder eines Rasters. Mehrzeilen-FetchVorgänge verwenden ♦ ♦ Fetch mit abrollendem Cursor ODBC und Embedded SQL bieten Methoden für den Einsatz abrollender beziehungsweise dynamisch abrollender Cursortypen. Eine modifizierte FETCH-Anweisung. 23 . und desto besser wird die Performance. Prefetch-Vorgänge sind auf Vorgänge mit einem abrollenden Cursor nicht anwendbar. Die JDBC. ♦ In ODBC können Sie die Anzahl der Zeilen einstellen. die mehrere Zeilen abruft. desto weniger einzelne Anforderungen muss der Server bewältigen. Mehrzeilen-Abrufe werden von der Anwendung durchgeführt. die durch einen FetchVorgang gleichzeitig abgerufen werden. die bei jedem Aufruf von SQLFetchScroll oder SQLExtendedFetch zurückgegeben werden. Zum Beispiel werden beim Abrufen einer Zeile in entgegengesetzter Richtung nicht mehrere vorherige Zeilen abgerufen. was im nächsten Abschnitt beschrieben wird. Im Allgemeinen gilt: Je weniger getrennte Fetch-Vorgänge Sie ausführen.und Open Client-Schnittstellen unterstützen keine abrollenden Cursor. wird manchmal auch als Block-Cursor (Blockcursor) oder fat cursor (Fetter Cursor) bezeichnet.

werden in den Basistabellen keine Änderungen durchgeführt. 24 . JDBC 1. Nur die aktuelle Zeile der angegebenen Tabelle wird gelöscht.Mit Cursorn arbeiten Zeilen mit einen Cursor ändern Cursor können mehr als nur Ergebnisse aus einer Abfrage lesen. Wenn der Cursor für eine Join-Abfrage (einschließlich zum Benutzen einer Ansicht mit enthaltenem Join) gesetzt ist. 4 5 Wenn ein Korrelationsname existiert. aus welcher Tabelle Sie löschen wollen oder welche Spalten Sie aktualisieren wollen. Mit dem Open Client können Sie Zeilen löschen und aktualisieren. Embedded SQL und Open Client ermöglichen die Datenänderung mit einem Cursor. Sie können auch Daten in der Datenbank verändern. muss der Cursor nur für eine Tabelle gesetzt sein. ist der Tabellenangabewert der erste. Einfügungen durch einen Cursor können nur durchgeführt werden. muss der Tabellenangabewert eindeutig als Tabellenname im Cursor identifizierbar sein. Nicht alle Abfrage-Ergebnismengen ermöglichen positionsbasiertes Aktualisieren oder Löschen. Die anderen Tabellen des Joins sind nicht betroffen. Diese Vorgänge werden im Allgemeinen als positionsbasierte oder positionierte Aktualisierungs. wird die Tabelle. ist der Tabellenangabename mit dem Korrelationsnamen identifiziert. der zu den Korrelationsnamen passt. aber Zeilen nur in einer EinTabellenabfrage einfügen. müssen Sie angeben. Auch wenn die Abfrage einen Join enthält. aus der Zeilen gelöscht werden. wie folgt festgelegt: 1 2 Wenn keine FROM-Klausel in der DELETE-Anweisung eingeschlossen ist. während Sie einen Cursor verarbeiten. muss die FROM-Klausel verwendet werden. Aus welcher Tabelle werden Zeilen gelöscht? Wenn Sie ein positionsbasiertes Löschen durch einen Cursor versuchen. ODBC. wenn nicht eingefügte Spalten in der Tabelle NULLWERTE zulassen oder Standardwerte haben.und Löschvorgänge oder PUT-Vorgänge (wenn es sich um ein INSERT handelt) bezeichnet.1 hingegen nicht. wenn Sie die Vorgänge ausführen. Wenn eine FROM-Klausel enthalten ist und kein Tabelleneigentümer angegeben wurde. Wenn ein Korrelationsname nicht vorhanden ist. Wenn Sie eine Abfrage in einer nicht aktualisierbaren Ansicht ausführen. 3 $ Weitere Hinweise finden Sie unter "FROM-Klausel" auf Seite 467 der Dokumentation ASA SQL-Referenzhandbuch.

Wenn Sie eine Anforderung abbrechen.Kapitel 2 SQL in Anwendungen verwenden 6 Wenn eine FROM-Klausel enthalten ist und ein Tabelleneigentümer angegeben wurde. 7 Cursorvorgänge abbrechen Sie können eine Anforderung durch eine Schnittstellenfunktion abbrechen. In Interactive SQL können Sie eine Anforderung durch Klicken auf die Schaltfläche "SQL-Anweisung unterbrechen" in der Symbolleiste abbrechen (oder durch den Befehl "Stop" im SQL-Menü). muss der Tabellenangabewert als Tabellenname im Cursor eindeutig identifizierbar sein. der auf eine Ansicht geöffnet ist. die eine Cursoroperation durchführt. Die positionsbasierte DELETE-Anweisung kann für einen Cursor verwendet werden. 25 . Nach dem Abbrechen der Anforderung müssen Sie die absolute Position des Cursors ermitteln oder ihn schließen. ist die Position des Cursors unbestimmt. solange die Ansicht aktualisierbar ist.

Unterschiedliche Schnittstellenbibliotheken bieten eine unterschiedliche Auswahl von Cursortypen an. ♦ ♦ Embedded SQL unterstützt alle Cursortypen. jConnect 5.Cursortypen auswählen Cursortypen auswählen Dieser Abschnitt beschreibt Zuordnungen zwischen Adaptive Server Anywhere-Cursorn und den Optionen. Sybase Open Client unterstützt lediglich asensitive (nicht empfindliche) Cursor. die von Adaptive Server Anywhere unterstützt werden.x stellt nur asensitive (nicht empfindliche) Cursor zur Verfügung. wenn aktualisierbare. ♦ ODBC und OLE DB (ADO) unterstützen alle Cursortypen. bei abrollbaren Cursorn kommt es jedoch zu erheblichen Performance-Einbußen. Für JDBC: ♦ ♦ ♦ ♦ jConnect 4. Cursoreigenschaften Sie fordern einen Cursortyp entweder explizit oder implizit von der Programmierschnittstelle an. die Ihnen die Programmierschnittstellen bieten. Cursorverfügbarkeit Nicht alle Schnittstellen bieten Unterstützung für alle Cursortypen. nicht eindeutige Cursor benutzt werden. $ Hinweise zu Adaptive Server Anywhere-Cursorn finden Sie unter "Adaptive Server Anywhere-Cursor" auf Seite 30. Jeder Cursortyp wird duch eine Reihe von Eigenschaften definiert: 26 . $ Weitere Hinweise finden Sie unter "Mit Ergebnismengen arbeiten" auf Seite 299.x unterstützt alle Cursortypen. Außerdem kommt es zu erheblichen Performance-Einbußen. JDBC und ODBC schreiben zum Beispiel unterschiedliche Cursortypen vor. Die JDBC-ODBC-Brücke unterstützt alle Cursortypen.

Abrollfähigkeit Sie können Cursor so deklarieren. Andere können sich vorwärts und rückwärts in der Ergebnismenge bewegen. sondern durch die Empfindlichkeit der Ergebnismenge auf Änderungen in den darunter liegenden Daten. das dem Typ entspricht. wenn Sie sich durch die Ergebnismenge bewegen. Adaptive Server Anywhere stellt Ihnen Cursor mit unterschiedlichen Zusammensetzungen dieser Eigenschaften zur Verfügung. Der Standardcursortyp ist "Aktualisierbar". 27 . Abhängig vom verlangten Cursortyp liefert Adaptive Server Anywhere einen Cursor mit einem Verhalten. ♦ Empfindlichkeit Änderungen an der Datenbank können durch einen Cursor sichtbar sein. aus den weiter unten angeführten Gründen. Unempfindliche Cursor in Adaptive Server Anywhere zum Beispiel müssen schreibgeschützt sein. Wie Adaptive Server Anywhere-Cursor den in den Programmierschnittstellen festgelegten Cursorn im Einzelnen entsprechen. Manche Cursor können nur die aktuelle oder die nächste Zeile abrufen. Wenn Sie einen Corsor eines gegebenen Typs anfordern.Kapitel 2 SQL in Anwendungen verwenden ♦ Eindeutigkeit Wenn ein Cursor als eindeutig deklariert wird. wird statt dessen ein anderer Cursortyp (Wert-empfindlich) geliefert. diese Eigenschaften so gut wie möglich zuzuordnen. zwingt dies die Abfrage. müssen es aber nicht. die für die eindeutige Identifizierung der einzelnen Zeilen erforderlich sind. dass alle Spalten im Primärschlüssel zurückgegeben werden. Oft bedeutet dies. Adaptive Server Anywhere-Cursor anfordern Wenn Sie einen Cursortyp von Ihrer Clientanwendung aus anfordern. Wenn Ihre Anwendung einen aktualisierbaren unempfindlichen Cursor anfordert. versucht Adaptive Server Anywhere. dass Sie sich ♦ unterschiedlich verhalten. Alle erforderlichen. Diese Eigenschaften haben möglicherweise signifikante Auswirkungen auf Performance und Datenbankserver-Speicherzuordnung. alle Spalten zurückzugeben. aber nicht angegebenen Spalten werden der Ergebnismenge hinzugefügt. allen Eigenschaften zu entsprechen. ist das Thema der folgenden Abschnitte. liefert Adaptive Server Anywhere einen Cursor. Unter Umständen ist es nicht möglich. Der Standardcursortyp ist "Nicht eindeutig". Adaptive Server Anywhere-Cursor werden nicht durch den in der Programmierschnittstelle festgelegten Typ definiert. ♦ Aktualisierbarkeit Ein als schreibgeschützt deklarierter Corsor kann nicht für eine positionierte Aktualisierung oder Löschung verwendet werden.

wird statt dessen ein Wert-empfindlicher Cursor geliefert und eine Warnung ausgegeben. Ausnahmen Wenn Sie einen STATIC-Cursor als aktualisierbar anfordern. Embedded SQL Um einen Cursor von einer Embedded SQL-Anwendung anzufordern.oder MIXED-Cursor angefordert wird und die Abfrage nicht ohne Arbeitstabellen ausgeführt werden kann. Cursortyp NO SCROLL DYNAMIC SCROLL SCROLL INSENSITIVE SENSITIVE Adaptive Server Anywhere-Cursor Asensitiv (Nicht empfindlich) Asensitive (Nicht empfindlich) Wertempfindlich Insensitive (Unempfindlich) Sensitive (Empfindlich) 28 . Abrollbarer ODBC-Cursortyp STATIC KEYSET DYNAMIC MIXED Adaptive Server Anywhere-Cursor Insensitive (Unempfindlich) Wertempfindlich Sensitiv (Empfindlich) Wertempfindlich $ Hinweise zu Adaptive Server Anywhere-Cursorn und ihrem Verhalten finden Sie unter "Adaptive Server Anywhere-Cursor" auf Seite 30. geben Sie den Cursortyp in der DECLARE-Anweisung an. Die nachstehende Tabelle beschreibt die Cursorempfindlichkeit. die bei verschiedenen abrollbaren ODBC-Cursortypen eingestellt wird. Wenn ein DYNAMIC. die als Antwort auf unterschiedliche Anforderungen eingestellt wird. wird statt dessen ein nicht-empfindlicher Cursor geliefert und eine Warnung ausgegeben. Hinweise über das Anfordern eines Cursortyps in ODBC finden Sie unter "CursorEigenschaften wählen" auf Seite 299. ODBC und OLE DB Die nachstehende Tabelle beschreibt die Cursorempfindlichkeit.Cursortypen auswählen Die Empfindlichkeit der Adaptive Server Anywhere-Cursorn wird entsprechend der Cursortyp-Anfrage des Clients gesetzt.

die PREFETCHDatenbankoption auf OFF eingestellt ist und der Ausführungsplan der Abfrage keine Arbeitstabellen verlangt. Werte zum Identifizieren von Zeilen in einem Cursor. um einen Zeilenblock und nicht eine einzelne Zeile abzurufen. welcher der Beiden geliefert wird. Wenn Sie einen INSENSITIVE-Cursor als UPDATABLE anfordern. In JDBC können Sie eine ExecuteQuery-Anweisung ausführen. Das ist ein nicht-empfindlicher Cursor. JDBC Es steht nur ein Typ von Cursorn für JDBC-Anwendungen zur Verfügung. um einen Cursor zu öffnen.Kapitel 2 SQL in Anwendungen verwenden Ausnahmen Wenn Sie einen DYNAMIC SCROLL. Es ist nicht ausgemacht. mit Ausnahme von dynamischen Cursorn. wird ein empfindlicher oder wertempfindlicher Cursor geliefert. 29 . Wenn Sie einen solchen Block-Cursor verwenden. können Sie SQLFetchScroll oder SQLExtendedFetch benutzen. Adaptive Server Anywhere unterstützt Lesezeichen für alle Arten von Cursorn. Wieder entspricht diese Ungewissheit der Definition von nicht-empfindlichem Verhalten. wird ein wertempfindlicher Cursor geliefert. Wenn Sie einen DYNAMIC SCROLL-Cursor anfordern. Dies ist ein nicht-empfindlicher Cursor. Open Client Es steht nur ein Typ von Cursorn für JDBC-Anwendungen zur Verfügung.oder NO SCROLL-Cursor als UPDATABLE anfordern. Block-Cursor verhalten sich genauso wie Embedded SQL ARRAY-Abrufe. Lesezeichen und Cursor ODBC bietet Lesezeichen an bzw. wird möglicherweise ein empfindlicher Cursor geliefert. Diese Ungewissheit entspricht der Definition von nicht-empfindlichem Verhalten. Block-Cursor ODBC stellt einen Cursortyp namens Block-Cursor zur Verfügung.

entweder durch den Cursor selbst oder. Der Cursor bleibt eine Zeit lang geöffnet. Änderungen bei Mitgliedschaft. Dieser Abschnitt beschreibt. Nehmen Sie zum Beispiel die folgende einfache Tabelle mit Mitarbeiterdaten (emp_id ist die Primärschlüsselspalte): emp_id 1 2 3 emp_lname Whitney Cobb Chin Ein Cursor auf der folgenden Abfrage gibt alle Ergebnisse aus der Tabelle in der Reihenfolge des Primärschlüssels zurück. Wert Die Werte der Zeilen in der Ergebnismenge. die durch ihre Primärschlüsselwerte gekennzeichnet sind. Änderungen an den darunter liegenden Daten sichtbar zu machen. Während dieser Zeit kann die dem Cursor zugeordnete Ergebnismenge geändert werden. Adaptive Server Anywhere stellt Cursor mit einer Vielzahl von Empfindlichkeitseigenschaften zur Verfügung. hat er eine zugeordnete Ergebnismenge. während bei Anderen diese Änderungen nicht auszumachen sind. emp_lname FROM employee ORDER BY emp_id 30 . SELECT emp_id. Dabei wird vorausgesetzt. dass Sie mit dem Abschnitt "Was sind Cursor?" auf Seite 15 vertraut sind. durch andere Transaktionen. Reihenfolge Die Reihenfolge der Zeilen in der Ergebnismenge. Reihenfolge und Werten Änderungen an den darunter liegenden Daten können sich folgendermaßen auf die Ergebnismenge eines Cursors auswirken: ♦ ♦ ♦ Mitgliedschaft Die Menge der Zeilen in der Ergebnismenge. Manche Cursor ermöglichen es. sowie die Empfindlichkeitseigenschaften von Cursorn. was Empfindlichkeit ist. abhängig von den Anforderungen der Isolationsstufe.Adaptive Server Anywhere-Cursor Adaptive Server Anywhere-Cursor Sobald ein Cursor geöffnet ist. Das unterschiedliche Verhalten von Cursorn in Bezug auf Änderungen an den darunter liegenden Daten wird die Empfindlichkeit des Cursors genannt.

♦ Nicht-empfindliche Cursor Änderungen können in der Mitgliedschaft. ♦ Unempfindliche Cursor Die Ergebnismenge ist unveränderlich. wiedergespiegelt werden. Reihenfolge und Werte der Ergebnismenge eines Cursors geändert werden. 31 . Die Werte könnten durch eine Namensänderung in der Tabelle geändert werden. um diese Änderungen darzustellen. Alle Änderungen an den darunter liegenden Daten sind sichtbar. nachdem der Cursor geöffnet wurde. Sichtbare und unsichtbare Änderungen Abhängig von den Anforderungen der Isolationsstufe können Mitgliedschaft. Änderungen an den darunter liegenden Daten. Eine sichtbare Änderung ist eine. Überblick über die Cursor-Empfindlichkeit Adaptive Server Anywhere-Cursor werden anhand ihrer Empfindlichkeit gegenüber Änderungen an den darunter liegenden Daten eingeteilt. ob sich die Ergebnismenge. der Reihenfolge oder den Werten der Ergebnismenge. Die Reihenfolge könnte geändert werden. wie sie durch den Cursor gesehen wird. $ Weitere Hinweise finden Sie unter "Nicht-empfindliche Cursor" auf Seite 39. $ Weitere Hinweise finden Sie unter "Unempfindliche Cursor" auf Seite 36. Es hängt vom Typ des verwendeten Cursors ab. die nicht in der Ergebnismenge. die sich in der Ergebnismenge des Cursors wiederspiegelt. Änderungen an den darunter liegenden Daten sind nicht sichtbar. sind unsichtbar. Die Mitgliedschaft der Ergebnismenge ist unveränderlich. müssen es aber nicht. ♦ Wert-empfindliche Cursor Änderungen in der Reihenfolge oder den Werten der darunter liegenden Daten sind sichtbar.Kapitel 2 SQL in Anwendungen verwenden Die Mitgliedschaft der Ergebnismenge könnte durch das Hinzufügen einer neuen Zeile oder das Löschen einer Zeile geändert werden. wenn der Cursor geöffnet ist. wiedergespiegelt werden. wie sie vom Cursor gesehen wird. Im Besonderen wird die Cursor-Empfindlichkeit anhand der Sichtbarkeit von Änderungen definiert. Änderungen an den darunter liegenden Daten können durch den Cursor sichtbar oder unsichtbar sein. $ Weitere Hinweise finden Sie unter "Empfindliche Cursor" auf Seite 37. ändert. indem der Primärschlüssel eines Mitarbeiters geändert wird. wenn der Cursor geöffnet ist. wie sie von der Anwendung gesehen wird. ♦ Empfindliche Cursor Die Ergebnismenge kann sich ändern. nachdem der Cursor geöffnet wurde.

Beispiel für Cursor-Empfindlichkeit: Eine gelöschte Zeile Dieses Beispiel verwendet eine einfache Abfrage. emp_lname FROM employee ORDER BY emp_id emp_id 102 105 160 … emp_lname Whitney Cobb Breault … 2 3 4 Die Anwendung ruft die erste Zeile durch den Cursor ab (102). Es gibt die folgende Abfolge von Ereignissen: 1 Eine Anwendung öffnet einen Cursor auf der folgenden Abfrage auf der Beispieldatenbank. was sich wiederum auf die Performance auswirkt. Weitere Hinweise finden Sie unter "CursorEmpfindlichkeit und Performance" auf Seite 43.Adaptive Server Anywhere-Cursor $ Weitere Hinweise finden Sie unter "Wert-empfindliche Cursor" auf Seite 40. wiedergespiegelt: 32 . In dieser Situation hängen die Ergebnisse der Cursor-Aktionen von der Cursor-Empfindlichkeit ab. SELECT emp_id. ♦ Unempfindliche Cursor Das DELETE wird weder in der Mitgliedschaft noch in den Werten der Ergebnissen. wie verschiedene Cursor auf eine Zeile in der Ergebnismenge reagieren. um zu illustrieren. die gelöscht wird. wie sie durch den Cursor gesehen werden. Die unterschiedlichen Anforderungen an Cursor bewirken unterschiedliche Beschränkungen bei der Ausführung. Die Anwendung ruft die nächste Zeile durch den Cursor ab (105). Eine weitere Anwendung löscht Mitarbeiter 102 (Whitney) und schreibt die Änderung fest.

Kapitel 2 SQL in Anwendungen verwenden Maßnahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Ergebnis Gibt die ursprüngliche Kopie der Zeile zurück (102). Gibt die ungeänderte Zeile zurück (105). ♦ Empfindliche Cursor Die Mitgliedschaft der Ergebnismenge hat sich insofern geändert. Gibt die ursprüngliche Kopie der Zeile zurück (102). Wo vorher die erste Zeile war. dass jetzt Zeile 105 die erste Zeile in der Ergebnismenge ist: Maßnahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Ergebnis Gibt den Fehler Zeile nicht gefunden zurück. steht jetzt im Cursor eine Lücke. und daher ist Zeile 105 weiterhin die zweite Zeile in der Ergebnismenge. Es gibt keine vorherige Zeile. steht jetzt im Cursor eine Lücke. Maßnahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Ergebnis Gibt Keine aktuelle Cursorzeile zurück. Gibt Zeile 105 zurück. ♦ Wert-empfindliche Cursor Die Mitgliedschaft der Ergebnismenge ist unveränderlich. Wo vorher die erste Zeile war. Gibt Zeile 160 zurück. Gibt Zeile 105 zurück. Gibt Keine aktuelle Cursorzeile zurück. 33 . Das DELETE wird in den Werten des Cursors wiedergespiegelt und erzeugt ein tatsächliches "Loch" in der Ergebnismenge.

ob die Methode die Erstellung einer Arbeitstabelle erfordert und ob die abgerufene Zeile vom Client vorab abgerufen wurde. Der Vorteil von nicht-empfindlichen Cursorn liegt darin. Die Antwort auf einen Abruf der vorherigen Zeile. Auch wenn Sie auf einer hohen Isolationsstufe ausführen. der ersten Zeile oder der zweiten Zeile hängt von der entsprechenden Optimierungsmethode für die Abfrage ab. sind keine der darunter liegenden Änderungen sichtbar. 34 . die aktualisiert wird und dadurch die Reihenfolge in der Ergebnismenge verändert. Beispiel für Cursor-Empfindlichkeit: Eine aktualisierte Zeile Dieses Beispiel verwendet eine einfache Abfrage. SELECT emp_id. Eine weitere Transaktion aktualisiert die Mitarbeiter-ID des Mitarbeiters 102 (Whitney) auf 165 und schreibt die Änderung fest. Besonders wenn Sie einen schreibgeschützten Vorwärts-Cursor verwenden. emp_lname FROM employee emp_id 102 105 160 … emp_lname Whitney Cobb Breault … 2 3 4 Die Anwendung ruft die erste Zeile durch den Cursor ab (102). In dieser Situation hängen die Ergebnisse der Cursor-Aktionen von der Cursor-Empfindlichkeit ab. Die Anwendung ruft die nächste Zeile durch den Cursor ab (105).Adaptive Server Anywhere-Cursor ♦ Nicht-empfindliche Cursor Die Mitgliedschaft und Werte der Ergebnismenge sind in Bezug auf die Änderungen unbestimmt. um zu illustrieren wie verschiedene Cursortypen auf eine Zeile in der Ergebnismenge reagieren. Es gibt die folgende Abfolge von Ereignissen: 1 Eine Anwendung öffnet einen Cursor auf der folgenden Abfrage auf der Beispieldatenbank. sind darunter liegende Änderungen nicht zulässig. Die Antwort hängt davon ab. dass für viele Anwendungen die Empfindlichkeit unwichtig ist.

Der Cursor wird auf die Position vor der ersten Zeile verschoben. Eine Aktualisierung einer Spalte bewirkt die Warnung oder den Fehler. auch wenn die Spalte vom Cursor nicht referenziert wird. 35 . Beispiel: Ein Cursor auf einer Abfrage. Aufeinander folgende FETCH-Vorgänge für dieselbe Zeile lösen keine Warnung aus. dass jetzt Zeile 105 die erste Zeile in der Ergebnismenge ist: Maßnahme Vorherige Zeile abrufen Ergebnis Gibt den Fehler Zeile nicht gefunden zurück. Die Warnung wird nur einmal ausgegeben.oder DELETEAnweisung durch den Cursor auf einer Zeile. wie sie durch den Cursor gesehen werden.Kapitel 2 SQL in Anwendungen verwenden ♦ Unempfindliche Cursor Das UPDATE wird weder in der Mitgliedschaft noch in den Werten der Ergebnisse. Gibt die ursprüngliche Kopie der Zeile zurück (102). der emp_lname zurückgibt. Die Mitgliedschaft der Ergebnismenge hat sich geändert und 105 ist jetzt die erste Zeile. ♦ Empfindliche Cursor Die Mitgliedschaft der Ergebnismenge hat sich insofern geändert. Ähnlich gibt auch eine positionsbasierte UPDATE. auch wenn nur die Spalte salary geändert worden wäre. Gibt Zeile 160 zurück. damit UPDATE oder DELETE bei einem empfindlichen Cursor funktionieren. die Fehlermeldung SQLE_ROW_UPDATED_SINCE_READ aus. Eine Anwendung muss das Abrufen einer Zeile nochmals durchführen. wiedergespiegelt: Maßnahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Ergebnis Gibt die ursprüngliche Kopie der Zeile zurück (102). Gibt die ungeänderte Zeile zurück (105). die seit dem letzten Abruf geändert wurde. würde die Aktualisierung melden. Gibt Zeile 105 zurück. Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Außerdem wird beim Abrufen durch einen empfindlichen Cursor die Warnung SQLE_ROW_UPDATED_WARNING ausgegeben. wenn die Zeile seit dem letzten Lesen geändert wurde.

Der Cursor wird über dem Loch positioniert: Er befindet sich vor Zeile 105. Gibt den Fehler Zeile nicht gefunden zurück. die nach dem Öffnen des Cursors durchgeführt werden. Unempfindliche Cursor Diese Cursor haben unempfindliche Mitgliedschaft. der ersten Zeile oder der zweiten Zeile hängt von der entsprechenden Optimierungsmethode für die Abfrage ab. Gibt Zeile 105 zurück. 36 . Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) ♦ Nicht-empfindliche Cursor Die Mitgliedschaft und Werte der Ergebnismenge sind in Bezug auf die Änderungen unbestimmt. Die Antwort auf einen Abruf der vorherigen Zeile. Reihenfolge und Werte.und Fehlerbedingungen für Aktualisierungen kommen in Massenvorgängen nicht vor (Option -b für Datenbankserver). ob die Methode die Erstellung einer Arbeitstabelle erfordert und ob die abgerufene Zeile vom Client vorab abgerufen wurde. Maßnahme Vorherige Zeile abrufen Ergebnis Gibt den Fehler Zeile nicht gefunden zurück. sind sichbar.Adaptive Server Anywhere-Cursor ♦ Wert-empfindliche Cursor Die Mitgliedschaft der Ergebnismenge ist unveränderlich. Das DELETE wird in den Werten des Cursors wiedergespiegelt und erzeugt ein tatsächliches "Loch" in der Ergebnismenge. Standards Unempfindliche Cursor entsprechen der ISO/ANSI-Standarddefinition von unempfindlichen Cursorn beziehungsweise den statischen ODBC-Cursorn. Der Cursor wird über dem Loch positioniert: Er befindet sich vor Zeile 105. und daher ist Zeile 105 weiterhin die zweite Zeile in der Ergebnismenge. Die Mitgliedschaft der Ergebnismenge hat sich geändert und 105 ist jetzt die erste Zeile. Unempfindliche Cursor werden nur für schreibgeschützte Cursortypen verwendet. Die Mitgliedschaft der Ergebnismenge hat sich geändert und 105 ist jetzt die erste Zeile. Keine Änderungen. Keine Warnungen oder Fehler in Massenvorgängen Warnungs.

Kapitel 2 SQL in Anwendungen verwenden Programmierschnittstellen Schnittstelle ODBC. wenn der Cursor geöffnet wird. Nachfolgende Zeilen können direkt von der Arbeitstabelle abgerufen werden. sind die Festplatten. bevor die erste Zeile an die Anwendung zurückgegeben wird. Bei komplexen Abfragen kann das zu einer Verzögerung führen. ♦ ♦ ♦ Empfindliche Cursor Diese Cursor haben empfindliche Mitgliedschaft. Reihenfolge und Werte. Unempfindliche Cursor sind von ROLLBACK oder ROLLBACK TO SAVEPOINT nicht betroffen. Embedded SQL INSENSITIVE oder NO SCROLL Nicht unterstützt Nicht unterstützt JDBC Open Client Beschreibung Unempfindliche Cursor geben immer Zeilen zurück. bevor nicht die gesamte Ergebnismenge als eine Arbeitstabelle zusammengestellt ist. und zwar in der durch eine ORDER BY-Klausel festgelegte Reihenfolge. Standards Empfindliche Cursor entsprechen der ISO/ANSI-Standarddefinition von empfindlichen Cursorn beziehungsweise den dynamischen ODBC-Cursorn. Die Ergebnismenge eines unempfindlichen Cursors wird vollständig als Arbeitstabelle materialisiert. Keine Zeile wird an die Anwendung zurückgegeben. wird statt dessen ein Wert-empfindlicher Cursor verwendet. was die Performance weiter steigert. die den Auswahlkriterien der Abfrage entsprechen.und Speicheranforderungen zum Verwalten des Ergebnisses möglicherweise von Bedeutung. Das hat folgende Konsequenzen: ♦ Wenn die Ergebnismenge sehr umfangreich ist. Empfindliche Cursor können für schreibgeschützte oder aktualisierbare Cursortypen verwendet werden. OLE DB und ADO Cursortyp Static Kommentar Wenn ein aktualisierbarer statischer Cursor angefordert wird. und werden daher rasch ausgegeben. Die Client-Bibliothek kann mehrere Zeilen gleichzeitig vorab abrufen. 37 .

Aktualisierungen können sich auf die Mitgliedschaft. Bei einigen Abfragen ist es unvermeidlich. Reihenfolge und Spaltenwerten des Cursors sind sichtbar. weil die Änderungen an solchen Zeilen durch den Cursor nicht sichtbar wären. Empfindliche Cursor müssen so implementiert werden. dann zeigen alle Ergebniszeilen. die aus dieser Basiszeile zusammengesetzt sind. Empfindliche Cursor geben immer Zeilen zurück. der eine Arbeitstabelle enthält. Höhere Isolationsstufen können auf Grund von Sperren manche Änderungen verbergen. dass der Optimierer einen Plan erstellt. und zwar in der durch eine ORDER BY-Klausel festgelegte Reihenfolge. den neuen Wert. Die Mitgliedschaft und Reihenfolge der Ergebnismenge können sich bei jedem Abruf ändern. Beispiel: Wenn ein empfindlicher Cursor einen Join enthält und einer der Werte von einer der darunter liegenden Tabelle geändert wird. die von anderen Transaktionen durchgeführt werden. schränkt die Auswahl der Join-Methode durch den Optimierer ein und kann sich daher auf die Performance auswirken. Die Bedingung.Adaptive Server Anywhere-Cursor Programmierschnittstellen Schnittstelle ODBC. OLE DB und ADO Embedded SQL Cursortyp Dynamic SENSITIVE Kommentar Wird auch als Antwort auf eine Anfrage nach einem DYNAMIC SCROLL-Cursor geliefert. keine Arbeitstabelle zu verwenden. Reihenfolge und Werte der Ergebnismenge auswirken. Beschreibung Alle Änderungen sind durch den Cursor sichtbar. wenn keine Arbeitstabelle erforderlich ist und PREFETCH auf OFF eingestellt ist. Die Anforderungen von empfindlichen Cursorn bewirken bei der Implementierung von empfindlichen Cursorn folgende Einschränkungen: ♦ Zeilen können nicht vorab abgerufen werden. sowohl die Änderungen durch den Cursor als auch die durch andere Transaktionen. ♦ ♦ ♦ 38 . Das kann sich auf die Performance auswirken. dass keine Arbeitstabellen zusammengestellt werden. weil Änderungen an den in der Arbeitstabelle gespeicherten Zeilen durch den Cursor nicht sichtbar wären. die den Auswahlkriterien der Abfrage entsprechen. Alle Änderungen von Mitgliedschaft. und somit keinen empfindlichen Cursor erlaubt.

Anweisungen mit einer ORDER BY-Klausel. $ Weitere Hinweise zur Abfragenoptimierung und Verwendung von Arbeitstabellen finden Sie unter "Abfragen optimieren und ausführen" auf Seite 345 der Dokumentation ASA SQL-Benutzerhandbuch. ihrer Reihenfolge oder ihren Werten. In diesen Fällen gibt Adaptive Server Anywhere entweder eine Fehlermeldung an die Anwendung zurück.oder GROUP BY-Klauseln betreffen. ermöglicht es. OLE DB und ADO Embedded SQL Cursortyp Unspecified sensitivity DYNAMIC SCROLL Programmierschnittstellen 39 . aber sie werden von folgenden Abfragen verwendet: ♦ ♦ ♦ ♦ UNION-Abfragen. wenn es keinen Index auf der ORDER BY-Spalte gibt. Eine Arbeitstabelle ist zum Sortieren nicht erforderlich. oder er ändert den Cursortyp in einen nicht-empfindlichen Cursor und gibt eine Warnmeldung aus. auch wenn UNION ALL nicht unbedingt Arbeitstabellen verwenden. nicht-empfindliche Cursor für die Performance zu optimieren. Nicht-empfindliche Cursor werden nur für schreibgeschützte Cursortypen verwendet. Schnittstelle ODBC.Kapitel 2 SQL in Anwendungen verwenden Arbeitstabellen werden üblicherweise zum Sortieren und Gruppieren von Zwischenergebnissen verwendet. Viele Abfragen. Es ist nicht immer möglich vorherzusagen. Die Flexibilität. Standards Nicht-empfindliche Cursor entsprechen der ISO/ANSI-Standarddefinition von nicht-empfindlichen Cursorn beziehungsweise den ODBC-Cursorn mit unbestimmter Empfindlichkeit. die mit einem Hash-Join optimiert ist. wenn auf die Zeilen durch einen Index zugegriffen werden kann. die DISTINCT. Nicht-empfindliche Cursor Diese Cursor haben keine genau definierte Empfindlichkeit in ihrer Mitgliedschaft. Jede Abfrage. welche Abfragen Arbeitstabellen verwenden. die sie in Bezug auf Empfindlichkeit haben.

und Zeilen können vom Client vorab abgerufen werden. jede Maßnahme zur Materialisierung von Zwischenergebnissen. Standards Programmierschnittstellen Wert-empfindliche Cursor entsprechen keiner ISO/ANSI-Standarddefintion. an dem die Cursor-Mitgliedschaft etabliert wurde. Vor allem steht es dem Optimierer frei. dass Zeilen zurückgegeben werden. Wenn sich Spaltenwerte nach dem Öffnen des Cursors ändern. anzuwenden. Arbeitstabellen.und ORDER BY-Klauseln entsprechen. Adaptive Server Anywhere kann die Sichtbarkeit von Änderungen in den darunter liegenden Basiszeilen nicht garantieren. Schnittstelle ODBC. Besonders Aktualisierungen in Basiszeilen können dazu führen. Die Zeilenmitgliedschaft steht zum Zeitpunkt des Öffnens des Cursors fest. Sie entsprechen den Schlüsselmengen-gesteuerten ODBC-Cursorn. die den WHEREund ORDER BY-Klauseln des Kunden zu dem Zeitpunkt entsprachen. Die Mitgliedschaft und Reihenfolge können sich mit jedem Abruf ändern.Adaptive Server Anywhere-Cursor Beschreibung Die Anforderung eines nicht-empfindlichen Cursors schränkt die Auswahl der Methoden kaum ein. wie z. werden möglicherweise Zeilen zurückgegeben. um die Abfrage zu optimieren und Zeilen an die Anwendung zurückzugeben. die nicht mehr den WHERE. Einige Änderung können sichtbar sein. die der Auswahl und Reihenfolge der Abfrage entsprechen. aber nachfolgende Änderungen an den darunter liegenden Werten werden in den Ergebnissen wiedergespiegelt. dafür sind sie empfindlich. OLE DB und ADO Embedded SQL JDBC Open Client Cursortyp Schlüsselmengen-basiert SCROLL Schlüsselmengen-basiert Schlüsselmengen-basiert 40 . Nicht-empfindliche Cursor geben immer Zeilen zurück. Wert-empfindliche Cursor können für schreibgeschützte oder aktualisierbare Cursortypen verwendet werden.B. Nicht-empfindliche Cursor sind keine Garantie dafür. was die Reihenfolge und Werte der Ergebnismenge betrifft. Aus diesen Gründen erhalten Sie mit nicht-empfindlichen Cursorn die beste Performance. Wert-empfindliche Cursor Diese Cursor sind in Bezug auf ihre Mitgliedschaft unempfindlich. die Adaptive Server Anywhere verwenden kann. dass nur einige der aktualisierten Spalten im Ergebnis des Cursors wiedergespiegelt werden. andere nicht.

wenn eine Zeile in der Ergebnismenge gelöscht wird (durch den Cursor oder von auswärts). Wenn diese Option auf ON eingestellt ist.Kapitel 2 SQL in Anwendungen verwenden Beschreibung Wenn eine Anwendung eine Zeile abruft. Ansonsten ist sie nicht in der Ergebnismenge enthalten. Weitere Hinweise finden Sie unter "Beispiel für CursorEmpfindlichkeit: Eine gelöschte Zeile" auf Seite 32. Ein Sonderfall tritt auf. sich an die Zeilenpositionen innerhalb eines Cursors erinnern. Alle Werte sind in Bezug auf Änderungen. die durch den Cursor ausgeführt werden. Da die Zeilenmitgliedschaft zum Zeitpunkt des Öffnens festgelegt wird. eine Zeile abzurufen. wird die Schlüsselmengen-Tabelle zur Identifizierung der Mitgliedschaft der Ergebnismenge verwendet. und geben die SQL_ROW_DELETEDStatusmeldung zurück. die zur Ergebnismenge beiträgt. Es gibt keine Garantie. von den darunter liegenden Tabellen bezogen. füllt Adaptive Server Anywhere eine Arbeitstabelle mit Kenndaten für jede Zeile an. und eine neue Zeile mit demselben Schlüsselwert eingefügt wird. wodurch ein Lücke vermieden wird. aber die Daten werden. dass die Zeilen in der Ergebnismenge dem Reihenfolgen. falls erforderlich. Das führt dazu. und stellt sicher. führen nachfolgende Änderungen. Löschungen durch den Cursor entfernen die Zeile aus der Ergebnismenge. die aus einer darunter liegenden geänderten Basiszeile besteht. fügen Einfügungen durch den Cursor die Zeile dem Cursor hinzu. wird durch die ODBC-Option SQL_STATIC_SENSITIVITY gesteuert. dass sich die Mitgliedschaft oder Position einer Zeile ändert. Wert-empfindliche Cursor verwenden eine Schlüsselmengen-Tabelle. welche gelöscht worden ist. behandelt). 41 . Die Empfindlichkeit der Mitgliedschaft gegenüber Änderungen. durch die eine Zeile nicht mehr der WHEREoder ORDER BY-Klausel entspricht. Wenn der Cursor geöffnet wird.oder Auswahlkriterium der Abfrage entsprechen. die aus einer darunter liegenden Basiszeile zusammengesetzt war. gefolgt von Einfügen. dann muss der Anwendung der aktualisierte Wert sowie die SQL_ROW_UPDATED-Statusmeldung übermittelt werden. Wenn Sie die Ergebnismenge durchblättern. die durch den Cursor durchgeführt werden. nicht dazu. dass diese Positionen nicht geändert werden.empfindlich. Die Eigenschaft der festen Mitgliedschaft von Wert-empfindlichen Cursorn ermöglicht es Ihrer Anwendung. muss eine SQL_ROW_DELETED-Statusmeldung an die Anwendung übermittelt werden. Wenn die Anwendung versucht. dass die neue Zeile die alte Zeile in der ursprünglichen Position ersetzt. Eine Änderung am Primärschlüsselwert entfernt die Zeile aus der Ergebnismenge (dies wird als Löschen.

da sich deren Mitgliedschaft zusammen mit den Werten verändert. wird mit der Fehlermeldung Keine aktuelle Cursorzeile (SQL state 24503) darauf hingewiesen. 42 . ♦ Wenn eine Zeile. Sie können Lücken vermeiden. und der Cursor wird auf der Lücke belassen. entsteht im Cursor eine Lücke. wenn die Zeile abgerufen wird. gibt den SQLE_ROW_UPDATED_SINCE_READFehler aus und bricht die Anweisung ab. wenn die aktualisierte Spalte nicht durch den Cursor referenziert wird. indem Sie empfindliche Cursor verwenden. Die Warnung wird nur einmal ausgegeben: Ein weiteres Abrufen der Zeile generiert keine Warnmeldung. bevor das UPDATE oder DELETE zugelassen wird. wenn die aktualisierte Spalte nicht durch den Cursor referenziert wird.Adaptive Server Anywhere-Cursor ♦ Wenn eine Zeile seit dem Öffnen des Cursors aktualisiert beziehungsweise möglicherweise aktualisiert wurde.oder DELETEAnweisung auf einer Zeile auszuführen.Vorgang abgebrochen" auf Seite 323 der Dokumentation ASA Fehlermeldungen. eine positionsbasierte UPDATE. Die Mitgliedschaft des Cursors steht fest. Siehe "Performance-Überlegungen beim Bewegen von Daten" auf Seite 470 der Dokumentation ASA SQL-Benutzerhandbuch. gibt Adaptive Server Anywhere die Warnung SQLE_ROW_UPDATED_WARNING zurück. Ein Cursor auf emp_lname und emp_fname würde beispielsweise die Aktualisierung melden. Diese Warn. Wenn Sie die Zeile an dieser Lücke abrufen. daher ist die Position einer Zeile reserviert. nach dem Öffnen des Cursors gelöscht wurde. $ Weitere Hinweise finden Sie unter "Zeile seit dem letzten Lesen geändert . die seit dem letzten Abruf geändert wurde.und Fehlerbedingungen bei Aktualisierung treten nicht im Massenoperationsmodus (Option -b für Datenbankserver) auf. $ Weitere Hinweise finden Sie unter "Zeile wurde seit dem letzten Lesen aktualisiert" auf Seite 324 der Dokumentation ASA Fehlermeldungen ♦ Der Versuch. Der Fehler tritt nicht im Massenvorgangsmodus auf. dass es keine aktuelle Zeile gibt. selbst wenn nur die birthdateSpalte geändert worden wäre. aber der DELETE-Vorgang wird im geänderten Wert für die Zeile wiedergespiegelt. Eine Aktualisierung einer beliebigen Spalte in der Zeile verursacht diesen Fehler. Eine Anwendung muss die Zeile noch einmal mit FETCH ABRUFEN. wenn die Zeilensperre deaktiviert ist. Dies ist sogar dann der Fall. Eine Aktualisierung einer beliebigen Spalte in der Zeile verursacht diese Warnung sogar. entweder durch den Cursor oder durch eine andere Transaktion.

Besonders wenn Sie einen Cursor aktualisierbar machen. AbfrageEigenschaften können ebenfalls dazu führen.Kapitel 2 SQL in Anwendungen verwenden $ Weitere Hinweise finden Sie unter "Keine aktuelle Cursorzeile" auf Seite 207 der Dokumentation ASA Fehlermeldungen. ODBC-Treiber in der Netzwerk-Bibliothek DatenbankServer ♦ ClientAnwendung Vorab abgerufene Zeilen Arbeitstabelle Die Empfindlichkeit und Aktualisierbarkeit beschränken die Verwendung von zwischengeschalteten Standorten.als auch Endergebnisse können als Arbeitstabellen gespeichert werden. Prefetch-Vorgang Der Client kann Zeilen vorab in einen clientseitigen Puffer abrufen. führt das zu Beschränkungen der Abfrageverarbeitung und -zustellung. Um zu verstehen. Wert-empfindliche Cursor verwenden eine Arbeitstabelle für Primärschlüsselwerte. 43 . Auch können Anforderungen an die CursorEmpfindlichkeit die Performance einschränken. Diese Einschränkung kann sich manchmal auf die Performance auswirken. um separate Anfragen an der Datenbankserver für jede Zeile zu vermeiden. von der Datenbank an die Client-Anwendung übermittelt werden. die durch einen Cursor sichtbar sind. wie die Ergebnisse. Sie können für Wert-empfindliche Cursor Zeilen nicht vorab abrufen. Cursor-Empfindlichkeit und Performance Es besteht eine Wechselwirkung zwischen Performance und anderen CursorEigenschaften. ist es hilfreich zu wissen. Im Einzelnen können Ergebnisse aus Performance-Gründen an zwei dazwischengeschalteten Standorten gespeichert werden: ♦ Arbeitstabellen Sowohl Zwischen. dass der Optimierer in seinem gewählten Ausführungsplan Arbeitstabellen verwendet. was die Performance vermindert. wie sich die Aktualisierbarkeit und Empfindlichkeit von Cursorn auf die Performance auswirkt.

Der korrekte Endwert für die Zeile sollte 13 sein.10 WHERE id = 300 4 5 Die Anwendung aktualisiert die Zeile durch den Cursor auf einen Wert von (quantity . Prefetch-Vorgänge rufen Zeilen aus dem Server in einen Puffer auf dem Client ab. quantity FROM product id 300 301 302 … quantity 28 54 75 … 2 3 Die Anwendung ruft die Zeile mit id = 300 durch den Cursor ab. Wäre dies möglich.Adaptive Server Anywhere-Cursor Einem aktualisierbaren Cursor ist es nicht gestattet. Weitere Hinweise finden Sie unter den Beschreibungen der einzelnen Cursortypen. machen diese Zeilen aber für die Clientanwendung erst verfügbar. Prefetch-Vorgänge können ohne explizite Anweisungen aus der Clientanwendung ausgeführt werden. Dieses Problem wird im folgenden Beispiel erläutert: 1 Eine Anwendung öffnet auf der Beispieldatenbank in der folgenden Abfrage einen Cursor. wenn die entsprechende Zeile von der Anwendung abgerufen wird. Eine weitere Transaktion aktualisiert die Zeile mit der folgenden Anweisung: UPDATE product SET quantity = quantity . Zeilen-Prefetch Prefetch-Vorgänge und Mehrzeilen-Fetch-Vorgänge unterscheiden sich voneinander. würde der neue Wert für die Zeile 23 lauten und die Aktualisierung der anderen Transaktion verloren gehen. SELECT id. Wenn der Cursor die Zeile vorab abgerufen hätte. wäre er für verlorene Aktualisierungen anfällig. Arbeitstabellen zu verwenden oder mit PREFETCH Ergebnisse vorab abzurufen. 44 .5 ). Ähnliche Einschränkungen sind maßgebend für die Empfindlichkeit.

BLOCK=0 zu verwenden. indem ohne separate Anforderung für einzelne Zeilen oder Zeilenblöcke viele Zeilen verfügbar gemacht werden. Prefetch-Vorgänge verbessern die Performance durch die Reduktion des Client/Server-Verkehrs und erhöhen den Durchsatz. allerdings auf unterschiedliche Weise. wenn eine Anwendung eine einzelne Zeile abruft. Cursor-Empfindlichkeit und Isolationsstufen Sowohl Cursor-Empfindlichkeit als auch Isolationsstufen betreffen das Problem der Parallelität. 45 . Die Anwendung kann eine maximale Anzahl von Zeilen festlegen. indem die BLOCK-Klausel angegeben wird.Kapitel 2 SQL in Anwendungen verwenden Standardmäßig führt die Clientbibliothek von Adaptive Server Anywhere Prefetch-Vorgänge für mehrere Zeilen aus. Beispiel: Wenn Sie 5 Zeilen gleichzeitig abrufen und anzeigen. Obwohl Sie die PREFETCH-Vorgänge auch durch einen Verbindungsparameter für die Anwendung ausschalten können. die in einem einzelnen FETCH-Vorgang vom Server enthalten sein dürfen. In Embedded SQL können Sie die PREFETCH-Vorgänge auf Cursorbasis steuern. ob Prefetch-Vorgänge durchgeführt werden oder nicht. können Sie BLOCK 5 verwenden. indem Sie die BLOCK-Klausel verwenden. ist es effektiver. ♦ In Open Client können Sie das PREFETCH-Verhalten mit ct_cursor und CS_CURSOR_ROWS nach der Deklaration. Wenn Sie BLOCK 0 festlegen. Die Clientbibliothek von Adaptive Server Anywhere speichert die zusätzlichen Zeilen in einem Puffer. $ Weitere Hinweise zur Steuerung der Prefetch-Funktionen finden Sie unter "PREFETCH-Option" auf Seite 659 der Dokumentation ASA Datenbankadministration. wird jeweils 1 Datensatz abgerufen. und ein FETCH RELATIVE 0 ruft die Zeile nochmals vom Server ab. aber vor dem Öffnen des Cursors steuern. PrefetchFunktionen aus einer Anwendung steuern ♦ Durch die PREFETCH-Option wird gesteuert. Standardmäßig wird sie auf ON gesetzt. wenn Sie einen Cursor bei einem FETCH-Vorgang öffnen. ♦ $ Weitere Hinweise finden Sie unter "PREFETCH-Option" auf Seite 659 der Dokumentation ASA Datenbankadministration. Sie können die PREFETCH-Option für eine einzelne Verbindung auf ON oder OFF setzen.

die den Cursor verwendet.Adaptive Server Anywhere-Cursor Indem Sie eine Isolationsstufe für eine Transaktion auswählen (häufig auf der Verbindungsebene). Indem Sie die Cursor-Empfindlichkeit einstellen legen Sie nicht fest. 46 . Indem Sie eine Cursor-Empfindlichkeit auswählen legen Sie fest. wann Sperren auf Zeilen in der Datenbank plaziert werden. dass andere Transaktionen auf die Werte in der Datanbank zugreifen oder sie verändern. sichtbar sind. legen Sie fest. und Sie schränken auch nicht die Änderungen ein. welche Änderungen für die Anwendung. wann Sperren auf Zeilen in der Datenbank gelegt werden. die an der Datenbank selbst durchgeführt werden. Sperren verhindern.

Kapitel 2 SQL in Anwendungen verwenden

Ergebnismengen beschreiben
Einige Anwendungen bauen SQL-Anweisungen auf, die in der Anwendung nicht ausgeführt werden können. Anweisungen hängen manchmal von einer Antwort des Benutzers ab, sodass die Anwendung erst dann erfährt, welche Daten abzurufen sind, z.B. wenn eine Berichtsanwendung dem Benutzer die Möglichkeit gibt, die anzuzeigenden Spalten auszuwählen. In einem solchen Fall benötigt die Anwendung eine Methode, um Informationen über die Art der Ergebnismenge selbst sowie den Inhalt der Ergebnismenge zu erhalten. Die Informationen über die Art der Ergebnismenge werden als Deskriptor bezeichnet. Sie identifizieren die Datenstruktur einschließlich Anzahl und Typ der erwarteten Spalten. Wenn die Anwendung die Art der Ergebnismenge ermittelt hat, ist der Abruf des Inhalts ein einfacher Vorgang. Diese Ergebnismengen-Metadaten (Informationen über Art und Inhalt der Daten) werden mit Hilfe von Deskriptoren bearbeitet. Das Beziehen und Verwalten von Ergebnismengen-Metadaten wird als Beschreiben bezeichnet. Da Cursor im Allgemeinen Ergebnismengen produzieren, sind Deskriptoren und Cursor eng verknüpft, obwohl manche Schnittstellen die Verwendung von Deskriptoren vor dem Benutzer verbergen. Normalerweise gilt: Anweisungen, die Deskriptoren benötigen, sind entweder SELECTAnweisungen oder gespeicherte Prozeduren, die Ergebnismengen zurückgeben. Ein Deskriptor wird bei einem cursorbasierten Vorgang folgendermaßen eingesetzt: 1 2 3 Weisen Sie den Deskriptor zu. Dies kann implizit erfolgen, die explizite Zuweisung ist aber in manchen Schnittstellen zulässig. Bereiten Sie die Anweisung vor. Anweisung beschreiben. Wenn es sich bei der Anweisung um eine gespeicherte Prozedur oder um eine Anweisungsfolge handelt und die Ergebnismenge nicht durch eine Ergebnisklausel in der Prozedurdefinition definiert wird, sollte die Beschreibung nach dem Öffnen des Cursors erscheinen. Deklarieren Sie einen Cursor für die Anweisung und öffnen Sie ihn (Embedded SQL), oder führen Sie die Anweisung aus. Beziehen Sie den Deskriptor und ändern Sie erforderlichenfalls den zugewiesenen Bereich . Dies erfolgt oft implizit. Rufen Sie die Anweisungsergebnisse ab und und verarbeiten Sie sie. 47

4 5 6

Ergebnismengen beschreiben
7 8 9 Hinweise zur Implementierung ♦ Heben Sie die Zuweisung des Deskriptors auf. Schließen Sie den Cursor. Löschen Sie die Anweisung . Einige Schnittstellen führen dies automatisch durch. In Embedded SQL enthält eine SQLDA-(SQL Descriptor Area) Struktur die Deskriptor-Informationen.

$ Weitere Hinweise finden Sie unter "Der SQL-Deskriptor-Bereich
(SQLDA)" auf Seite 228. ♦ In ODBC bietet ein Deskriptor-Handle, durch SQLAllocHandle zugewiesen, den Zugriff auf die Felder eines Deskriptors. Sie können diese Felder mit SQLSetDescRec, SQLSetDescField, SQLGetDescRec und SQLGetDescField verarbeiten. Alternativ können Sie SQLDescribeCol und SQLColAttributes verwenden, um Spalteninformationen zu beziehen. ♦ In Open Client können Sie ct_dynamic für die Vorbereitung einer Anweisung und ct_describe zur Beschreibungder Ergebnismenge der Anweisung verwenden. Sie können aber auch ct_command benutzen, um eine SQL-Anweisung ohne vorherige Vorbereitung zu senden und dann ct_results benutzen, um die zurückgegebenen Zeilen nacheinander zu verarbeiten. Dies ist die normalerweise benutzte Vorgehensweise bei der Open Client-Anwendungsentwicklung. In JDBC bietet die Klasse java.SQL.ResultSetMetaData Informationen über Ergebnismengen. Sie können auch Deskriptoren verwenden, um Daten an die Engine zu senden (z.B. mit der INSERT-Anweisung), aber dies ist eine andere Art von Deskriptor als für die Ergebnismenge.

♦ ♦

$ Weitere Hinweise zu Eingabe- und Ausgabeparametern für die
DESCRIBE-Anweisung finden Sie unter "DESCRIBE-Anweisung [ESQL]" auf Seite 426 der Dokumentation ASA SQL-Referenzhandbuch.

48

Kapitel 2 SQL in Anwendungen verwenden

Transaktionen in Anwendungen steuern
Transaktionen sind Zusammenstellungen einzelner SQL-Anweisungen. Entweder werden alle Anweisungen in der Transaktion ausgeführt oder keine. In diesem Abschnitt werden einige Aspekte der Transaktionen in Anwendungen behandelt.

$ Weitere Hinweise zu Transaktionen entnehmen Sie dem Kapitel
"Transaktionen und Isolationsstufen verwenden" auf Seite 99 der Dokumentation ASA SQL-Benutzerhandbuch.

Automatisch oder manuell festschreiben
Datenbank-Programmierschnittstellen können entweder im manuellen Festschreibemodus (manual commit) oder im automatischen Festschreibemodus (autocommit) operieren. ♦
Manueller Festschreibemodus (manual commit) Operationen werden nur festgeschrieben, wenn Ihre Anwendung eine explizite Festschreibungsoperation durchführt oder der Datenbankserver eine automatische Festschreibung vollzieht, wie zum Beispiel beim Ausführen einer ALTER TABLE-Anweisung oder anderer Datendefinitionsanweisungen. Der manuelle Festschreibungsmodus wird manchmal auch verketteter Modus genannt.

Um in Ihren Anwendungen Transaktionen wie verschachtelte Transaktionen und Savepoints verwenden zu können, müssen Sie im manuellen Festschreibemodus operieren. ♦
Automatischer Festschreibemodus (autocommit) Jede Anweisung wird wie eine separate Transaktion behandelt. Die Wirkung ist dieselbe, wie wenn Sie eine COMMIT-Anweisung an das Ende jedes Ihrer Befehle anhängen. Der automatische Festschreibungsmodus wird manchmal auch unverketteter Modus genannt.

Dieser Modus kann sich auf die Performance und das Verhalten Ihrer Anwendung auswirken. Verwenden Sie ihn nicht, wenn Ihre Anwendung Transaktionsintegrität erfordert.

$ Hinweise über die Auswirkungen von AUTOCOMMIT auf die
Performance finden Sie unter "Autocommit-Modus ausschalten" auf Seite 166 der Dokumentation ASA SQL-Benutzerhandbuch.

49

Transaktionen in Anwendungen steuern

AUTOCOMMIT-Verhalten steuern
Wie Sie das Festschreibungsverhalten Ihrer Anwendung steuern hängt von der verwendeten Programmierschnittstelle ab. Die Implementierung von AUTOCOMMIT kann, abhängig von der Schnittstelle, clientseitig oder serverseitig stattfinden.

$ Weitere Hinweise finden Sie unter "Die AUTOCOMMITImplementierung" auf Seite 51.
v So steuern Sie den AUTOCOMMIT-Modus (ODBC):

Standardmäßig arbeitet ODBC im AUTOCOMMIT-Modus. Die Art, wie Sie AUTOCOMMIT ausschalten, hängt davon ab, ob Sie ODBC direkt verwenden, oder ein Anwendungsentwicklungstool einsetzen. Wenn Sie direkt über die ODBC-Schnittstelle programmieren, stellen Sie das SQL_ATTR_AUTOCOMMIT-Verbindungsattribut ein.

v So steuern Sie den AUTOCOMMIT-Modus (JDBC):

Standardmäßig arbeitet JDBC im AUTOCOMMIT-Modus. Um AUTOCOMMIT auszuschalten, verwenden Sie die setAutoCommitMethode des Verbindungsobjekts:
conn.setAutoCommit( false );

v So steuern Sie den AUTOCOMMIT-Modus (Open Client):

Standardmäßig operiert eine Verbindung, die durch Open Client hergestellt wird, im AUTOCOMMIT-Modus. Sie können dieses Verhalten ändern, indem Sie die Datenbankoption CHAINED in Ihrer Anwendung auf ON setzen, indem Sie eine Anweisung wie die Folgende verwenden:
SET OPTION CHAINED=’ON’

v So steuern Sie den AUTOCOMMIT-Modus (Embedded SQL):

Standardmäßig operieren Embedded SQL-Anwendungen im manuellen Festschreibemodus. Um AUTOCOMMIT einzuschalten, stellen Sie die CHAINED-Datenbankoption auf OFF ein, indem Sie eine Anweisung wie die Folgende verwenden:
SET OPTION CHAINED=’OFF’

50

Kapitel 2 SQL in Anwendungen verwenden

Die AUTOCOMMIT-Implementierung
Der vorherige Abschnitt, "AUTOCOMMIT-Verhalten steuern" auf Seite 50, beschreibt, wie das AUTOCOMMIT-Verhalten von den einzelnen Adaptive Server Anywhere-Programmierschnittstellen gesteuert werden kann. Abhängig von der verwendeten Schnittstelle und davon, wie Sie das AUTOCOMMIT-Verhalten steuern, verhält sich der AUTOCOMMITModus leicht unterschiedlich. Der AUTOCOMMIT-Modus kann auf zwei Arten implementiert werden: ♦
Clientseitiges AUTOCOMMIT Wenn eine Anwendung AUTOCOMMIT

verwendet, sendet die Clientbibliothek eine COMMIT-Anweisung nach jeder ausgeführten SQL-Anweisung. Adaptive Server Anywhere verwendet clientseitiges AUTOCOMMIT für ODBC- und OLE DB-Anwendungen. ♦
Serverseitiges AUTOCOMMIT Wenn eine Anwendung

AUTOCOMMIT verwendet, gibt der Datenbankserver nach jeder SQLAnweisung ein COMMIT aus. Dieses Verhalten wird, im Fall von JDBC implizit, durch die CHAINED-Datenbankoption gesteuert. Adaptive Server Anywhere verwendet serverseitiges AUTOCOMMIT für Embedded SQL-, JDBC- und Open Client-Anwendungen. Es gibt einen Unterschied zwischen clientseitigem und serverseitigem AUTOCOMMIT im Fall von zusammengesetzten Anweisungen wie gespeicherten Prozeduren und Triggern. Für den Client ist eine gespeicherte Prozedur eine einzelne Anweisung, und daher sendet AUTOCOMMIT eine einzelne COMMIT-Anweisung, nachdem die gesamte Prozedur ausgeführt wurde. Aus der Perspektive des Datenbankservers kann die gespeicherte Prozedur aus vielen SQL-Anweisungen bestehen, und daher gibt ein serverseitiges AUTOCOMMIT ein COMMIT nach jeder SQL-Anweisung innerhalb der Prozedur aus.
Clientseitige und serverseitige Implementierungen nicht vermischen

Sie sollten in Ihrer ODBC- oder OLE DB-Anwendung die Verwendung der CHAINED-Option nicht mit AUTOCOMMIT kombinieren.

Isolationsstufe steuern
Sie können die Isolationsstufe einer aktuellen Verbindung mit der Datenbankoption ISOLATION_LEVEL einstellen.

51

Transaktionen in Anwendungen steuern
Einige Schnittstellen, wie ODBC, ermöglichen das Setzen der Isolationsstufe für eine Verbindung beim Aufbau. Diese Isolationsstufe kann später mit der Datenbankoption ISOLATION_LEVEL zurückgesetzt werden.

Cursor und Transaktionen
Im Allgemeinen wird ein Cursor geschlossen, wenn ein COMMIT ausgeführt wird. Es gibt zwei Ausnahmen für dieses Verhalten. ♦ ♦ Die Datenbankoption CLOSE_ON_ENDTRANS ist auf OFF gesetzt. Ein Cursor wird mit WITH HOLD geöffnet, was der Standard bei Open Client und JDBC ist.

Trifft einer dieser beiden Fälle zu, bleibt der Cursor bei COMMIT geöffnet. ROLLBACK und Cursor Beim Zurücksetzen einer Transaktion wird der Cursor geschlossen, außer wenn er mit WITH HOLD geöffnet wurde. Dem Inhalt eines Cursors können Sie nach einem Zurücksetzen nicht vertrauen. Der projektierte ISO SQL3-Standard legt fest, dass bei einem Zurücksetzen alle Cursor geschlossen werden sollen. Sie können dieses Verhalten erzwingen, indem Sie die Option ANSI_CLOSE_CURSORS_AT_ROLLBACK auf ON setzen. Savepoints Wenn eine Transaktion bis zu einem Savepoint zurückgesetzt wird und ANSI_CLOSE_CURSORS_AT_ROLLBACK auf ON gesetzt ist, wird jeder nach dem SAVEPOINT geöffnete Cursor geschlossen (sogar die Cursor, die mit WITH HOLD geöffnet wurden). Sie können die Isolationsstufe für eine Verbindung während einer Transaktion setzen, indem Sie die Anweisung SET OPTION verwenden, um die Option ISOLATION_LEVEL zu ändern. Diese Änderung wirkt sich jedoch nur auf geschlossene Cursor aus.

Cursor und Isolationsstufe

52

K A P I T E L

3

Einführung in Java für Datenbanken

Über dieses Kapitel

In diesem Kapitel wird erklärt, warum es sinnvoll ist, Java in einer Datenbank zu verwenden. Der Adaptive Server Anywhere ist eine Laufzeit-Umgebung für Java. Java bietet eine natürliche Erweiterung für SQL und verwandelt Adaptive Server Anywhere in eine Plattform für Unternehmensanwendungen der nächsten Generation.

Inhalt

Thema Einleitung Fragen und Antworten zu Java in der Datenbank Ein Java-Seminar Die Laufzeitumgebung für Java in der Datenbank Praktische Einführung: Eine Übung mit Java in der Datenbank

Seite 54 57 64 75 84

53

Einleitung

Einleitung
Adaptive Server Anywhere ist eine Laufzeit-Umgebung für Java. Das bedeutet, dass Java-Klassen im Datenbankserver ausgeführt werden können. Durch die Integration einer Laufzeit-Umgebung für Java-Klassen in den Datenbankserver werden neue, vielfältige Wege für die Verwaltung und Speicherung von Daten und Logik eröffnet. Java in der Datenbank bietet folgende Möglichkeiten: ♦ Sie können Java-Komponenten in den verschiedenen Schichten Ihrer Anwendung verwenden (Client, mittlere Schicht oder Server) und überall einsetzen, wo es für Sie am sinnvollsten ist. Adaptive Server Anywhere wird damit zu einer Plattform für verteilte Informationsverarbeitung. Java bietet mehr Möglichkeiten als gespeicherte Prozeduren für die Integration von Logik in die Datenbank. Java-Klassen werden zu reichhaltigen, benutzerdefinierten Datentypen. Die Methoden der Java-Klassen bieten neue Funktionen für den Zugriff aus SQL. Java kann in der Datenbank benutzt werden, ohne dass die Integrität, die Sicherheit und die Robustheit der Datenbank verletzt werden.

♦ ♦ ♦ ♦ Getrennt lizenzierbare Komponente Der SQLJStandard

Java in der Datenbank ist eine Komponente, die separat lizenziert werden kann und vor der Installation bestellt werden muss. Die Bestellung kann mit der betreffenden Karte im SQL Anywhere Studio-Paket oder über http://www.sybase.com/detail?id=1015780 erfolgen. Java in der Datenbank basiert auf den vorgeschlagenen Standards SQLJ Part 1 und SQLJ Part 2. SQLJ Part 1 liefert Spezifikationen zum Aufrufen von statischen Java-Methoden als gespeicherte SQL-Prozeduren und benutzerdefinierte Funktionen. SQLJ Part 2 bietet Spezifikationen für den Einsatz von Java-Klassen als in SQL geschriebene benutzerdefinierte Datentypen.

Hinweise zu Java in der Datenbank
Java ist eine relativ neue Programmiersprache, mit einer wachsenden, aber immer noch limitierten Wissensbasis. Diese Dokumentation wurde für ein breites Spektrum von Java-Entwicklern geschrieben und unterstützt daher alle, von erfahrenen Entwicklern bis zu fachlich nicht vorgebildeten Lesern, die die Sprache, ihre Möglichkeiten, ihre Syntax und ihre Einsatzmöglichkeiten nicht kennen. 54

Kapitel 3 Einführung in Java für Datenbanken
Leser, für die Java nichts Neues mehr ist, finden in diesem Kapitel wertvolle Hinweise für den Einsatz von Java in einer Datenbank. Adaptive Server Anywhere erweitert nicht nur die Möglichkeiten der Datenbank mit Java, sondern auch die Möglichkeiten von Java mit der Datenbank. JavaDokumentation In der nachstehenden Tabelle finden Sie Hinweise zur Dokumentation zum Thema Java in der Datenbank.
Titel "Einführung in Java für Datenbanken" auf Seite 53 (dieses Kapitel) "Java in der Datenbank benutzen" auf Seite 93 "Datenzugriff über JDBC" auf Seite 143 "Fehlersuche in der Datenbanklogik" auf Seite 635 der Dokumentation ASA SQL-Benutzerhandbuch Adaptive Server Anywhere Referenzhandbuch Referenzhandbuch für die Java API von Sun Thinking in Java Thinking in Java by Bruce Eckel. Verwendung Java-Konzepte und Anwendungsmethoden in Adaptive Server Anywhere Praktische Anleitung zum Einsatz von Java in der Datenbank Zugriff auf Daten aus Java-Klassen, einschließlich verteilter Informationsverarbeitung Testen und Fehlersuche von Java-Code für den Einsatz in der Datenbank

Das Referenzhandbuch enthält Informationen zu den SQL-Erweiterungen, die Java in der Datenbank unterstützen. Online-Handbuch für Java API-Klassen, Felder und Methoden. Nur als Windows-Hilfedatei verfügbar. Online-Buch, mit dem man das Programmieren in Java lernen kann. Es wird im Adobe PDF Format im Unterverzeichnis Samples\ASA\Java des Adaptive Server Anywhere-Installationsverzeichnisses bereitgestellt.

Java-Dokumentation benutzen
Die folgende Tabelle ist ein Wegweiser für die Java-Dokumentationen, die Sie je nach Ihren Interessen und Vorkenntnissen benutzen können. Die Tabelle ist nur als Richtlinie gedacht und soll Ihre Bemühungen, mehr über Java in der Datenbank zu lernen, unterstützen.

55

Einleitung

Gesuchtes Thema Sie benötigen eine Einführung in objektorientiertes Programmieren Sie benötigen eine Erklärung von Themen wie instanziert, Feld und Klassenmethode. Sie sind ein Java-Entwickler, der gleich mit der praktischen Arbeit beginnen will.

Textstelle "Ein Java-Seminar" auf Seite 64 Thinking in Java von Bruce Eckel. "Ein Java-Seminar" auf Seite 64

"Die Laufzeitumgebung für Java in der Datenbank" auf Seite 75 "Praktische Einführung: Eine Übung mit Java in der Datenbank" auf Seite 84

Sie wollen die Hauptmerkmale von Java in der Datenbank kennen lernen. Sie wollen herausfinden, wie der Zugriff auf Daten aus Java erfolgt. Sie wollen eine Datenbank für Java vorbereiten. Sie brauchen eine komplette Liste der unterstützten Java APIs. Sie versuchen, eine Java API-Klasse zu verwenden und benötigen JavaReferenzinformationen. Sie wollen ein Beispiel für verteilte Informationsverarbeitung sehen.

"Fragen und Antworten zu Java in der Datenbank" auf Seite 57 "Datenzugriff über JDBC" auf Seite 143 "Datenbank für Java aktivieren" auf Seite 97 "Java-Klassen-Datentypen" auf Seite 86 der Dokumentation ASA SQL-Referenzhandbuch Online-Handbuch für Java APIKlassen, Felder und Methoden (nur als Windows-Online-Hilfe) "Verteilte Anwendungen erstellen" auf Seite 174

56

Java-Methoden bieten eine leistungsfähigere Sprache als in SQL geschriebene gespeicherte Prozeduren. wenn Sie Ihrer Datenbank logische Elemente hinzufügen wollen. um Ihre JavaKlassen in der Datenbank zu testen und auf Fehler zu durchsuchen. gleichzeitig aber die bestehenden relationalen Funktionen nicht beeinträchtigt. und Java-Objekte aus einer Tabelle abgerufen werden. ♦ ♦ Sie können aus Java auf Daten zugreifen Ein interner JDBC-Treiber ermöglicht den Zugriff auf Daten aus Java. Java-Objekte können in eine Tabelle eingefügt. ♦ Sie können Java auf dem Datenbankserver ausführen Eine interne Java Virtual Machine (VM) führt den Java-Code auf dem Datenbankserver aus. Sie können die Fehlersuche für Java in der Datenbank vornehmen Sie können den Sybase Java Debugger verwenden. die Objekte unterstützt. SELECTAnweisungen in den Feldern und Methoden von in Tabellen gespeicherten Objekten ausgeführt. der für eine Spalte in einer Tabelle oder einer Variablen verwendet werden kann. Die wichtigsten Funktionen von Java in der Datenbank Detaillierte Erläuterungen aller nachstehenden Punkte sind in den folgenden Abschnitten zu finden. Mit diesen Möglichkeiten wird Adaptive Server Anywhere zu einer objekt-relationalen Datenbank. 57 .Kapitel 3 Einführung in Java für Datenbanken Fragen und Antworten zu Java in der Datenbank In diesem Abschnitt werden die Hauptmerkmale von Java in der Datenbank beschrieben. ♦ Sie können Java-Klassen als Datentypen verwenden Jede in einer Datenbank installierte Java-Klasse wird als Datentyp verfügbar. Sie können Java-Objekte in Tabellen speichern Eine Instanz einer ♦ Java-Klasse (ein Java-Objekt) kann als Wert in einer Tabelle gespeichert werden. ♦ Sie können Java aus SQL aufrufen Sie können Java-Funktionen (Methoden) aus SQL-Anweisungen ausführen. ♦ SQL wird bewahrt Der Einsatz von Java ändert das Verhalten bestehender SQL-Anweisungen oder andere Aspekte des nicht mit Java verbundenen Verhaltens der relationalen Datenbank nicht.

wenn die Ausführung einer SQL-Anweisung einen JavaVorgang erforderlich macht. 58 . Die Sun VM wird von einer Befehlszeile aus gestartet. Der Datenbankserver startet die VM automatisch. $ Weitere Hinweise finden Sie unter "Java-Klassen in einer Datenbank installieren" auf Seite 103. um die VM zu starten oder zu stoppen. schreiben Sie die Java-Instruktionen außerhalb der Datenbank in kompilierte Klassen (Bytecode). Sie brauchen eine JavaEntwicklungsumgebung. Nach der Installation können Sie diese Klassen im Datenbankserver ausführen. Auf den Sybase Java-Interpreter können Sie extern nicht zugreifen. keine Java-Entwicklungsumgebung. bei denen es sich um Binärdateien mit Java-Instruktionen handelt. um einen Java-Vorgang auszuführen. um JavaInstruktionen auszuführen. Er kann auch Abfragen von der VM verarbeiten. wenn dies als Teil der Ausführung einer SQL-Anweisung erforderlich ist. Die Sybase Java VM interpretiert kompilierte Java-Instruktionen und führt sie im Datenbankserver aus. Zusätzlich zur VM wurde der SQL-Abfrageprozessor im Datenbankserver erweitert. Um Java in einer Datenbank auszuführen. während die Java VM von Adaptive Server Anywhere jederzeit verfügbar ist. um Java-Codes zu schreiben und zu kompilieren. Adaptive Server Anywhere ist eine Laufzeit-Umgebung für Java-Klassen. so dass er in der VM Aufrufe durchführen kann. Sie installieren diese kompilierten Klassen dann in einer Datenbank.exe und dem Ausführen von Java-Codes in einer Datenbank. um den Datenzugriff aus Java zu aktivieren. wie Sybase PowerJ oder Java Development Kit von Sun Microsystems. Unterschiede zu einer eigenständigen VM Es gibt einen Unterschied zwischen dem Ausführen von Java-Codes mit einer Standard-VM wie Sun Java VM java. Java in einer Datenbank ausführen Adaptive Server Anywhere enthält eine Java Virtual Machine (VM). die in der Datenbankumgebung läuft. Er wird nur benutzt.Fragen und Antworten zu Java in der Datenbank Java-Instruktionen in der Datenbank speichern Java ist eine objektorientierte Sprache. ihre Anweisungen (Quellcode) werden daher in Form von Klassen geliefert. wenn sie benötigt wird: Sie brauchen keine ausdrücklichen Bedienungsmaßnahmen auszuführen.

die Teil der Java API sind. ♦ Java-Vorgänge werden aus SQL aufgerufen Sybase hat den Bereich der SQL-Ausdrücke erweitert. die für den Einsatz in Datenbanken besonders gut geeignet sind: ♦ ♦ ♦ ♦ ♦ ♦ Präzise Fehlerprüfung bei der Kompilierung Integrierte Fehlerbehandlung mit einer gut definierten Methode für die Fehlerbehandlung Integrierte Sammlung von Abfalldaten (Speicher wird freigesetzt) Eliminierung vieler fehleranfälliger Programmiertechniken Leistungsfähige Sicherheitsfunktionen Java-Code wird interpretiert. daher werden keine Vorgänge ausgeführt. Wohl aber unter Windows-Betriebssystemen. Java und SQL zusammen einsetzen Ein Grundsatz für das Konzept von Java in der Datenbank besteht darin. 59 . offene Erweiterung für bestehende SQL-Funktionen gegeben ist. die von der VM nicht akzeptiert werden Plattformen. UNIX und NetWare. die von Java-Entwicklern erstellt und kompiliert wurden. dass damit eine natürliche.Kapitel 3 Einführung in Java für Datenbanken Vorteile von Java Java bietet eine Reihe von Merkmalen. sodass Eigenschaften und Methoden von Java-Objekten einbezogen werden können und damit der Einbau von Java-Vorgängen in eine SQL-Anweisung möglich ist. Sie können auch Klassen verwenden. Java-Klassen werden Domänen Sie speichern Java-Klassen mit ♦ denselben SQL-Anweisungen wie für normale SQL-Datentypen. Sie können viele der Klassen verwenden. so wie sie mit dem Java Development Kit von Sun Microsystems geliefert werden. die Java in der Datenbank unterstützen Java in der Datenbank wird auf Windows CE nicht unterstützt.

zusätzliche Möglichkeiten. die von Sun Microsystems erstellt wurde. $ Weitere Hinweise finden Sie unter "Java-Objekte einfügen.util. die von SQL zur Verfügung gestellt werden. Andere Bestandteile der Java API bieten weitere.HashTable wird benutzt.Fragen und Antworten zu Java in der Datenbank Beschreibung der Java API Die Java-Programmierschnittstelle (Java Application Programmer’s Interface. java. um Werte Schlüsseln zuzuordnen. sondern auch in gespeicherten Prozeduren und SQL-Anweisungen. die eine Liste sortiert speichern kann.lang.Math hat aber auch ein Feld namens E. aktualisieren und löschen" auf Seite 111.util. Die Java API bietet aus sich heraus zahlreiche Möglichkeiten und Funktionen.Stack generiert eine Warteschlange nach dem Last-InFirst-Out-Prinzip. das denselben Wert zurückgibt.lang.StringTokenizer unterteilt eine Zeichenfolge in einzelne Worteinheiten. die die Restoperation auf zwei Argumente gemäß dem Standard IEEE 754 durchführt. Dazu gehört die Mehrzahl der nicht-visuellen Klassen aus der Java API. die Entwicklern. sowie eine Methode. die für die Arbeit mit Java-Programmcode eingerichtet wurde. $ Weitere Hinweise über unterstützte Java-APIs finden Sie unter "Unterstützte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch. API) ist eine Gruppe von Klassen. 60 . bekannt sein dürften. Die Klasse java. Beispiel: Die SQL-Funktion PI(*) gibt den Wert für pi zurück. Zugriff auf Java aus SQL Die Java API kann nicht nur in Klassen verwendet werden.util. Beispiel: java. die von JavaEntwicklern benutzt und erweitert werden können.Math hat ein paralleles Feld namens PI. Sie bietet eine Reihe von Basisfunktionen. Sie können die Java APIKlassen als Erweiterungen zu den verfügbaren Funktionen behandeln. Sie bilden den Kern aller Einsatzmöglichkeiten von Java. das die Basis von natürlichen Logarithmen zurückgibt. welche schon mit dem Java Development Kit (JDK) von Sun Microsystems arbeiten. Die Java APIKlasse java. Ein Großteil der Java API kann in jede Datenbank integriert werden. java.

Während gespeicherte Prozeduren in SQL geschrieben sind. einschließlich Teile der Klasse java. Java-Klassen und gespeicherte Prozeduren unterscheiden sich Java-Klassen unterscheiden sich von gespeicherten Prozeduren. in Java schreiben und mit einem JavaCompiler kompilieren. 61 . Beispiel: Ein Entwickler könnte die benutzerdefinierte Klasse "Mitarbeiter" oder "Verpackung" konzipieren.Kapitel 3 Einführung in Java für Datenbanken Unterstützte Java-Klassen Die Datenbank unterstützt nicht alle Java API-Klassen. Beispiel: Wenn eine Klasse namens Adresse in einer Datenbank installiert wurde.oder Instanzenmethoden) genauso schnell und einfach aus wie gespeicherte Prozeduren. ist in einem Datenbankserver nicht sinnvoll. $ Weitere Hinweise finden Sie unter "Java-Klassen in einer Datenbank installieren" auf Seite 103. stellt Adaptive Server Anywhere diese Klassen in allen Teilen und Vorgängen der Datenbank zur Verfügung und führt ihre Funktionen (in der Form von Klassen. was in einer DatenbankserverUmgebung ebenfalls nicht unterstützt wird. beispielsweise das Paket java. Eine Java-Klasse kann in jeder Situation verwendet werden. dass nur auf der Klasse Adresse basierende Objekte als Zeilenwerte für diese Spalte gespeichert werden können. Von einem Benutzer erstellte Java-Klassen können Informationen über den Gegenstand der Klasse und Rechnerlogik enthalten. das Bestandteile der Benutzerschnittstelle für Anwendungen enthält. kann eine Spalte in einer Tabelle namens Adr den Typ Adresse haben. Wenn eine Java-Klasse in einer Datenbank installiert wird. in der integrierte SQL-Datentypen benutzt werden können: Als Spaltentyp in einer Tabelle oder als Variablentyp. bieten Java-Klassen eine leistungsfähigere Sprache und können aus Clientanwendungen genau so leicht aufgerufen werden wie gespeicherte Prozeduren. $ Weitere Hinweise über unterstützte und nicht unterstützte Klassen finden Sie unter "Unterstützte Java-Pakete" auf Seite 87 der Dokumentation ASA SQL-Referenzhandbuch und "Nicht-unterstützte Java-Pakete und Klassen" auf Seite 88 der Dokumentation ASA SQL-Referenzhandbuch. Nachdem sie in einer Datenbank installiert wurden. Einige Klassen.io. steht sie als neue Domäne zur Verfügung. übernehmen Schreibfunktionen auf der Festplatte. Andere Klassen. Eigene Java-Klassen in Datenbanken einsetzen Sie können Ihre eigenen Java-Klassen in einer Datenbank installieren.awt. was bedeutet.

Die JDBC-Klassen sollen folgende Aufgaben ermöglichen: Verbindung mit einer Datenbank. Normalerweise werden die JDBC-Klassen von einer Clientanwendung verwendet. kann auf jede Ebene des Unternehmenssystems. die Geschäftslogik. Adaptive Server Anywhere bietet auch einen internen JDBCTreiber. der es in einer Datenbank installierten Java-Klassen ermöglicht. Die Betreiber von unternehmensweiten Systemen können daher mit einer einzigen Programmiersprache in einer mehrschichtigen Architektur mit bisher nie gekannter Flexibilität eigene Anwendungen entwickeln. $ Weitere Hinweise finden Sie unter "Verteilte Anwendungen erstellen" auf Seite 174. Klassen vom Client auf einen Server verschieben Sie können Java-Klassen erstellen. Eine Klasse. auch auf den Server. $ Weitere Hinweise finden Sie unter "Datenzugriff über JDBC" auf Seite 143. verschoben werden. Dieselbe Java-Klasse kann in die Clientanwendung. und der Datenbank-Systemlieferant stellt einen JDBC-Treiber zur Verfügung.Fragen und Antworten zu Java in der Datenbank Mit Java auf Daten zugreifen Die JDBC-Schnittstelle ist ein Industriestandard. 62 . andere auf dem Client-System. genauso wie Sie SQL-Daten wie Zeichendaten und numerische Werte übergeben können.also an der Stelle. Daten oder eine Kombination von beiden enthält. der speziell für den Zugriff auf Datenbanksysteme entwickelt wurde. bei der einige Teile in der Datenbank arbeiten. Sie können Java-Objekte vom Server an den Client übergeben und umgekehrt. eine mittlere Schicht oder die Datenbank integriert werden . Anforderung von Daten mit SQL-Anweisungen und Rücklieferung von Ergebnismengen. mit dem JDBC-Klassen eine Verbindung herstellen können. an der sie am sinnvollsten eingesetzt werden kann. Sie können sich aus einer Clientanwendung mit Adaptive Server Anywhere über JDBC verbinden. Verteilte Anwendungen erstellen Sie können eine Anwendung erstellen. indem Sie jConnect oder eine JDBC/ODBC-Brücke benutzen. die SQL-Anweisungen ausführen. die zwischen verschiedenen Ebenen einer Unternehmensanwendung verschoben werden können. so dass Sie die vorhandenen Ressourcen optimal einsetzen können. die in der Clientanwendung verarbeitet werden können. JDBC-Klassen zu verwenden.

die in einer Datenbank installiert sind. auf Fehler geprüft und vom Endbenutzer benutzt zu werden. keine Java-Entwicklungsumgebung. Danach werden sie in einer Datenbank installiert. Sie können folgende Aufgaben in einer Datenbank nicht durchführen: ♦ ♦ ♦ ♦ Klasse-Quelldaten bearbeiten (*.B. Java APIs ausführen. Applets und visuelle Klassen Java-Methoden ausführen.java-Dateien). Java-Klassen-Quelldateien kompilieren (*. müssen 100% Java sein. wie z. um dort getestet. die nicht unterstützt werden. die die Ausführung nativer Methoden voraussetzen. Die in Adaptive Server Anywhere benutzten Klassen müssen mit einem Java-Entwicklungstool geschrieben und kompiliert werden.Kapitel 3 Einführung in Java für Datenbanken Einschränkungen für Java in der Datenbank Adaptive Server Anywhere ist eine Laufzeit-Umgebung für Java-Klassen. 63 .java-Dateien). Alle Benutzerklassen.

um damit die Gesamtrechnungssumme auszuwerfen. wie sie im täglichen Geschäftsverkehr verwendet wird. Rechnungsdatum. Java-Beispielverzeichnis Alle Klassen. die Rechnungsadresse. Eine Rechnung enthält bestimmte Informationen (z. gegebenenfalls verstehen. die verrechneten Artikel. 64 . Eine Klasse beschreibt nicht nur Daten. Klassen speichern Daten in Feldern. Erklärung von Java-Klassen Eine Java-Klasse kombiniert Daten und Funktionen: Die Möglichkeit zur Speicherung von Informationen und die Fähigkeit zur Durchführung von Rechenvorgängen. sind im Verzeichnis mit den Java-Beispielen zu finden. Zahlbetrag und Fälligkeit) .B. bzw.B. Eine Klasse kann man als eine Entität. dass alle benötigten Informationselemente in die Rechnung eingefügt werden. Berechnungen und andere logische Vorgänge werden durch die Methoden einer Klasse ausgeführt. nämlich im Unterverzeichnis Samples\ASA\Java zum Verzeichnis von Adaptive Server Anywhere. Nachdem Sie sich diesen Abschnitt durchgelesen haben. und könnte sogar automatisch anzeigen. Java-Code zu prüfen. Eine "Rechnungsklasse” könnte beispielsweise so entworfen werden. Eine solche Klasse würde auch dafür sorgen. einfache Klassendefinitionen oder den Aufruf einer Methode. dass sie eine normale Rechnung imitiert. sondern kann auch Berechnungen vornehmen und logische Vorgänge durchführen. Die Rechnungsklasse könnte beispielsweise die Steuer für eine Liste von Rechnungsposten für jedes Rechnungsobjekt errechnen und der Zwischensumme hinzufügen. Zwei Dateien stehen für jedes Java-Klassen-Beispiel: Java-Quellcode und kompilierte Klasse. ob die Zahlung fällig ist oder schon teilweise geleistet wurde. ohne dass ein Eingriff des Benutzers erforderlich wäre. also eine abstrakte Darstellung von Dingen sehen. die als Beispiele in diesem Dokument verwendet werden.Ein Java-Seminar Ein Java-Seminar In diesem Abschnitt werden die wichtigsten Java-Konzepte vorgestellt. wie z.dasselbe gilt für die Instanz einer Rechnungsklasse. sollten Sie in der Lage sein. warum etwaige Probleme auftreten. Sie können die kompilierte Version der Beispiele von Java-Klassen in einer Datenbank sofort und ohne Änderung installieren.

B. Das bedeutet weiterhin. die in einer Java-Anwendung verwendet und durch eine Java VM ausgeführt werden kann. dass alle Klassen. die oft der Beginn Ihrer Anwendung ist . um andere Objekte zu erstellen . Diese Klassendeklaration würde in einer Datei namens Invoice. Es gibt eine geöffnete und eine geschlossene geschweifte Klammer. die Sie erstellen oder benutzen. jedoch mit einer anderen Erweiterung. kann die Felder und Methoden ihrer übergeordneten Klasse verwenden: Dies wird als Vererbung bezeichnet. Grundsätzlich gibt es keinen Java-Code außerhalb von Klassen. Sie können zusätzliche Methoden und Felder definieren.Kapitel 3 Einführung in Java für Datenbanken Beispiel Der folgende Java-Code deklariert eine Klasse namens "Invoice". public class Invoice { // Bis jetzt kann diese Klasse nichts und hat auch keine Daten } Auf das Schlüsselwort class folgt der Name der Klasse. 65 . Eine Klasse. die von einem Java-Interpreter automatisch ausgeführt wird. Das bedeutet.class erstellt.java gespeichert und dann mit einem Java-Compiler in eine Java-Klasse kompiliert.exe. Durch das Kompilieren von Invoice. dass die Klassen der niedrigsten Ebene (also in der Hierarchie weiter oben angesiedelt) vorhanden sein müssen. also z. Java-Klassen kompilieren Beim Kompilieren des Quellcodes für eine Java-Klasse wird eine neue Datei mit demselben Namen wie die Quelldatei erzeugt. die als Unterklasse einer anderen Klasse fungiert.java wird dabei eine Datei namens Invoice. Unterklassen in Java Sie können Klassen als Unterklassen (subclasses) anderer Klassen definieren. wird zu einem Teil der Klasse. was dazwischen liegt. Alles. Das Sun JDK Tool für das Kompilieren der Klassendeklarationen ist javac. von einer Klasse erben. Felder und Methoden. die nur für die Unterklasse gelten. Die Basisgruppe der erforderlichen Klassen für Java-Anwendungen wird als Laufzeit-JavaKlassen oder Java-API bezeichnet. Sogar die Java-Prozedur.befindet sich selbst wieder innerhalb einer Klassendeklaration. bevor Klassen der oberen Ebene benutzt werden können. Java ist eine Programmiersprache mit einer Einzelhierarchie.die Hauptmethode (main). und die Bedeutung der geerbten Felder und Methoden verändern.

das aus der Klasse erstellt wird. Das Formular enthält die Definition. Ein Konstruktor ist eine Methode mit den folgenden Eigenschaften: ♦ Eine Konstruktormethode hat denselben Namen wie die Klasse und keinen deklarierten Datentyp. die erst Sinn und praktische Verwendbarkeit der Klasse ermöglicht. wobei jede Rechnung in den Details von jeder anderen Rechnung abweicht. wird gespeichert.Ein Java-Seminar Erklärung der Java-Objekte Eine Klasse definiert. der Arbeit leistet. welche Informationen die Rechnung enthalten sollte. Klassenkonstruktoren Sie erstellen ein Objekt. Die Klasse definiert. aber die Rechnung beinhaltet dann den tatsächlichen Nutzen. um viele Rechnungen zu erstellen. das Informationen enthält. führen Berechnungen aus. enthalten die Felder in der JavaClass einen ausschließlich für dieses Objekt bestimmten Zustand. Das instanzierte Objekt ist eine Instanz der Klasse. Beispiel: Ein einfacher Konstruktor für die Klasse "Produkt" würde wie folgt deklariert werden: Produkt () { 66 . eine Funktion. was alle Rechnungen enthalten müssen. was das Objekt leisten kann. die aufgrund dieses Formulars erstellt werden. Klassen können jede beliebige Anzahl von Methoden haben. indem Sie einen Klassen-Konstruktor aufrufen. kann eine Methode void (leer) zurückgegeben werden. Beispiel: Ein Rechungsobjekt ist eine Instanz der Rechnungsklasse. enthält die Daten. und die Objekte enthalten die Daten bzw. die für die Klasse eine Berechnung durchführt oder mit anderen Objekten interagiert. Wenn ein Objekt des Typs JavaClass erstellt wird. Im Beispiel mit dem Rechnungsformular definiert es. Genauso wie ein Rechnungsformular verwendet wird. Wenn kein Rückgabewert benötigt wird. was ein Objekt tun kann. genauso wie ein Rechnungsformular festlegt. Methoden und Felder Eine Methode ist der Teil einer Klasse. Vielmehr erstellt oder instanziert Ihre Anwendung Objekte auf Grundlage der Klasse (Vorlage). bearbeitet. aber das Objekt ist die Verwirklichung der Klasse. Methoden können Argumente aufnehmen und einen Wert an die aufrufende Funktion zurückgeben. so können aus einer Klasse viele Objekte abgeleitet werden. die auf diesem Rechnungsformular aufgebaut werden. Klassen enthalten keine spezifischen Informationen über Objekte. und so weiter. Es gibt ein Formular und 0 bis unendlich viele Rechnungen. Das Rechnungsobjekt. abgerufen. Ein Feld ist Teil einer Klasse.

und Argumentzahlen liefern. die mit dem JavaBasisobjekt mitgeliefert wurde. Beim Aufruf eines Konstruktors wird derjenige benutzt. Felder werden im Hauptteil einer Klasse. Ein Klassenfeld wird erstellt.Konstruktorcode wird hier eingegeben. Sie können auf Instanzfelder nur über eine Objektreferenz zugreifen. legen Sie seinen Typ fest und setzen danach seinen Namen und ein Semikolon. Sie können mehr als einen Konstruktor für jede Klasse mit unterschiedlichen Argumenttypen.. die bei der Erstellung des Objekts geschaffen wurden. Sie enthalten Informationen. wenn die Klasse zum ersten Mal geladen wird. Um ein Klassenfeld zu erstellen. nicht der Klasse. ♦ Klassenfelder Ein Klassenfeld enthält Informationen..Kapitel 3 Einführung in Java für Datenbanken . 67 . } ♦ Wenn Sie keine Konstruktormethode in Ihre Klassendefinition aufnehmen. der die richtige Argumentzahl und die passenden Argumenttypen aufweist. ♦ Erklärung von Feldern Es gibt zwei Kategorien von Java-Feldern: ♦ Instanzfelder Jedes Objekt hat seine eigene Gruppe von Instanzfeldern.. die speziell für diese Instanz gelten. Beispiel: Ein Feld lineItem1Description in der Klasse "Invoice" enthält die Beschreibung für einen Rechnungsposten einer bestimmten Rechnung. Beispiele Die folgende Deklaration der Klasse "Invoice" hat vier Felder. welche auf zwei Buchungszeilen in einer Rechnung stehen könnten. und nicht in einer Methode deklariert. die den Informationen entsprechen. Die Deklaration einer Variablen in einer Methode macht sie zu einem Teil der Methode. und es werden keine weiteren Instanzen geschaffen. Um ein Feld in einer Klasse zu deklarieren.. Auf Klassenfelder kann über den Klassennamen oder die Objektreferenz zugegriffen werden. die von einer bestimmten Instanz unabhängig sind. benutzen Sie das Java-Schlüsselwort static in der Deklaration. gleichgültig wie viele Objekte erzeugt werden. wird eine Standardmethode benutzt.

geben Sie ihren Rückgabetyp. Die Berechnung kann nur für ein Objekt ausgeführt werden.Ein Java-Seminar public class Invoice { // Felder einer Rechnung mit Rechnungsdaten public String lineItem1Description. } Erklärung von Methoden Es gibt zwei Kategorien von Java-Methoden: ♦ Instanzmethoden Eine totalSum-Methode in der Klasse "Invoice" muss die Steuer ausrechnen und hinzuaddieren. um den Hauptteil der Methode zu definieren. Klassenmethoden können auf Instanzenfelder nicht zugreifen. in den der Programmcode gesetzt wird. In der Regel führen Klassenmethoden eine Art von Dienstprogramm oder Informationsfunktion aus. public String lineItem2Description. bei dem die einzelnen Rechnungsposten zusätzliche Steuer. um eine Klassenmethode aufzurufen. da das Objekt die beiden Rechnungszeilen enthält. damit alle Kosten enthalten sind. ohne dass erst ein Objekt erstellt werden muss. die mit der Allgemeinfunktion der Klasse in Beziehung stehen. public int lineItem2Cost. Sie ist aber nur sinnvoll. public int lineItem1Cost. Wie eine Klassendeklaration benutzt die Methode eine geöffnete und geschlossene geschweifte Klammer.oder Kostenposten enthalten. 68 . wenn Sie im Zusammenhang mit einem Invoice-Objekt aufgerufen wird. Um eine Methode zu deklarieren. nicht die Klasse. Nur der Name der Klasse und der Methode sind erforderlich. ♦ Klassenmethoden Klassenmethoden (auch als statische Methoden bekannt) können aufgerufen werden. ihren Namen und alle von ihr übernommenen Parameter an. Ähnlich wie bei Instanzmethoden akzeptieren die Klassenmethoden Argumente und Rückgabewerte.

Kapitel 3 Einführung in Java für Datenbanken public class Invoice { // Felder public String lineItem1Description. um die Gesamtsumme zu erhalten.B. wird dann an die aufrufende Funktion zurückgegeben. public double lineItem2Cost. um die Zwischensumme der ersten und der zweiten Zeile aufzunehmen. Mehrwertsteuer) multipliziert. public String lineItem2Description. Beispiel: Gegeben sei der Zeichenfolgenwert "1". gibt die Methode parseInt eine Ganzzahl-Version der Zeichenfolge zurück. int i = java. die von der Klasse benutzt wird. Das Beispiel wird im nachstehenden Java-Codefragment veranschaulicht: String num = "1". Die lokale Variable (die im Hauptteil der Methode bekannt ist). public double lineItem1Cost.16. Sie wird zunächst verwendet. die mit Adaptive Server Anywhere mitgeliefert wird. Diese Zwischensumme wird dann mit 16 Prozent (z. runningsum = lineItem1Cost + lineItem2Cost. 69 .Integer erstellen zu müssen. um die Gesamtsumme der Rechnung zu kalkulieren. return runningsum. Beispiel Die folgende Version der Rechnungsklasse enthält nun eine Instanzmethode und eine Klassenmethode. Die Methode parseInt gibt den Ganzzahlwert 1 zurück.lang. gibt sie die Summe der zwei Zeilen plus die Steuer auf diese Summe zurück. Die Klassenmethode namens rateOfTaxation gibt die Steuerrate zurück.lang. runningsum = runningsum * 1. Wenn ihr ein Zeichenfolgenargument übergeben wird. ist ein Beispiel für eine Klassenmethode. Beispiel Die Methode parseInt der Klasse java.Integer. ohne eine Instanz der Klasse java.Integer. Wenn die Methode totalSum aufgerufen wird. } } Im Hauptteil der Methode totalSum wird eine Variable namens runningsum deklariert.lang. //Eine Methode public double totalSum() { double runningsum.parseInt( num ).

return rate. der von dieser Klasse verwendet wird. Zukünftige Versionen der Klasse "Invoice" können den Rückgabewert der Klassenmethode rateOfTaxation auf einer komplizierteren Berechnung basieren lassen. um den Steuersatz auszugeben. liegt darin. public double lineItem1Cost. dass andere Klassen und Prozeduren den Wert benutzen können. Anwendungen oder Prozeduren hätte. // Eine Instanzenmethode public double totalSum() { double runningsum. der von dieser Methode zurückgegeben wird. kann der Anwendungsentwickler den Steuersatz ändern. ohne dass andere Methoden beeinträchtigt werden. public String lineItem2Description. ohne dass dies Auswirkungen auf Objekte. und nicht zu einem Feld gemacht wird. } } Objektorientierte und prozedurale Sprachen Wenn Sie mehr Erfahrung mit prozeduralen Sprachen wie C oder der Sprache für gespeicherte Prozeduren haben als mit objektorientierten Sprachen. 70 . Dadurch dass der Steuersatz rateOfTaxation zu einer Methode. return runningsum. runningsum = runningsum * taxfactor. } // Eine Klassenmethode public static double rateOfTaxation() { double rate. public double lineItem2Cost. rate = . public class Invoice { // Felder public String lineItem1Description. double taxfactor = 1 + Invoice. finden Sie in diesem Abschnitt eine Erörterung der Ähnlichkeiten und Unterschiede zwischen prozeduralen und objektorientierten Sprachen. ohne erst eine Instanz der Klasse erstellen zu müssen.Ein Java-Seminar Dass die Methode rateOfTaxation zur Klassenmethode (und nicht zur Instanzmethode oder zu einem Feld) gemacht wurde. die den Rückgabewert dieser Methode verwenden.16. die den Rückgabewert verwenden. runningsum = lineItem1Cost + lineItem2Cost.rateOfTaxation(). Nur der Name der Klasse und der Methode sind erforderlich.

wird als instanziert bezeichnet. Mehrere Kopien der Klasse können je nach Anforderung erstellt und dynamisch geladen werden. In objektorientierten Sprachen wie Java wird eine Klasse wie eine Vorlage benutzt: Eine Definition einer potenziellen Programmausführung. die vorbereitet wurde. die einen gemeinsamen Zweck oder eine gemeinsame Kategorie haben. die gruppiert wurden. dass ihre Methoden unabhängig von anderen Klasseninstanzen ausgeführt werden. Ein Mitglied eines Pakets hat spezielle Berechtigungen für den Zugriff auf Daten und Methoden bei anderen Mitgliedern des Pakets. um eindeutige Werte zu enthalten bzw. sondern soll das Konzept der Java-Klassen in Adaptive Server Anywhere vorstellen. Jede geladene Klasse wird unabhängig von anderen im Speicher geladenen Klassen behandelt und ausgeführt. unterscheidet aber die objektorientierten Sprachen von prozeduralen Sprachen. identifizierbaren Kategorie gehören.Kapitel 3 Einführung in Java für Datenbanken Java basiert auf Klassen Die wichtigste strukturelle Einheit eines Codes in Java ist eine Klasse. um zu bewirken. 71 . die von der Klasse abgeleitet wurde. Werte und Ablaufprozeduren enthalten kann. Die Art und Weise. und Sie finden sie in der Datei Samples\ASA\Java\Tjava. indem sie einmal in den Speicher geladen wird und eine genau vorgegebene Abwicklungsfolge einhält. weil sie alle zu einer bestimmten. Eine in einer prozeduralen Sprache geschriebene Anwendung wird ausgeführt. Eine instanzierte Klasse wird "Objekt" genannt: Dabei handelt es sich um eine Anwendung.pdf. wobei jede Instanz der Klasse eigene Daten. Sie gehört zum Lieferumfang von Adaptive Server Anywhere. wie eine Klasse benutzt wird. Dies ist natürlich keine erschöpfende Behandlung der JavaSprache. und daher gibt es den Zugriffsmodifizierer protected. Ein Glossar der Java-Begriffe Im folgenden Abschnitt werden einige Begriffe im Zusammenhang mit JavaKlassen erklärt. Eine Java-Klasse ist im Prinzip eine Sammlung von Prozeduren und Variablen. Eine Klasse. die zum Ausführen in den Speicher geladen wurde. Pakete Ein Paket ist eine Gruppe von Klassen. $ Weitere Hinweise über die Sprache Java finden Sie in der OnlineDokumentation Thinking in Java von Bruce Eckel.

72 .jar oder . mit der Erweiterung . private oder protected vor jeder Deklaration) bestimmt die Sichtbarkeit eines Feldes. Java-Klassen können ihre eigene Abschluss-Methode ("finalize") für das Aufräumen definieren. Methoden oder Felder sind überall sichtbar. die mit der import-Anweisung verfügbar gemacht werden können. wenn eine Instanz der Klasse erstellt wird. einer Methode oder einer Klasse für andere Java-Objekte. in Unterklassen dieser Klassen oder in anderen Klassen des selben Pakets definiert wurden. Sammlung der Abfalldaten Die Abfalldatensammlung entfernt automatisch alle Objekte. Mit private bezeichnete Klassen. Mit protected bezeichnete Methoden oder Felder sind für Methoden sichtbar. darunter mehrfache. die als Werte in einer Tabelle gespeichert sind. ♦ Konstruktoren Ein Konstruktor ist eine spezielle Methode einer Java-Klasse.* Pakete werden normalerweise in JAR-Dateien gespeichert. die innerhalb dieser Klasse. nachdem ein Objekt nach der Abfalldatensammlung entfernt wurde.zip. Methoden oder Felder sind nur in Methoden sichtbar. mit Ausnahme der Objekte. "Public" und "Private" Ein Zugriffsmodifizierer (im Wesentlichen die Schlüsselwörter public. dass die Methoden oder Felder innerhalb der Klasse oder für andere Klassen im Paket sichtbar sind.Ein Java-Seminar Ein Paket ist in Java das. was sonst unter einer Bibliothek oder Library bekannt ist. In Java gibt es keine Destruktorenmethode wie in C++. die Anzahl und die Reihenfolge der Argumente. die aufgerufen wird. Welcher Konstruktor verwendet wird. hängt davon ab. die in dieser Klasse definiert wurden. einander aufhebende Konstruktoren. welche Argumente beim Versuch der Erstellung des Objekts verwendet wurden. Wenn der Typ. für die keine Referenzen bestehen. um das Objekt zu erstellen.util. zu einem der Konstruktoren der Klasse passen. Es handelt sich dabei um eine Sammlung von Klassen. Die folgende Java-Anweisung importiert die Dienstprogramm-Bibliothek aus der JavaAPI: import java. wird dieser Konstruktor verwendet. ♦ ♦ ♦ Mit public bezeichnete Klassen. Die Standardsichtbarkeit (Paket) bedeutet. Klassen können ihre eigenen Konstruktoren definieren. die für die Erstellung einer Instanz der Klasse verwendet werden.

die ihre eigenen benutzerdefinierten Klassen auswerfen können. Normalerweise werden Fehler vom Typ "Exception" durch Fehlerroutinen im Hauptteil der Methode verarbeitet. Sowohl Java-API-Klassen. Die Verarbeitungsroutinen bei Ausnahmefehlern werden durch die Codeblöcke try. Wenn die Spitze des Aufrufstacks erreicht ist und noch immer keine Ausnahmeroutine gefunden wurde. keine Ausnahmeroutine vorgesehen ist. catch und finally gekennzeichnet. wird die Suche nach einer Ausnahmeroutine über den kompletten Aufrufstack fortgesetzt. Wenn im Hauptteil der Methode. das den Fehler darstellt. Fehler vom Typ "Error" sind für interne Fehler und Fehlerbedingungen wegen Ressourcenmangel im Java-Laufzeitsystem vorgesehen. erfolgt in der Klasse. Fehlertypen in Java Alle Fehler in Java werden aus zwei Arten von Fehlerklassen abgeleitet: Ausnahme (Exception) und Fehler (Error). in der der Ausnahmefehler auftrat. als auch benutzerdefinierte Klassen können einen Ausnahmefehler auswerfen. wird ein SQL-Fehler generiert. Eine Schnittstelle definiert. Jede Schnittstelle definiert eine Reihe von Methoden und Methodenprofilen. die von der Klasse implementiert werden müssen. was die Klasse deklarieren muss. wenn sie nicht in der Anwendung abgefangen und entsprechend verarbeitet wird. Eine Klasse kann mehrere Schnittstellen implementieren. Benutzer können ihre eigenen Ausnahmeklassen erstellen. Dies wird als throwing an exception (Ausnahmefehler auslösen) bezeichnet. festzulegen. Ausnahmebedingungsfehler werden ausgeworfen und abgefangen. wie die Implementierung vor sich geht. Fehler generieren ein Ausnahmebedingungsobjekt. welche Methoden und statischen Felder die Klasse deklarieren muss. wird die Standard-Ausnahmeroutine des Java-Interpreters aufgerufen und das Programm beendet. und es obliegt der Klasse. 73 .Kapitel 3 Einführung in Java für Datenbanken Schnittstellen oder Interfaces Java-Klassen können nur von einer Klasse erben. Fehlerbehandlung in Java Der Fehlerbehandlungscode ist in Java von der normalen Verarbeitung getrennt. Die Implementierung der Methoden und Felder. die die Schnittstelle benutzt: Die Schnittstelle definiert. In Adaptive Server Anywhere gilt: Wenn eine SQL-Anweisung eine JavaMethode aufruft. die in einer Schnittstelle deklariert werden. Eine ausgelöste Ausnahmebedingung beendet ein Java-Programm. Java benutzt Interfaces (Schnittstellen) anstelle von mehrfacher Vererbung. damit die Klasse kompiliert werden kann.

die die Auswurfmethode für den Fehler benutzt. Wenn der Typ des ausgeworfenen Fehlers nicht erfasst ist. der Fehler muss aber nicht Teil der Deklaration der Klasse oder Methode sein. der einen Fehler generieren kann. oder diese Klasse muss explizit den Fehler selbst auswerfen. oder alle expliziten Fehler abfangen. Ausnahmebedingungsfehler werden in zwei Typen unterteilt: Laufzeitfehler und Nicht-Laufzeitfehler. Im Wesentlichen heißt das: Explizite Ausnahmebedingungen müssen explizit behandelt werden. in ihrer Klassendeklaration identifiziert wird. Alle anderen Ausnahmebedingungen sind explizit. wenn ein Fehler während der Ausführung eines try-Blocks generiert (ausgeworfen) wird. da sie nicht explizit als Teil jeder Klassen.Ein Java-Seminar Ein try-Block führt einen Programmcode aus. die dieses Array benutzen. Nicht-Laufzeitfehler werden zum Kompilierungszeitpunkt geprüft. indem die Ausnahmebedingung. 74 . bevor der Code ausgeführt wird. Er wird für Code benutzt. muss der Fehler explizit von der Klasse abgefangen werden. auch wenn der normale Abschluss nicht möglich ist. die vom Laufzeitsystem generiert wurden. Ein finally-Block definiert einen Codeblock. Beispiel: Der Ausnahmefehler "array out of bounds" kann auftreten. Eine Methode muss alle expliziten Fehler deklarieren. Ein catch-Block ist ein Codeteil. ob ein Fehler generiert und abgefangen wurde. die generiert werden könnte. Java erkennt viele dieser Fehler während der Kompilierung. der unter keinen Umständen ausgelassen werden darf. sodass alle Java-Methoden abgeschlossen werden können. wird er an den nächsten Code-Block oder die nächste Methode im Stack weitergereicht. Fehler. Wenn die aufgerufene Methode einen Ausnahmefehler auswerfen kann. der unabhängig davon ausgeführt wird. Für jede Java-Methode wird ein alternativer Ausführungspfad definiert. sind als implizite Ausnahmefehler bekannt.oder Methodendeklaration verarbeitet werden müssen. wenn ein Array benutzt wird. der ausgeführt wird. die möglicherweise ausgeworfen werden. die sie auswirft. Laufzeitfehler werden normalerweise durch Programmierungsfehler verursacht. Typischerweise wird er für Aufräumroutinen verwendet.

1 programmiert wurde. finden Sie unter "Datenbank für Java aktivieren" auf Seite 97.8.B. Unterstützte Versionen von Java und JDBC Die Sybase Java VM bietet die Auswahl zwischen den Programmierschnittstellen JDK 1.Kapitel 3 Einführung in Java für Datenbanken Die Laufzeitumgebung für Java in der Datenbank In diesem Abschnitt wird die Sybase-Laufzeitumgebung für Java beschrieben.1 wurden einige neue APIs eingeführt. die für eine Datenbank verfügbar gemacht werden. die Java unterstützt.2.1. die gemäß den Standards der Version 1. der Sybase VM.0 des JDK und Version 1. Diese Klassen sind Teil des Sun Java Development Kit. $ Weitere Hinweise zu den unterstützten JDK APIs finden Sie unter "Unterstützte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch. Die Laufzeit-Klassen bieten Funktionen. Die Verwendung bestimmter APIs wird nicht länger empfohlen. Die Laufzeit-Klassen sind für Klassen in der Datenbank immer verfügbar. und die Unterstützung dieser APIs könnte in kommenden Versionen nicht mehr gesichert sein. $ Hinweise zum Erstellen einer Datenbank. kann aber auf einer Java Virtual Machine ausgeführt werden. Die Laufzeit-Java-Klassen Die Laufzeit-Java-Klassen sind die Klassen der niedrigen Stufe. 75 . wenn Sie erstellt oder für Java aktiviert wird. Diese Klassen enthalten eine Teilmenge der Java-API.3.3.1. die nicht mehr empfohlene API verwendet. wie z. Der interne JDBC-Treiber unterstützt JDBC Version 2. und 1. Eine Java-Klassendatei. JDK 1. auf denen Anwendungen aufbauen können. und JDK 1. Die tatsächlich gelieferte Version ist JDK 1. Zwischen Version 1. generiert beim Kompilieren eine Warnung. und wie sie sich von einer Standard-Java-Laufzeitumgebung unterscheidet. Außerdem wurden einige APIs entfernt.

Die Laufzeitumgebung für Java in der Datenbank Sie können die Laufzeit-Java-Klassen in Ihre eigenen benutzerdefinierten Klassen einbeziehen: Entweder. JDBC für SQL-Vorgänge Das Paket java. StringTokenizer Diese Klasse zerlegt eine Zeichenfolge in Einzelwörter. ♦ Das Dienstprogramm-Paket Das Paket java. Beispiele Einige Java-API-Klassen.Integer. $ Hinweise zur Installation von Klassen finden Sie unter "Java-Klassen in einer Datenbank installieren" auf Seite 103. Zu diesen Klassen gehören: ♦ ♦ ♦ ♦ ♦ Hashtable Eine Zuordnung von Schlüsseln und Werten. um Daten mit SQL-Anweisungen aus der Datenbank zu extrahieren. Nach ihrer Installation stehen sie anderen Klassen in der Datenbank zur Verfügung. Vector Diese Klasse enthält ein Array von Objekten. die in den Laufzeit-Java-Klassen enthalten sind: ♦ Primitive Java-Datentypen Alle "primitiven" (nativen) Datentypen in Java haben eine entsprechende Klasse. deren Funktionen keine Entsprechung in den SQL-Funktionen haben.* enthält die Klassen die von Java-Objekten benötigt werden. Benutzerdefinierte Klassen Benutzerdefinierte Klassen werden in einer Datenbank mit der Anweisung INSTALL installiert.SQL. Stack Diese Klasse enthält einen Last-in-First-out-Stack von Objekten.lang. indem sie deren Funktionen erben oder indem Sie sie bei einer Berechnung oder einem Vorgang in einer Methode verwenden. Anders als benutzerdefinierte Klassen werden die Laufzeitklassen in der Datenbank nicht gespeichert.util. stehen Sie für SQL als Domänen zur Verfügung. Sie werden vielmehr im Unterverzeichnis java des Adaptive Server Anywhere-Installationsverzeichnisses gespeichert.* enthält eine Reihe von sehr hilfreichen Klassen. oft sehr nützliche Funktionen. deren Größe sich dynamisch ändern kann. haben die Klassen zusätzliche. Der Java-Datentyp int hat eine entsprechende Klasse in java. welche in Adaptive Server Anywhere verfügbar sind. Wenn es sich um öffentliche Klassen handelt. Um Objekte dieser Typen zu erstellen. 76 .

Random(). Die Verwendung von >> beseitigt diese Zweideutigkeit. Der Punktoperator ist für Java passender. SET rnd = NEW java. SELECT rnd>>nextInt().util. der die Methoden aufruft oder auf die Felder einer Java-Klasse oder eines Java-Objekts zugreift.util. Im nachstehenden Java-Codefragment ist der Punkt in der ersten Zeile ein Bezeichner.Random rnd = new java.lang. die im vorhergehenden SQL-Beispiel erstellt wurde. In der zweiten Zeile des Programmcodes ist er ein Operator. >> in SQL ist nicht dasselbe wie >> in Java Die doppelte geschlossene spitze Klammer wird nur in SQLAnweisungen verwendet. wo sonst ein Java-Punktoperator erwartet wird.Kapitel 3 Einführung in Java für Datenbanken Java-Methoden und Felder identifizieren Der Punkt in SQL In SQL-Anweisungen identifiziert der Punkt Spalten von Tabellen.nextInt(). zeigt die folgende SQL-Anweisung die richtige Verwendung einer Klassenmethode: SELECT java. 77 .emp_id FROM employee Der Punkt kennzeichnet auch die Eigentümerschaft in qualifizierten Objektnamen: SELECT emp_id FROM DBA. wie zum Beispiel in der folgenden Abfrage: SELECT employee. Das Ergebnis der SELECT-Anweisung ist eine zufallsgenerierte Ganzzahl.Hashtable. In einer Java-Klasse ist die doppelte geschlossene spitze Klammer kein Ersatz für den Punktoperator und hat eine vollständig andere Bedeutung in ihrer Rolle als rechter Bitverschiebungs-Operator.employee Der Punkt in Java In Java ist der Punkt ein Operator. Aufruf von JavaMethoden aus SQL In SQL kann der Punktoperator durch eine doppelte geschlossene spitze Klammer (>>) ersetzt werden.Random(). um Klassennamen zu kennzeichnen. der benutzt wird.Math>>abs( rnd>>nextInt() ). int i = rnd. Die folgende SQL-Anweisungsfolge ist beispielsweise gültig: CREATE VARIABLE rnd java.Random.util. Er ist auch Teil eines Bezeichners. java.util.util. kann aber bei bestehenden SQL-Namen zu Verwechslungen führen. Unter Verwendung der Variablen. wie im voll qualifizierten Klassennamen java.

als auch SQL-Syntax enthält.Math. Die Berücksichtigung von Groß-/Kleinschreibung durch Java wird auch beibehalten. Die Java-Klasse FindOut ist nicht dasselbe wie die Klasse Findout. auch wenn im restlichen Teil der SQL-Anweisung die Groß-/Kleinschreibung nicht einheitlich ist. Trotzdem wird die Groß/Kleinschreibung immer berücksichtigt. wie in der folgenden SQL-Anweisung: INSERT INTO TABLE DBA.lang. Klassen und Operatoren respektiert wird. Datentypen Wenn eine Java-Klasse als Datentyp für eine Spalte verwendet wird. wenn dieselbe SQL-Anweisung sowohl Java. Java berücksichtigt die Groß/Kleinschreibung. wie im folgenden Java-Programmfragment gezeigt wird: String str = "Dies ist eine Zeichenfolge" In SQL werden Zeichenfolgen hingegen mit Apostrophen gekennzeichnet. auch wenn die Teile vor und nach der Java-Syntax ohne Berücksichtigung der Schreibweise programmiert werden können.random(). Dies ist eine einfache Feststellung. erfolgt dies in Form eines benutzerdefinierten SQL-Datentyps. Diese Konvention verhindert Zweideutigkeiten mit Java-Klassen. die sich nur durch die Groß-/Kleinschreibung voneinander unterscheiden. Beispielsweise werden die nachstehenden SQL-Anweisungen erfolgreich ausgeführt. Die folgenden SQL-Anweisungen sind beispielsweise gültig. 78 . SQL berücksichtigt die Groß-/Kleinschreibung bei Schlüsselwörtern und Bezeichnern nicht. SeLeCt java. da die Schreibweise der Java-Objekte. Dies bleibt auch so.t1 VALUES( ’Hallo’ ) In Java-Quellcode müssen Sie immer Anführungszeichen verwenden. und Anführungszeichen kennzeichnen einen Bezeichner. wie Sie es von ihr erwarten. wenn der Java-Code in eine SQL-Anweisung eingebettet ist. Die Java-Teile der Anweisung müssen die Groß/Kleinschreibung berücksichtigen. und SQL-Syntax wird durch das Vorhandensein von Java-Klassen nicht verändert. Zeichenfolgen in Java und SQL Mit Anführungszeichen werden Zeichenfolgenliterale in Java gekennzeichnet. aber mit weit reichenden Auswirkungen. in SQL-Anweisungen hingegen Apostrophe.Die Laufzeitumgebung für Java in der Datenbank Java berücksichtigt Groß/Kleinschreibung Java-Syntax funktioniert so. die die Groß-/Kleinschreibung nicht berücksichtigt.

die vom JavaInterpreter aufgerufen wurde. so dass die Zeichenfolge dort erscheint. automatisch ausgeführt.String( "Brandneues Objekt" ). das von der Methode akzeptiert wird.String( ’Brandneues Objekt’ ) Das folgende Java-Codefragment ist auch gültig. wenn Sie das Sun Java Laufzeitsystem starten. in die Standardausgabe geschrieben. System. In Adaptive Server Anywhere ist das Serverfenster die Standardausgabe. Die Funktionen der Objekte und Methoden können mit SQLAnweisungen unmittelbar und dynamisch getestet werden. dass diese Methode als erste aufgerufen wird. wird sie von den meisten Java-Laufzeitumgebungen.Kapitel 3 Einführung in Java für Datenbanken CREATE VARIABLE str char(20). die zur folgenden Deklaration passt. wenn sie die Klasse ist.out. String str = new java. wenn es in einer JavaKlasse verwendet wird. 79 . Normalerweise wird diese statische Methode nur ausgeführt. wie zum Beispiel vom Sun Java-Interpreter.lang. public static void main( String args[ ] ) { } Die Hauptklasse ist eine nützliche Klasse für das Austesten der Funktionen von Java-Objekten: Sie können immer sicher sein. set str = new java.lang. String str = "Hallo Welt".println( str ). In vielerlei Hinsicht ist diese Methode für das Testen von Java-Klassen-Funktionen viel flexibler. Bei Erkennung der Methode in der zweiten Zeile des folgenden Java-Codefragments wird das Zeichenfolgenargument. Ausgabe in die Befehlszeile Die Ausgabe in die Standardausgabe ist eine Technik für die schnelle Prüfung von Variablenwerten und Ausführungsergebnissen an bestimmten Stellen im Programmcode. Die Ausführung des oben angegebenen Java-Programmcodes in der Datenbank ist der folgenden SQL-Anweisung gleichwertig: MESSAGE ’Hallo Welt’ Hauptmethode (main) verwenden Wenn eine Klasse eine main-Methode enthält. In Adaptive Server Anywhere ist das Java-Laufzeitsystem jederzeit verfügbar.

lang. wo Sie SQL-Anweisungen ausführen können. $ Weitere Hinweise über die Regeln für SQL-Zeichenfolgen finden Sie unter "Zeichenfolgen" auf Seite 10 der Dokumentation ASA SQLReferenzhandbuch. $ Weitere Hinweise zum Entfernen von Klassen finden Sie unter "REMOVE-Anweisung" auf Seite 547 der Dokumentation ASA SQLReferenzhandbuch.abs(-342) Ein Java-Objekt ist nur in zwei Formen verfügbar: als Wert einer Variablen oder als Wert in einer Tabelle. bis sie explizit durch eine REMOVE-Anweisung entfernt werden. 80 . Select java.Die Laufzeitumgebung für Java in der Datenbank Bereich und Dauerhaftigkeit (Persistenz) SQL-Variable sind nur so dauerhaft wie die Verbindung. der ein Zeichen für Neue Zeile und ein Tabulatorzeichen vor einem Satz einführt. der ein Apostroph enthält. String str = "\n\t\Eine Zeichenfolge ist\’s. das Java-Escapezeichen hingegen nicht. Java-Escapezeichen in SQL-Anweisungen Im Java-Programmcode können Sie Escapezeichen verwenden. um bestimmte Sonderzeichen in Zeichenfolgen einzufügen. gleichgültig ob sie Daten enthalten oder niemals benutzt werden. die in einer Datenbank installiert wurden. bis sie gelöscht werden. ob die Variable eine Java-Klasse oder ein nativer SQL-Datentyp ist. die fehlte!’. Java-Klassen. Sie können die folgende Anweisung überall ausführen.Math. sind ähnlich: Man kann sie benutzen.str = ’\nDie Zeichenfolge ist’’s. set obj. die mir fehlt". die für Zeichenfolgen in SQL gelten: Beispiel: Um einen Zeichenfolgenwert an ein Feld zu übergeben. kann folgende Anweisung benutzt werden. Ein Beispiel ist der folgende Programmcode. das eine SQL-Anweisung benutzt. Dies ist nicht anders als bei früheren Versionen von Adaptive Server Anywhere und wird auch nicht davon berührt. Aus SQL müssen hingegen die Regeln befolgt werden. Die Verwendung von Java-Escapezeichen ist im Adaptive Server Anywhere nur erlaubt. Die Dauerhaftigkeit (oder "Persistenz") von Java-Klassen entspricht der der Tabellen in einer Datenbank: Tabellen existieren in einer Datenbank so lange. Eine Klassenmethode in einer installierten Java-Klasse kann jederzeit aus einer SQL-Anweisung aufgerufen werden. wenn sie von Java-Klassen benutzt werden.

Eine von einer anderen Klasse explizit mit einem voll qualifizierten Namen oder implizit mit einer Import-Anweisung referenzierte Klasse muss ebenfalls in der Datenbank installiert sein.util. 01) Die Variable dt enthält jetzt das Datum: November 22. SET dt = NEW java. um anzuzeigen."Date". 11.util. 81 . und Einschluss der folgenden ImportAnweisung: import java. auch wenn es gleichzeitig der Name einer Java-Klasse ist. 1997. wie z."Date"(1997.util auf zwei Arten referenzieren: ♦ ♦ Explizit mit dem Namen java.* ist. wenn der Name einer Klasse. externe Klassen einzubeziehen.m.util.B. 4:11 p. der Klasse "Date".*. können Sie Anführungszeichen verwenden. weil das Wort "Date" in Anführungszeichen steht.Diese Anweisung ist unzulässig CREATE VARIABLE dt java. da "Date" ein Schlüsselwort und seine Verwendung für SQL reserviert ist. dass Sie das betreffende Wort nicht mehr als für SQL reserviertes Wort verwenden. in einer Java-Klassen-Deklaration eine ImportAnweisung für den Zugriff auf andere. 11. Dies tritt ein.Date Die folgenden beiden Anweisungen funktionieren hingegen richtig. Sie können importierte Klassen mit unqualifizierten Klassennamen referenzieren.util.util.Stack Oder mit dem Namen Stack. -. Import-Anweisungen verwenden Es ist allgemein üblich. die ein Teil des Pakets java. Beispiel: Die folgende SQL-Anweisung verursacht einen Fehler. referenziert wird. Die Klassen weiter oben in der Hierarchie müssen ebenfalls installiert sein. 22. einschließlich API-Klassen stehen. 16. Beispiel: Sie können die Stack-Klasse des Pakets java. SQL reserviert das Wort Date für den Einsatz als Schlüsselwort. CREATE VARIABLE dt java. Wenn solche Zweideutigkeiten auftreten.Kapitel 3 Einführung in Java für Datenbanken Schlüsselwortkonflikte SQL-Schlüsselwörter können im Konflikt mit Namen von Java-Klassen.util.

io.String. muss den Standort des JavaVerzeichnisses. und nicht in externen Dateien oder Archiven gespeichert sind. die im Java-Programmcode angesprochen werden.Die Laufzeitumgebung für Java in der Datenbank Die Import-Anweisung funktioniert in kompilierten Klassen wie beabsichtigt. in dem die Java-Klassendeklaration kompiliert werden soll. Beispiel: Um eine Variable des Typs "Zeichenfolge" zu erstellen. enthalten.io zu verwenden.io ohne voll qualifizierten Namen referenziert werden. findet Adaptive Server Anywhere die Datei und installiert die Klasse. Alle Klassennamen. die in SQL-Anweisungen oder in gespeicherten Prozeduren verwendet werden. müssen voll qualifiziert sein. 82 . gibt aber nur den Namen der Datei an. Eine classpath-Variable stellt eine Verbindung zwischen dem Java-Programmcode und dem tatsächlichen Dateipfad oder dem URL der referenzierten Klassen her. wird diese Klasse mit dem voll qualifizierten Namen referenziert: java. um Klassen aus dem Paket java. Die Umgebungsvariable classpath auf dem System. also des Stammverzeichnisses des Pakets java.class’ Wenn die angegebene Datei in einem Verzeichnis oder in einer ZIP-Datei liegt. Zum Beispiel können mit import java. nicht ihren vollen Suchpfad plus Namen. Beispiel: Die folgende Anweisung installiert eine benutzererstellte Java-Klasse in der Datenbank. da die Klassen in der Datenbank.lang. Die Variable classpath kann jedoch verwendet werden. CLASSPATH während der Laufzeit ignoriert CLASSPATH zur Installation von Klassen Die Umgebungsvariable classpath beeinträchtigt die Laufzeitumgebung von Adaptive Server Anywhere für Java nicht während des Ausführens von JavaVorgängen. die von der Umgebungsvariablen classpath definiert wurden. um Klassen zu ermitteln. dass in dieser Anweisung keine JavaVorgänge enthalten sind. In der Laufzeitumgebung von Adaptive Server Anywhere gibt es allerdings keine der Import-Anweisung gleichwertige Anweisung.* alle Klassen im Paket java. (Beachten Sie. CLASSPATH-Variable verwenden Die Java-Laufzeitumgebung von Sun und der Sun JDK Java Compiler benutzen die classpath-Umgebungsvariable. um den Standort einer Datei während der Installation von Klassen zu ermitteln.io.) INSTALL JAVA NEW FROM FILE ’Invoice. Nur der Klassenname ist im folgenden Java-Code erforderlich.

ihre Hauptwerte in ihren Feldern auswirft. Methoden enthalten Berechnungsautomation und Logik. die mit diesen Feldern arbeiten. Viele Beispiele. die in dieser Dokumentation verwendet werden. Die Verwendung öffentlicher Felder in Adaptive Server Anywhere bietet Performancevorteile gegenüber der Verwendung öffentlicher Methoden. geben Felder als "public" an. dass eine benutzererstellte Java-Klasse.Kapitel 3 Einführung in Java für Datenbanken Öffentliche Felder Beim objektorientierten Programmieren ist es allgemein üblich. Die in dieser Dokumentation allgemein eingehaltene Konvention besteht darin. sodass die Beispiele kompakter und leichter zu lesen sind. die für den Einsatz in Adaptive Server Anywhere gedacht ist. Klassenfelder als "private" zu definieren und ihre Werte nur über öffentliche Methoden verfügbar zu machen. 83 .

Praktische Einführung: Eine Übung mit Java in der Datenbank Praktische Einführung: Eine Übung mit Java in der Datenbank Diese praktische Einführung soll die Grundlagen für den Aufruf von JavaVorgängen mit Java-Klassen und Objekten über SQL-Anweisungen vermitteln. Ressourcen Beispiel-Java-Klasse erstellen und kompilieren Der erste Schritt besteht darin. dass Java in der DatenbankSoftware installiert wurde. Es wird beschrieben. Anforderungen Die praktische Einführung geht davon aus. In der praktischen Einführung wird die in "Ein Java-Seminar" auf Seite 64 erstellte Klasse verwendet. v So wird die Klasse erstellt und kompiliert: 1 Erstellen Sie eine Datei mit dem Namen Invoice. einschließlich dem Java Compiler (javac).java mit dem folgenden Code: 84 . Dies geschieht außerhalb der Datenbank. Quellcode und Anweisungsfolgen für dieses Beispiel finden Sie im Verzeichnis Samples\ASA\JavaInvoice in Ihrem SQL AnywhereVerzeichnis. dass Sie ein Java Development Kit (JDK) installiert haben. wie auf die Klasse und ihre Mitglieder und Methoden von SQL-Anweisungen aus zugegriffen wird. Darüber hinaus wird beschrieben. wie Java-Klassen in der Datenbank installiert werden. Außerdem wird vorausgesetzt. den Java-Code zu schreiben und zu kompilieren.

Kapitel 3 Einführung in Java für Datenbanken public class Invoice { // Felder public String lineItem1Description. 85 . runningsum = runningsum * taxfactor. javac *. } // Eine Klassenmethode public static double rateOfTaxation() { double rate. Sie können Java-Klassen aus Sybase Central oder Interactive SQL installieren. 2 Kompilieren Sie die Datei. // Eine Instanzmethode public double totalSum() { double runningsum. runningsum = lineItem1Cost + lineItem2Cost.15. rate = . Beispiel-Java-Klasse installieren Java-Klassen können erst verwendet werden. return rate.java den folgenden Befehl aus.java Die Klasse ist jetzt kompiliert und kann in der Datenbank installiert werden.class erstellt wird. Führen Sie von der Befehlszeile im selben Verzeichnis wie Invoice. public String lineItem2Description. Wählen Sie selbst.java in Ihrem SQL AnywhereVerzeichnis. return runningsum. double taxfactor = 1 + Invoice. damit die Datei Invoice. Dieser Abschnitt enthält Anweisungen für beide Möglichkeiten. public double lineItem2Cost. } } Den Quellcode für diese Klasse finden Sie in der Datei Samples\ASA\JavaInvoice\Invoice. nachdem sie in einer Datenbank installiert wurden. public double lineItem1Cost.rateOfTaxation().

damit der Assistent geschlossen wird. In einer Klassendatei durchgeführte Änderungen werden nicht automatisch auch in die Kopie der Klasse in der Datenbank übertragen. 3 4 v So installieren Sie die Klasse in der Beispieldatenbank (Interactive SQL): 1 2 Starten Sie Interactive SQL und stellen Sie eine Verbindung mit der Beispieldatenbank her. Klicken Sie auf "Fertig stellen". INSTALL JAVA NEW FROM FILE ’Suchpfad\\samples\\ASA\\JavaInvoice\\Invoice. Hinweise ♦ Bis jetzt haben in der Datenbank keine Java-Vorgänge stattgefunden. Geben Sie im Fensterausschnitt "SQL-Anweisungen" in Interactive SQL den folgenden Befehl ein. Sie kann nun als Datentyp einer Variablen oder Spalte in einer Tabelle verwendet werden. Öffnen Sie den Ordner "Java-Objekte" und doppelklicken Sie auf "JavaKlasse hinzufügen". Die Klasse wurde in der Datenbank installiert. wenn die Änderungen wiedergegeben werden sollen. Klicken Sie auf die Schaltfläche "Durchsuchen" und wechseln Sie zur Klasse Invoice. 86 .class im Unterverzeichnis Samples\ASA\JavaInvoice in Ihrem Installationsverzeichnis von SQL Anywhere. Der Assistent für die Erstellung von Java-Klassen wird angezeigt. ♦ $ Weitere Hinweise zur Installation der Klassen und zur Aktualisierung einer installierten Klasse finden Sie unter "Java-Klassen in einer Datenbank installieren" auf Seite 103. Sie müssen die Klassen neu installieren.class’ wobei Suchpfad Ihr SQL Anywhere-Verzeichnis ist.Praktische Einführung: Eine Übung mit Java in der Datenbank v So installieren Sie die Klasse in der Beispieldatenbank (Sybase Central): 1 2 Starten Sie Sybase Central und stellen Sie eine Verbindung zur Beispieldatenbank her. Die Klasse ist jetzt in der Beispieldatenbank installiert.

Kapitel 3 Einführung in Java für Datenbanken SQL-Variable vom Typ "Invoice" erstellen In diesem Abschnitt wird eine SQL-Variable erstellt. 87 . Die Variable Inv hat jetzt eine Referenz auf das Java-Objekt. genauso geschrieben werden müssen wie gezeigt. Zur Überprüfung können Sie die Anweisung aus Schritt 2 ausführen. 'Variable ist nicht null: enthält eine Objektreferenz') Die Variable referenziert derzeit kein Objekt. 1 Führen Sie von Interactive SQL aus die folgende Anweisung aus und erstellen Sie eine SQL-Variable mit dem Namen Inv vom Typ Invoice. Sie müssen die Klasse Invoice mit dem Schlüsselwort NEW instanzieren. 3 Weisen Sie Inv einen Wert zu. die Java-Syntax beinhalten. SET Inv = NEW Invoice(). sodass die Teile der nachstehenden Beispiele. die sich auf ein JavaObjekt vom Typ Invoice bezieht. ’Kein Objekt referenziert’. 2 Führen Sie die folgende Anweisung aus. wobei Invoice die Java-Klasse ist. Mit dieser Referenz können Sie auf viele Felder des Objekts zugreifen oder eine ihrer Methoden aufrufen. select IfNull(Inv. damit der aktuelle Wert der Variablen Inv identifiziert wird. die Sie in der Datenbank installiert haben: CREATE VARIABLE Inv Invoice Nach dem Erstellen einer Variablen kann ihr erst dann ein Wert zugewiesen werden. Die Variable Inv enthält eine Referenz auf ein Java-Objekt vom Typ Invoice. Anfangs ist die Variable Inv gleich NULL. Im vorliegenden Fall kann die Variable Inv nur eine Referenz auf ein Objekt des Typs Invoice oder eine Unterklasse von Invoice enthalten. Die SQL-Syntax wird mit Großbuchstaben geschrieben. Berücksichtigung von Groß-/Kleinschreibung Java berücksichtigt die Groß/Kleinschreibung. wenn Datentyp und deklarierter Datentyp identisch sind oder wenn der Wert eine Unterklasse des deklarierten Datentyps ist. weil kein Wert an sie weitergeleitet wurde.

Führen Sie die folgende SQL-Anweisung aus und lassen Sie die obigen SQL-Anweisungen ausführen. v So rufen Sie die Methoden des Objekts "Invoice" auf: ♦ Führen Sie von Interactive SQL aus die folgende SQL-Anweisung aus.lineItem2Description. Sie gibt die Summe der beiden Kostenfelder plus der Steuer zurück. SELECT Inv.lineItem2Description = ’Heugabel’.lineItem2Cost.Praktische Einführung: Eine Übung mit Java in der Datenbank Auf Felder und Methoden des Java-Objekts zugreifen Wenn eine Variable (oder ein Spaltenwert in einer Tabelle) eine Referenz auf ein Java-Objekt enthält. SET Inv. das von der Variablen Inv referenziert wird. SELECT Inv. deren Werte durch SQL-Anweisungen festgelegt werden können. und ihre Methoden sind aufrufbar. das durch Inv referenziert wird. das von Inv referenziert wird. Jede nachstehende SQL-Anweisung gibt den aktuellen Wert eines Feldes im Java-Objekt zurück. SET Inv. 2 Führen Sie SELECT-Anweisungen mit der Variablen aus. 88 . Zusätzlich zu den öffentlichen Feldern hat die Klasse Invoice eine Instanzmethode.lineItem2Cost.lineItem1Description. die die Methode totalSum() des Objekts aufruft.lineItem1Cost. Jede der oben stehenden SQL-Anweisungen gibt einen Wert an ein Feld im Java-Objekt weiter. SET Inv. 3 Verwenden Sie ein Feld der Variablen Inv in einem SQL-Ausdruck. die Sie aufrufen können.49’. SELECT * FROM PRODUCT WHERE unit_price < Inv.lineItem1Cost = ’79.99’. SELECT Inv. damit die Feldwerte für die Variable Inv gesetzt werden. Beispiel: Eine Variable vom Typ "Invoice". SET Inv. enthält eine Referenz auf ein Objekt Invoice und hat vier Felder.lineItem2Cost = ’37. die Sie im vorigen Abschnitt erstellt haben. SELECT Inv.lineItem1Description = ’Gummistiefel’. v So greifen Sie auf die Felder des Objekts "Invoice" zu: 1 Führen Sie von Interactive SQL die folgenden SQL-Anweisungen aus. können den Feldern des Objekts Werte übergeben werden.

Eine Klassenmethode kann aufgerufen werden. SELECT Inv. Dies stimmt mit der Art überein. Die Klammern werden verwendet. während für eine Methode die VM benötigt wird. auch wenn kein auf dieser Klasse basierendes Objekt instanziert wurde. auch wenn sie in SQL-Anweisungen verwendet werden. Die Methode totalSum() akzeptiert keine Argumente. die eine Referenz auf ein Invoice-Objekt enthält. Führen Sie von Interactive SQL die folgende SQL-Anweisung aus. nutzt die totalSum-Instanzenmethode die Klassenmethode rateOfTaxation.rateOfTaxation(). Für den Zugriff auf ein Feld ist der Aufruf der Java VM nicht erforderlich. wie Java Klassenmethoden verarbeitet.rateOfTaxation(). und nicht der Name einer Variablen. 89 . obwohl die Methode keine Argumente annimmt. v So wird die Klasse "Invoice" in einer Tabelle verwendet: 1 Tabelle mit einer Spalte vom Typ Invoice erstellen. Auf diese Klassenmethode kann direkt aus einer SQL-Anweisung zugegriffen werden. können aber immer noch für ein Objekt aufgerufen werden. Java-Objekte in Tabellen speichern Wenn eine Klasse in einer Datenbank installiert wird. um die Methode auszuführen. da eine Java-Operation aufgerufen wird.totalSum(). Klassenmethoden benötigen keine Instanz der Klasse. sondern gibt einen Wert zurück. um richtig zu funktionieren. Die folgende SQL-Anweisung bringt dieselben Ergebnisse wie die vorher ausgeführte SQL-Anweisung. SELECT Invoice.Kapitel 3 Einführung in Java für Datenbanken SELECT Inv. steht sie als neuer Datentyp zur Verfügung. Methoden aufrufen und Felder referenzieren Hinter Methodennamen stehen immer Klammern. Wie in der am Anfang dieses Kapitels beschriebenen InvoiceKlassendefinition gezeigt. Beachten Sie. Bei Java in der Datenbank ist der direkte Feldzugriff schneller als der Aufruf von Methoden. auch wenn sie keine Argumente annehmen. Dann können Sie ein Java-Objekt erstellen und es als Wert einer Spalte in eine Tabelle einfügen. Spalten in einer Tabelle können den Typ Javaclass haben. dass der Name der Klasse verwendet wird. Nach Feldnamen stehen keine Klammern. wobei Javaclass der Name einer installierten öffentlichen Java-Klasse ist.

damit der Tabelle T1 eine Zeile hinzugefügt wird.totalSum() FROM t1 Die Ergebnisse der Spalte JCol (zweite von der oben genannten Anweisung zurückgegebene Zeile) sollte 0 sein. der immer ein JavaObjekt erstellt und ihm eine Referenz zurückgibt. SELECT ID. 90 . Sie können ähnliche Auswahlanweisungen ausführen. da die Felder in diesem Objekt keine Werte haben und die Methode totalSum eine Berechnung dieser Felder ist. INSERT INTO T1 VALUES ( 2. select id.lineItem1Description FROM T1. Inv ). die eine Referenz auf ein Java-Objekt vom Typ Invoice enthält. ob diese beiden Objekte als Werte der Spalte JCol in der Tabelle T1 gespeichert wurden.Praktische Einführung: Eine Übung mit Java in der Datenbank CREATE TABLE T1 ( ID int. INSERT INTO T1 VALUES( 1. NEW Invoice() ). 3 Führen Sie die folgende SQL-Anweisung aus. die andere Felder und Methoden des Objekts einbeziehen. können Sie Auswahlanweisungen benutzen. Beispielsweise wird mit der folgenden SQL-Anweisung ein Java-Objekt erstellt und in die Tabelle T1 eingefügt. ein Java-Objekt zu erstellen und einer Tabelle hinzuzufügen. die den Wert des Feldes ineItem1Description für alle Objekte in der Tabelle T1 zurück (derzeit sollte nur ein Objekt in der Tabelle sein). JCol. JCol Invoice ). 2 Führen Sie mit der Variablen Inv. die die Felder und Methoden der Objekte in der Tabelle einbeziehen. Die Spalte namens JCol akzeptiert nur Objekte des Typs Invoice oder einer ihrer Unterklassen. 6 Führen Sie die folgende SQL-Anweisung aus. JCol. NEW Java-Klassenname() 5 Dieser Ausdruck kann auf verschiedene Arten benutzt werden. die folgende SQL-Anweisung aus. Sobald ein Objekt der Tabelle T1 hinzugefügt wurde. 4 Eine zweite Methode. damit geprüft wird. bezieht den folgenden Ausdruck ein.

erstellen Sie eine neue Variable und übergeben Sie ihr einen Wert (Sie kann nur eine Referenz auf ein Objekt vom Typ "Invoice" enthalten).Kapitel 3 Einführung in Java für Datenbanken Objekt mit einer Abfrage zurückgeben Außer auf Felder und Methoden zuzugreifen. SET Inv2. jedoch nicht in der Tabelle. wird erst geändert. die die Quelle für den Wert dieser Variablen war. in der SQL-Variable derzeit verarbeitet werden: Die Variable Inv enthält eine Referenz auf ein Java-Objekt.lineItem1Description = 'Süßigkeiten'. die als Quelle für die Variablenreferenz diente. set Inv2 = (select JCol from T1 where ID = 2). 91 . Dies ist konsistent mit der Art. SET Inv2.lineItem2Description = 'Sicherheitsgurt'. Die an die Variable übergebene Objektreferenz wurde mit der Tabelle T1 erstellt. Der Wert für das Feld lineItem1Description und lineItem2Description wurde in der Variablen Inv2 geändert. können Sie mit einer Abfrage auch ein ganzes Objekt aus der Tabelle abrufen. v So greifen Sie auf Invoice-Objekte zu. wenn eine UPDATE-Anweisung ausgeführt wird. Der Wert in der Tabelle. CREATE VARIABLE Inv2 Invoice. die in einer Tabelle gespeichert sind: ♦ Führen Sie von Interactive SQL aus die folgenden Anweisungen aus.

Praktische Einführung: Eine Übung mit Java in der Datenbank 92 .

$ Weitere Hinweise und vollständige Anweisungen finden Sie unter "Java-Beispiele einrichten" auf Seite 94. wie Sie Java-Klassen und Objekte Ihrer Datenbank hinzufügen und wie Sie diese Objekte in einer relationalen Datenbank einsetzen.sql in Ihrem SQL Anywhere-Verzeichnis ausführen.K A P I T E L 4 Java in der Datenbank benutzen Über dieses Kapitel Inhalt In diesem Kapitel wird beschrieben. 93 . aktualisieren und löschen Java-Objekte abfragen Java-Felder und Objekte vergleichen Besondere Funktionen von Java-Klassen in der Datenbank So werden Java-Objekte gespeichert Java-Datenbankdesign Berechnete Spalten mit Java-Klassen verwenden Speicher für Java konfigurieren Seite 94 97 103 109 111 117 119 123 130 133 137 140 Bevor Sie beginnen Vor den Beispielen in diesem Kapitel müssen Sie die Datei Samples\ASA\Java\jdemo. Thema Einleitung Datenbank für Java aktivieren Java-Klassen in einer Datenbank installieren Spalten für die Aufnahme von Java-Objekten erstellen Java-Objekte einfügen.

wenn Sie ermitteln wollen. wie Spalten mit Java-Klassen-Datentypen in das relationale Datenbankmodell passen. Das Beispiel finden Sie im Unterverzeichnis Samples\ASA\Java Ihres SQL Anywhere-Verzeichnisses. Sie benutzen Java-Klassen-Datentypen anstelle von einfachen relationalen Typen für die Daten. ♦ Eigenschaften der Java-Spalten Dieser Abschnitt erläutert. wie Sie Aufgaben mit Java in der Datenbank ausführen: ♦ ♦ Datenbank für Java aktivieren Sie müssen bestimmte Maßnahmen treffen. Die Tabellen enthalten dieselben Daten wie Tabellen desselben Namens in der Beispieldatenbank. Überlegen Sie sich die konkreten Anforderungen in Ihrem Datenbanksystem. Sie sind keinesfalls als Muster für das Design Ihrer Datenbank zu empfehlen. damit Ihre Datenbank für die Arbeit mit Java aktiviert wird. Java-Klassen installieren Sie müssen Java-Klassen in einer Datenbank installieren. Beispieltabellen sind nur für die praktische Einführung gedacht Die Beispieltabellen sollen unterschiedliche Java-Funktionen darstellen. 94 . die der Beispieldatenbank hinzugefügt wurden. Fügen Sie die Java-Beispielklassen und –tabellen hinzu. Die Java-Beispiele werden in zwei Schritten eingerichtet: 1 2 Aktivieren Sie die Beispieldatenbank für Java.Einleitung Einleitung Dieses Kapitel erläutert. an welchen Stellen JavaDatentypen und andere Java-Merkmale in die Datenbank eingebaut werden sollen. damit sie für Aufgaben auf dem Server zur Verfügung stehen. Datenbankdesign für Java In diesem Abschnitt werden Tipps für das ♦ Design von Datenbanken gegeben. die Java-Klassen benutzen. nur gehören sie einem Benutzer namens jdba. Java-Beispiele einrichten Viele Beispiele in diesem Kapitel werden mit einer Gruppe von Klassen und Tabellen ausgeführt.

ALTER DATABASE UPGRADE JAVA JDK ’1. die in den Tabellen verwendet werden. Geben Sie im Fensterausschnitt "SQL-Anweisungen" in Interactive SQL die folgende Anweisung ein. Es installiert eine JAR-Datei namens asademo. Diese Datei enthält die Klassendefinitionen. Geben Sie im Fensterausschnitt "SQL-Anweisungen" in Interactive SQL die folgende Anweisung ein: READ "Suchpfad\\Samples\\ASA\\Java\\jdemo.Kapitel 4 Java in der Datenbank benutzen v So wird die Beispieldatenbank für Java aktiviert: 1 2 Starten Sie Interactive SQL und stellen Sie eine Verbindung mit der Beispieldatenbank her.sql mit einem Texteditor öffnen. Sie können das Skript Samples\ASA\Java\jdemo.jar. Die Instruktionen benötigen eventuell einige Zeit. Es erstellt einen Benutzer namens JDBA mit dem Kennwort SQL und DBA-Berechtigung. Damit werden die Instruktionen in der Befehlsdatei jdemo. und setzt den aktuellen Benutzer als JDBA ein.sql" wobei Suchpfad Ihr SQL Anywhere-Verzeichnis ist. v So fügen Sie Java-Klassen und Tabellen der Beispieldatenbank hinzu: 1 2 Starten Sie Interactive SQL und stellen Sie eine Verbindung mit der Beispieldatenbank her. damit Sie die Java-Funktionen benutzen können. Die Beispieldatenbank asademo.sql ausgeführt. Es führt folgende Programmschritte aus: 1 2 3 4 Es installiert die Klasse JDBCExamples.db muss zunächst heruntergefahren werden. Es erstellt die folgenden Tabellen unter der Benutzer-ID JDBA: ♦ ♦ ♦ ♦ ♦ ♦ product contact customer employee sales_order sales_order_items 95 .3’ 3 Schließen Sie Interactive SQL und die Beispieldatenbank. bis sie abgeschlossen sind.

müssen Sie folgende Aufgaben durchführen: ♦ Datenbank für Java aktivieren Bei dieser Aufgabe müssen Sie die Verfügbarkeit von integrierten Klassen und das Upgrade auf Standards der Version 8 prüfen. dass der erforderliche Speicher für das Ausführen von Java-Aufgaben vorhanden ist. Dieser Schritt kann einige Zeit in Anspruch nehmen. Tools zum Verwalten von Java 96 Sie können alle diese Aufgaben aus Sybase Central oder Interactive SQL ausführen. dass andere Klassen als die Laufzeitklassen installiert werden und auf dem letzten Stand sind. Aufgaben bei der Verwaltung von Java Um eine Laufzeitumgebung für Java bereitzustellen. . ♦ Installieren Sie andere Klassen. Für JavaAnwendungen in der Datenbank müssen diese Klassen fehlerfrei funktionieren. interpretiert kompilierte Java-Klassen und führt sie aus. $ Weitere Hinweise finden Sie unter "Datenbank für Java aktivieren" auf Seite 97. Dieser Verfahrensschritt benutzt INSERT.Einleitung Dies ist eine Teilmenge der Tabellen in der Beispieldatenbank. um dem Schema Integritätsregeln hinzuzufügen. 5 Es fügt die Daten aus den Standardtabellen mit identischen Namen in die Java-Tabellen ein. 6 Laufzeitumgebung für Java verwalten Die Laufzeitumgebung für Java besteht aus folgenden Komponenten: ♦ ♦ Sybase Java Virtual Machine Die VM läuft im Datenbankserver. $ Weitere Hinweise finden Sie unter "Java-Klassen in einer Datenbank installieren" auf Seite 103.und SELECT-Anweisungen. Es erstellt einige Indizes und Fremdschlüssel. wird eine Serie von Java-Klassen für die Datenbank verfügbar. $ Weitere Hinweise finden Sie unter "Speicher für Java konfigurieren" auf Seite 140. Integrierte Java-Klassen Wenn Sie eine Datenbank erstellen. ♦ Konfiguration des Servers Sie müssen Ihren Server so konfigurieren. die die Benutzer brauchen Im Verlauf dieser Aufgabe sorgen Sie dafür.

Java ist eine Programmiersprache mit einer Einzelhierarchie. enthält einen Teil der Java-Laufzeitklassen für JDK 1.zip Diese Datei. ♦ 1. und nicht in der Datenbank wie andere Klassen. sollten Sie die Datenbank nicht für Java aktivieren. können Sie sie mit Java-Laufzeitklassen benutzen. von einer Klasse erben. Das bedeutet. dass die Klassen der niedrigsten Ebene (also in der Hierarchie weiter oben angesiedelt) vorhanden sein müssen. Das bedeutet weiterhin. Die Java-Laufzeitklassen für Sybase Die Java-Laufzeitklassen für Sybase befinden sich auf der Festplatte. Java-Aktivierung der Datenbank manchmal nicht erforderlich Durch das Bereitstellen einer Datenbank für Java werden in die Systemtabellen zahlreiche Einträge eingefügt. Sie werden im Unterverzeichnis Java Ihres SQL Anywhere-Verzeichnisses gespeichert. Dies vergrößert die Datenbank und erfordert rund 200 KByte mehr Speicher zum Ausführen der Datenbank. auch wenn Sie keine Java-Funktionen verwenden. enthält einen ♦ Teil der Java-Laufzeitklassen für JDK 1. Erst nachdem Sie eine Datenbank für Java aktiviert haben.1\classes. lizenziert von Sun Microsystems.8 von Sun Microsystems. Neue Datenbanken sind standardmäßig nicht für Java aktiviert Standardmäßig ist eine Datenbank nicht für Java aktiviert.3 von Sun Microsystems. Java in der Datenbank ist eine separat lizenzierte Komponente von SQL Anywhere Studio. 1.jar Diese Datei. dass alle Klassen.Kapitel 4 Java in der Datenbank benutzen Datenbank für Java aktivieren Die Adaptive Server Anywhere Laufzeitumgebung für Java benötigt eine Java VM und die Java-Laufzeitklassen von Sybase. bevor Klassen der oberen Ebene benutzt werden können. die Sie erstellen oder benutzen. Die Basisgruppe der erforderlichen Klassen für Java-Anwendungen wird als Laufzeit-JavaKlassen oder Java-API bezeichnet.1.3\rt. lizenziert von Sun Microsystems. Wenn Sie Java nicht verwenden werden und eine Umgebung mit begrenzter Speicherkapazität haben. wenn Sie sie in Adaptive Server Anywhere neu erstellen. Die folgenden Dateien enthalten die Java-Laufzeitklassen für Sybase. 97 .

98 . werden die Systemtabellen mit einer Liste verfügbarer Klassen aus den System-JAR-Dateien aktualisiert. die mit Adaptive Server Anywhere mitgeliefert wird.zip werden hier gespeichert. Eine Aktivierung einer Datenbank für Java dürfen Sie nur so vornehmen. ASASystem Klassennamen aus classes.zip. nicht ersetzen.3. ASAJDBCDRV Klassennamen aus jdbcdrv. Sie dürfen die Datei classes.sybase Die hier gespeicherten Pakete bieten serverseitige JDBCUnterstützung. Vorsicht: Installieren Sie keine Klassen von einer anderen Version des Sun JDK Klassen im Sun JDK haben identische Namen wie die JavaLaufzeitklassen für Sybase.zip Diese Datei enthält interne JDBC-Treiber-Klassen von Sybase für JDK 1. sybase. Sie können dann die Klassenhierarchie aus Sybase Central durchsuchen.Datenbank für Java aktivieren ♦ ♦ asajdbc. sun Sun Microsystems bietet die hier gespeicherten Pakete an.sql Die hier gespeicherten Pakete sind Teil der serverseitigen JDBC-Unterstützung von Sybase.zip werden hier gespeichert. könnten sich daraus Kompatibilitätsprobleme mit der Sybase Java Virtual Machine ergeben. Wenn Sie eine Datenbank für Java aktivieren. in denen Java-Vorgänge ausgeführt werden sollen. die in jeder Datenbank installiert werden müssen.2 und JDK 1. die Klassen selbst aber sind in der Datenbank nicht vorhanden.1. Wenn Sie eine andere Version dieser Klassen verwenden. wie dies in diesem Abschnitt beschrieben wird. asajrt12.zip Diese Datei enthält interne JDBC-Treiber-Klassen von Sybase für JDK 1. JAR-Dateien Die Datenbank speichert Laufzeit-Klassennamen unter folgenden JARDateien: ♦ ♦ ♦ Installierte Pakete ASAJRT Klassennamen aus asajdbc. ♦ ♦ ♦ com.zip werden hier gespeichert. Diese Laufzeitklassen enthalten die folgenden Pakete: ♦ java Die hier gespeicherten Pakete sind die unterstützten Java- Laufzeitklassen von Sun Microsystems. $ Eine Liste der unterstützten Java-Laufzeitklassen finden Sie unter "Unterstützte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch.

voll funktionsfähig und laufen wie vorgesehen ab. $ Hinweise zur Syntax finden Sie unter "ALTER DATABASEAnweisung" auf Seite 224 der Dokumentation ASA SQLReferenzhandbuch. $ Hinweise finden Sie unter "Datenbank mit dem Befehlszeilenprogramm ""dbinit"" erstellen" auf Seite 516 der Dokumentation ASA Datenbankadministration. $ Weitere Hinweise finden Sie unter "Datenbank für Java aktivieren" auf Seite 101. Datenbanken erstellen Sie können eine für Java aktivierte Datenbank wie folgt erstellen: ♦ Benutzen Sie die Anweisung CREATE DATABASE. Upgrade einer Datenbank Ein Upgrade einer Datenbank auf eine für Java aktivierte Datenbank der Version 8 können Sie wie folgt durchführen: ♦ Benutzen Sie die Anweisung ALTER DATABASE. ♦ Sybase Central $ Hinweise finden Sie unter "Datenbank erstellen" auf Seite 31 der Dokumentation ASA SQL-Benutzerhandbuch. Wenn Sie Java in der Datenbank nicht installieren. beim Upgrade oder zu einem späteren Zeitpunkt in einem separaten Vorgang für Java aktivieren. $ Hinweise finden Sie unter "Upgrade einer Datenbank mit dem Befehlszeilenprogramm ""dbupgrad""" auf Seite 583 der Dokumentation ASA Datenbankadministration. 99 .exe. die keine Java-Vorgänge einschließen. ♦ Benutzen Sie das Dienstprogramm dbinit. ♦ Sybase Central. bleiben alle Datenbankvorgänge. $ Hinweise zur Syntax finden Sie unter "CREATE DATABASEAnweisung" auf Seite 298 der Dokumentation ASA SQLReferenzhandbuch.Kapitel 4 Java in der Datenbank benutzen Methoden zur Java-Aktivierung einer Datenbank Sie können Datenbanken bei der Erstellung. ♦ Benutzen Sie das Upgrade-Dienstprogramm dbupgrad.

db: CREATE DATABASE ’c:\\sybase\\asa8\\temp’ JAVA ON Die folgende Anweisung erstellt eine Datenbankdatei temp2. Wenn Sie Java deaktivieren wollen. wenn Sie eine Datenbank mit Sybase Central erstellen. Beispielsweise erstellt die folgende Anweisung eine Datei für eine Javaaktivierte Datenbank namens temp. mit denen gesteuert wird.db.Datenbank für Java aktivieren Neue Datenbanken und Java Die Java-Laufzeitklassen für Sybase werden bei Adaptive Server Anywhere standardmäßig nicht jedesmal installiert. die mit früheren Versionen der Software erstellt wurden. und zwar mit dem Dienstprogramm für den Datenbank-Upgrade oder mit der Anweisung ALTER DATABASE. Wenn Sie die Datenbank für Java aktivieren wollen. setzen Sie die Option auf OFF. Standardmäßig werden diese Klassen nicht installiert. die Java nicht unterstützt: CREATE DATABASE ’c:\\sybase\\asa8\\temp2’ Dienstprogramm für die Initialisierung der Datenbank Datenbanken können mit dem Dienstprogramm dbinit. $ Hinweise über die Bedingungen für das Einbeziehen von Java in die Upgrade-Datenbank finden Sie unter "Upgrade einer Datenbank mit dem Befehlszeilenprogramm ""dbupgrad""" auf Seite 583 der Dokumentation ASA Datenbankadministration. wenn Sie eine Datenbank erstellen.exe. ob die Java-Laufzeitklassen in der neu installierten Datenbank installiert werden. Die gleichen Optionen sind verfügbar. CREATE DATABASEOptionen Die SQL-Anweisung CREATE DATABASE hat eine Option namens JAVA.exe erstellt werden. kann ein Upgrade durchgeführt werden. setzen Sie diese Option auf ON. Die Installation dieser separat zu lizenzierenden Komponente ist fakultativ und wird über die Methode gesteuert. 100 . Upgrade von Datenbanken und Java Für vorhandene Datenbanken. Der Parameter –jr verhindert die Installation der Java-Laufzeitklassen von Sybase. Das Dienstprogramm verfügt über Parameter. mit der Sie die Datenbank erstellen. Standardmäßig ist die Option auf OFF gesetzt. Dienstprogramm für das DatenbankUpgrade Das Upgrade für Datenbanken auf den Standard von Adaptive Server Anywhere Version 8 erfolgt mit dem Dienstprogramm dbupgrad.

Rechtsklicken Sie auf die Datenbank und wählen Sie "Upgrade einer Datenbank". aus der Liste aus. Wählen Sie die Datenbank. gehen Sie wie folgt vor (Interactive SQL): 1 2 Verbinden Sie sich mit der Datenbank aus Interactive SQL als Benutzer mit DBA-Berechtigung.Kapitel 4 Java in der Datenbank benutzen Datenbank für Java aktivieren Wenn Sie eine Datenbank erstellt oder ein Upgrade einer Datenbank durchgeführt. können Sie die erforderlichen Java-Klassen über Sybase Central oder Interactive SQL auch zu einem späteren Zeitpunkt hinzufügen. damit die Java-Unterstützung wirksam wird.1. 8 v Um die Java-Laufzeitklassen für Sybase der Datenbank hinzuzufügen. Klicken Sie auf "Weiter". dabei aber die Option so gesetzt haben.x-Datenbanken sind die Standardklassen JDK 1. Die Standardklassen sind JDK 1. 3 Starten Sie die Datenbank neu. Sie können gegebenenfalls eine Sicherungskopie der Datenbank anlegen lassen. Führen Sie folgende Anweisung aus: ALTER DATABASE UPGRADE JAVA ON $ Weitere Hinweise finden Sie unter "ALTER DATABASEAnweisung" auf Seite 224 der Dokumentation ASA SQLReferenzhandbuch. die installiert werden soll. gehen Sie wie folgt vor (Sybase Central): 1 2 3 4 5 6 7 Stellen Sie von Sybase Central aus als Benutzer mit DBA-Berechtigung eine Verbindung her. 101 . Falls erwünscht. dass die Datenbank nicht für Java aktiviert wurde. für die das Upgrade vorgenommen werden soll. Klicken Sie auf der einführenden Seite des Assistenten auf "Weiter".3-Klassen. kann jConnect-Metadaten-Unterstützung installiert werden.8-Klassen. Befolgen Sie die restlichen Anweisungen im Assistenten. Für Version 7. v Um der Datenbank die Java-Laufzeitklassen für Sybase hinzuzufügen. Klicken Sie auf "Weiter" Wählen Sie die Option "Java-Unterstützung installieren". Sie müssen außerdem die Version des JDK festlegen.

ob die JavaLaufzeitklassen für Sybase installiert werden. wenn Sie eine Datenbank von einer früheren Version der Software auf eine Datenbank mit Java-Funktionen umstellen wollen.Datenbank für Java aktivieren Mit Sybase Central eine Datenbank für Java aktivieren Sie können Sybase Central für die Erstellung von Datenbanken über Assistenten benutzen. dass die Datenbank für Java aktiviert wird. Standardmäßig ist diese Option so gesetzt. 102 . Die Erstellung oder das Upgrade einer Datenbank werden in Sybase Central wie folgt vorgenommen: ♦ ♦ Wählen Sie "Datenbank erstellen" aus dem Ordner "Dienstprogramme". auszuwählen. Während der Erstellung oder des Upgrades einer Datenbank fordert der Assistent Sie auf. Wählen Sie "Upgrade einer Datenbank" aus dem Ordner "Dienstprogramme".

Klassendateien haben normalerweise die Erweiterung . JAR-Dateien haben normalerweise die Erweiterung . nachdem Sie sie kompiliert haben.class. Die Liste finden Sie unter "Unterstützte Java-Pakete" auf Seite 87 der Dokumentation ASA SQL-Referenzhandbuch. Wenn Sie den Sun Java SDK benutzen. Sie müssen über die DBA-Berechtigung verfügen. dass sie sich in der Liste der unterstützten Klassen befinden. erstellt werden. Klasse erstellen Die Details der einzelnen Schritte können zwar unterschiedlich sein.jar oder . sowie anderen JAR-Kompressionsschemata. Verwenden Sie nur unterstützte Klassen Wenn Ihre Klasse Java-Laufzeitklassen benutzt. um Java-Klassen zu installieren: ♦ Einzelne Klasse Sie können eine einzelne Klasse in einer Datenbank aus einer kompilierten Klassendatei installieren. JAR-Datei Sie können eine Serie von Klassen auf einmal installieren. müssen Sie darauf achten. Native Methoden sind nicht zulässig. die mit dem SUN-JAR-Dienstprogramm.Kapitel 4 Java in der Datenbank benutzen Java-Klassen in einer Datenbank installieren Bevor Sie eine Java-Klasse in einer Datenbank installieren. ♦ Dieser Abschnitt beschreibt. wie Java-Klassen installiert werden. Adaptive Server Anywhere unterstützt alle komprimierten JAR-Dateien. Sie haben mehrere Methoden zur Auswahl. grundsätzlich sind aber für die Erstellung eigener Klassen die nachfolgend beschriebenen Schritte erforderlich. müssen Sie sie kompilieren. wenn sie in einer komprimierten oder unkomprimierten JAR-Datei zusammengefasst sind. Benutzerklassen müssen 100% Java sein. v So erstellen Sie eine Klasse: 1 Definieren Sie Ihre Klasse Schreiben Sie den Java-Code. um eine Klasse oder eine JAR-Datei zu installieren. können Sie einen Texteditor verwenden. 103 . der Ihre Klasse definiert.zip. wenn ein Java-Entwicklungstool wie Sybase PowerJ verwendet wird. Wenn Sie ein Entwicklungstool wie Sybase PowerJ benutzen. finden Sie entsprechende Anweisungen im Entwicklungstool.

die Byte-Code enthält. v So installieren Sie eine Klasse (Sybase Central): 1 2 3 4 104 Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. um eine Klasse zu installieren. Befolgen Sie die Anweisungen im Assistenten. Siehe unter "Datenbank für Java aktivieren" auf Seite 97. Doppelklicken Sie auf "Java-Klasse hinzufügen". dass der Name der Datei mit dem Namen der Klasse übereinstimmt.class. die eine installierte Klasse verwenden. 3 Kompilieren Sie Ihre Klasse Mit diesem Schritt wird die Klassendeklaration mit dem Java-Code in eine neue. wenn die Datenbank für Java aktiviert wurde. Auch das Betriebssystem der JavaLaufzeitumgebung spielt keine Rolle. Sie müssen den Suchpfad und den Dateinamen der Klasse kennen. Der Sun JDK enthält den Java-Compiler Javac. können nur ausgeführt werden. hat aber die Erweiterung . Klasse installieren Um Ihre Java-Klasse innerhalb der Datenbank verfügbar zu machen. Beispiel: Eine Klasse namens "Dienstprogramm" muss in einer Datei namens Dienstprogramm. die Sie installieren wollen. können Sie eine Klasse aus Sybase Central einrichten oder mit der Anweisung INSTALL aus Interactive SQL oder einer anderen Anwendung installieren.java. Nur für Java aktivierte Datenbanken Jede kompilierte Java-Klassendatei kann in einer Datenbank installiert werden. Der Name der neuen Datei ist gleich lautend mit dem Namen der Java-Codedatei. und dass die Groß-/Kleinschreibung beider Namen identisch ist.exe. Öffnen Sie den Ordner "Java-Objekte" für die Datenbank.Java-Klassen in einer Datenbank installieren 2 Benennen und speichern Sie Ihre Klasse Speichern Sie Ihre Klassendeklaration (Java-Code) in einer Datei mit der Erweiterung . Eine kompilierte Java-Klasse kann in einer JavaLaufzeitumgebung unabhängig von der Plattform ausgeführt werden. Achten Sie darauf. auf der sie kompiliert wurde. .java gespeichert werden. Java-Vorgänge. Sie brauchen die DBA-Berechtigung. eigene Datei verwandelt.

Jede JAR-Datei muss einen Namen in der Datenbank haben. in dem die Klassendatei gehalten wird.class im Verzeichnis c:\Quelle gehalten wird.class ist der Name der Klassendatei. Der doppelte Rückstrich sorgt dafür. JAR-Datei installieren Es ist sinnvoll und allgemein üblich. $ Weitere Hinweise finden Sie unter "INSTALL-Anweisung" auf Seite 504 der Dokumentation ASA SQL-Referenzhandbuch und unter "Java-Objekte. muss er zum aktuellen Arbeitsverzeichnis des Datenbankservers relativ sein. Informationen über JAR-Dateien und Pakete finden Sie im Online-Buch Thinking in Java oder anderer Literatur zum Thema JavaProgrammierung. Eine JAR-Datei wird auf dieselbe Weise installiert wie eine Klassendatei. $ Weitere Hinweise finden Sie unter "INSTALL-Anweisung" auf Seite 504 der Dokumentation ASA SQL-Referenzhandbuch und "JavaObjekte.class’ Dabei gilt: Suchpfad ist das Verzeichnis. Gruppen von miteinander verwandten Klassen in Paketen zu sammeln und diese Pakete in einer JAR-Datei zusammenzufassen.Kapitel 4 Java in der Datenbank benutzen v So installieren Sie eine Klasse (Interactive SQL): 1 2 Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. ohne die Erweiterung. Beispiel: Um eine Klasse zu installieren. dass der Rückstrich nicht als Escapezeichen behandelt wird. die in einer Datei namens Dienstprogramm. geben Sie folgende Anweisung ein: INSTALL JAVA NEW FROM FILE ’c:\\Quelle\\Dienstprogramm. Klassen und JAR-Dateien löschen" auf Seite 116. Normalerweise benutzen Sie denselben Namen wie die JAR-Datei. Führen Sie folgende Anweisung aus: INSTALL JAVA NEW FROM FILE ’Suchpfad\\Klassenname. Beispiel: Wenn Sie eine JAR-Datei namens meinejar. Eine JAR-Datei kann die Erweiterung JAR oder ZIP haben. 105 . und Klassenname. Klassen und JAR-Dateien löschen" auf Seite 116.class’ Wenn Sie einen relativen Suchpfad verwenden. sollten Sie ihr im Allgemeinen den JAR-Namen meinejar geben.zip installieren.

dass Instanzen einer Java-Klasse in Form von Java-Objekten in Ihrer Datenbank oder als Werte in einer Spalte gespeichert sind. 106 . Wenn die Virtual Machine die Klassendefinition lädt. v So installieren Sie eine JAR-Datei (Interactive SQL): 1 2 Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. Bestehende JavaObjekte und aktualisierte Klassen Es kann sein. mit der neuen Klassendefinition inkompatibel sind. bis die Verbindung geschlossen wird. die in den Tabellen gespeichert werden. die nach der Installation der Klasse eingerichtet wurden. einer anderen Clientanwendung installieren. Öffnen Sie den Ordner "Java-Objekte" für die Datenbank. Doppelklicken Sie auf "JAR-Datei hinzufügen". oder die die Klasse zum ersten Mal nach der Installation der Klasse verwenden.Java-Klassen in einer Datenbank installieren v So installieren Sie eine JAR-Datei (Sybase Central): 1 2 3 4 Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. Befolgen Sie die Anweisungen im Assistenten. Geben Sie folgende Anweisung ein: INSTALL JAVA NEW JAR ’jarname’ FROM FILE ’Suchpfad\\JarName. Trotz der Aktualisierung der Klasse bleiben diese alten Werte weiterhin verfügbar. Gültigkeit aktualisierter Klassen Die neue Definition wird nur von Verbindungen benutzt. bleibt diese im Speicher. Um eine Klasse oder eine JAR-Datei zu installieren. die die Klasse als Datentyp verwendet.jar’ Klassen und JAR-Dateien aktualisieren Sie können Klassen und JAR-Dateien mit Sybase Central oder durch die Eingabe einer INSTALL-Anweisung in Interactive SQL bzw. müssen Sie DBABerechtigung haben und über eine neuere Version der kompilierten Klasse oder JAR-Datei in einer Datei auf der Festplatte verfügen. Alle neu eingefügten Zeilen müssen allerdings mit der neuen Definition kompatibel sein. auch wenn die Felder und Methoden.

müssen Sie den Namen eingeben. In dem nun eingeblendeten Dialogfeld geben Sie den Namen und den Standort der Klasse oder JAR-Datei ein. In serialisierter Form gespeicherte Objekte Java-Objekte können die aktualisierte Klassendefinition verwenden. Öffnen Sie den Ordner "Java-Objekte". Hinweise dazu finden Sie unter "Speicher für Java konfigurieren" auf Seite 140. unter dem die JAR in der Datenbank bekannt ist. Die interne Sybase VM führt alle Serialisierungen und Deserialisierungen durch. sodass dadurch keine Kompatibilitätsprobleme entstehen. 107 . Rechtsklicken Sie auf die Klasse oder JAR-Datei und wählen Sie "Aktualisieren" aus dem Einblendmenü. die Sie aktualisieren wollen. weil sie in serialisierter Form gespeichert werden.Kapitel 4 Java in der Datenbank benutzen Wenn Sie eine Java-Klasse oder auf einer Klasse basierende Objekte in der aktuellen Verbindung benutzt haben. Sie können mit "Durchsuchen" danach suchen. damit die neue Klassendefinition wirksam wird. die Sie aktualisieren wollen. müssen Sie die Verbindung trennen und wieder aufnehmen. indem Sie im Register "Allgemein" ihres Eigenschaftsfensters auf "Jetzt aktualisieren" klicken. v So aktualisieren Sie eine Klasse oder JAR-Datei (Interactive SQL): 1 2 Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. Führen Sie folgende Anweisung aus: INSTALL JAVA UPDATE [ JAR ’jarname’ ] FROM FILE ’Dateiname’ Wenn Sie eine JAR-Datei aktualisieren. $ Um zu verstehen. Tipp Sie können eine Java-Klasse oder JAR-Datei auch aktualisieren. Suchen Sie die Klasse oder JAR-Datei. müssen Sie mehr über die Arbeitsweise der Virtual Machine wissen. Das benutzte Serialisierungsformat ist speziell für die Datenbank entworfen und entspricht nicht dem Serialisierungsformat von Sun Microsystems. v So aktualisieren Sie eine Klasse oder JAR-Datei (Sybase Central): 1 2 3 4 5 Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. wie aktualisierte Klassen wirksam werden.

108 .Java-Klassen in einer Datenbank installieren $ Weitere Hinweise finden Sie unter "INSTALL-Anweisung" auf Seite 504 der Dokumentation ASA SQL-Referenzhandbuch.

CREATE TABLE jdba. enthält die Spalte NULL. und Java-Spalten können NULLWERTE enthalten. Beispiel: Die folgende Anweisung CREATE TABLE enthält Spalten der Java-Datentypen asademo. wie Spalten mit Datentypen der Java-Klassen in die standardmäßige SQL-Struktur passen. Sie müssen einen voll qualifizierten Namen für den Datentyp verwenden. 109 .ContactInfo. PRIMARY KEY (id) ) Berücksichtigung von Groß-/Kleinschreibung Anders als bei SQL-Datentypen berücksichtigen Java-Datentypen die Groß/Kleinschreibung. Hier sind Name und ContactInfo Klassen im Paket asademo. JContactInfo asademo.Kapitel 4 Java in der Datenbank benutzen Spalten für die Aufnahme von Java-Objekten erstellen Dieser Abschnitt erläutert. Sie müssen die Datentypen immer in der richtigen Schreibweise eingeben. JName asademo.Name NOT NULL.ContactInfo NOT NULL. Wenn für eine nullwertfähige Spalte mit einem Java-Datentyp kein Standardwert gesetzt ist. company_name CHAR(35) NOT NULL.Name und asademo. Sie können jede Funktion mit dem richtigen Datentyp (d. Standardwerte und NULLWERTE in Java-Spalten verwenden Sie können Standardwerte für Java-Spalten verwenden. derselben Klasse wie die Spalte) als Standardwert für JavaSpalten verwenden. Java-Spalten und NULLWERTE Java-Spalten können NULLWERTE zulassen. Spalten mit Java-Datentypen erstellen Sie können jede installierte Java-Klasse als Datentyp benutzen.h.customer ( id integer NOT NULL. Java-Spalten und Standardwerte Spalten können als Standardwert jede Funktion mit dem richtigen Datentyp oder einen beliebigen voreingestellten Standardwert enthalten.

Beispiel: Wenn die Beschreibung des Java-Objekts "product" in einer Spalte namens JProd nicht gesetzt wurde. können Sie alle Produkte mit Nicht-Nullwerten für die Beschreibung wie folgt abrufen: SELECT * FROM product WHERE JProd>>description IS NULL 110 . und Sie können daher die Suchbedingungen IS NULL und IS NOT NULL für diese Werte verwenden. hat er den Java-NULLWERT. Dieser Java-NULLWERT ist dem SQL-NULLWERT zugeordnet.Spalten für die Aufnahme von Java-Objekten erstellen Wenn ein Java-Wert nicht gesetzt ist.

dass Sie die Java-Tabellen der Beispieldatenbank hinzugefügt haben und als Benutzer jDBA mit dem Kennwort SQL verbunden sind. public String color. public String size .math. name = "Unknown". public class Product implements java. size = "One size fits all".io. Java-BeispielTabellen erstellen Die Beispiele in diesem Abschnitt setzen voraus.Kapitel 4 Java in der Datenbank benutzen Java-Objekte einfügen. Eine Beispielklasse In diesem Abschnitt wird eine Klasse beschrieben. die auf der Tabelle Product der Beispieldatenbank und einer Klasse namens Product basieren. die in Beispielen aller folgenden Abschnitte verwendet wird. die in der Originaldatei in Englisch sind. // Standard-Konstruktor Product () { unit_price = new java. public String description . wie Standard-SQL-Anweisungen für die Datenverarbeitung auf Java-Spalten angewendet werden. In diesem Abschnitt werden die einzelnen Punkte mit konkreten Beispielen illustriert. public int quantity .00 ).java in Ihrem SQL AnywhereVerzeichnis wird teilweise im Folgenden dargestellt (zum besseren Verständnis werden die Kommentarzeilen. Die Klassendefinition Product im Verzeichnis Samples\ASA\Java\asademo\Product. public java.Serializable { // "public"-Felder public String name . 111 .java in Ihrem SQL AnywhereVerzeichnis ansehen.math. Als Erstes sollten Sie sich die Datei Samples\ASA\Java\asademo\Product. $ Weitere Hinweise finden Sie unter "Java-Beispiele einrichten" auf Seite 94.BigDecimal( 10. aktualisieren und löschen In diesem Abschnitt wird beschrieben. hier in deutscher Übersetzung wiedergegeben): package asademo.BigDecimal unit_price .

description = inDescription. name = inName. solche Methoden zu verwenden. Es ist beim objektorientierten Programmieren auch allgemein üblich.math. } public String toString() { return size + " " + name + ": " + unit_price. unit_price=inUnit_price. quantity = inQuantity. die in der Datenbank ausgeführt werden. Sie können ein Java-Objekt auf zwei Arten einfügen: aus SQL oder mit JDBC aus anderen Java-Klassen. Einige Methoden sind vorgesehen. die eine Java-Spalte hat. um die Felder zu setzen und abzurufen.BigDecimal inUnit_price ) { color = inColor. Wenn Sie einen Objektnamen in eine Auswahlliste einbeziehen. die in dieser Klasse gesammelt werden sollen. int inQuantity. und nicht die Felder direkt zu adressieren. size = inSize. String inName. 112 . wird die Methode toString ausgeführt. die einigen Spalten der Tabelle DBA.Product entsprechen. und ihre Rückgabezeichenfolgen werden angezeigt. Die Methode toString wird der Einfachheit halber bereitgestellt. Für die praktische Einführung wurden die Felder zur einfacheren Durchführung als "öffentliche" Felder zugänglich gemacht. aktualisieren und löschen } // Konstruktor mit allen verfügbaren Argumenten Product ( String inColor. } Hinweise ♦ Die Klasse Product hat einige öffentliche Felder. ♦ ♦ Java-Objekte einfügen Wenn Sie eine Zeile in eine Tabelle EINFÜGEN. müssen Sie ein Java-Objekt in die Java-Spalte einfügen.Java-Objekte einfügen. java. String inSize.toString(). String inDescription.

die einen Java-KlassenDatentyp hat. Objekt aus einer SQL-Variablen einfügen Sie können die Werte der Felder des Objekts in einer SQL-Variablen der richtigen Klasse auch individuell setzen. Das Schlüsselwort NEW ruft den Standard-Konstruktor für die Klasse Product im Paket asademo auf. muss das neue Objekt die richtigen Werte für öffentliche Felder haben. bevor Sie es einfügen. JProd ) 113 . um eine neue Instanz der Klasse "Product" in die Tabelle product einzufügen: INSERT INTO product ( ID. Objekt mit einem Konstruktor einfügen Wenn Sie einen Wert in eine Spalte einfügen.Product() ) Sie können dieses Beispiel in der Beispieldatenbank als Benutzer jdba ausführen. müssen aufgerufen werden. und Methoden. v So fügen Sie ein Java-Objekt mit SQL-Variablen ein: 1 2 Erstellen Sie eine SQL-Variable der Java-Klassentypen: CREATE VARIABLE ProductVar asademo. wo solche erforderlich sind: SET SET SET SET SET SET ProductVar>>color = ’Black’.99. ProductVar>>size = ’Extra Large’. JProd ) VALUES ( 702. um ein Java-Objekt aufzubauen. Um ein Objekt mit den richtigen Eigenschaften einzufügen. fügen Sie ein Java-Objekt ein.Kapitel 4 Java in der Datenbank benutzen Java-Objekte aus SQL einfügen Sie können ein Java-Objekt mit einem Konstruktor einfügen oder SQLVariable verwenden. 4 Fügen Sie die Variable in die Tabelle ein: INSERT INTO Product ( id.Product() 3 Weisen Sie den Feldern des Objekts Werte zu. v So fügen Sie ein Java-Objekt ein: ♦ INSERT: Verwenden Sie die INSERT-Anweisung. ProductVar>>name = ’Work boots’. nachdem Sie das Skript jdemo. NEW asademo.Product Weisen Sie der Variablen ein neues Objekt zu. ProductVar>>description = ’Steel tipped boots’. indem Sie den Klassenkonstruktor verwenden: SET ProductVar = NEW asademo. die private Felder setzen. ProductVar>>unit_price = 79.sql ausgeführt haben. und nicht durch den Konstruktor. ProductVar>>quantity = 40.

die Sie in dieser Übung vorgenommen haben: ROLLBACK Die Verwendung von SQL-Variablen ist typisch für gespeicherte Prozeduren und andere Verwendungsmöglichkeiten von SQL zum Einbau von programmierter Logik in die Datenbank. Java ist die leistungsfähigere Sprache für solche Aufgaben. Sie können dann einzelne Felder aktualisieren. 114 . um das Objekt auf ein neues Objekt zu aktualisieren. wenn der Konstruktor es erstellt. $ Weitere Hinweise über die Verwendung von vorbereiteten Anweisungen für Objekte finden Sie unter "Objekte einfügen und abrufen" auf Seite 172. ob der Wert eingefügt wurde: SELECT * FROM product WHERE id=800 6 Machen Sie die Änderungen rückgängig.Java-Objekte einfügen. Sie können dann die Methode setObject des Objekts PreparedStatement benutzen. Sie können die serverseitigen Java-Klassen gemeinsam mit JDBC verwenden. aktualisieren und löschen VALUES ( 800. um Objekte von clientseitiger oder serverseitiger JDBC einzufügen. Java-Objekt aktualisieren Java-Spaltenwerte können mit einer der folgenden Methoden aktualisiert werden: ♦ ♦ Gesamtes Objekt aktualisieren Gesamtes Objekt aktualisieren Einige der Felder im Objekt aktualisieren Für die Aktualisierung des Objekts gehen Sie fast genauso vor wie für das Einfügen: ♦ Aus SQL können Sie einen Konstruktor verwenden. um Objekte in Tabellen einzufügen. ProductVar ) 5 Prüfen Sie. Eine vorbereitete Anweisung benutzt Platzhalter für Variable. Objekt aus Java einfügen Sie können ein Objekt mit einer vorbereiteten Anweisung von JDBC einfügen. wenn Sie dies benötigen. Sie können vorbereitete Anweisungen verwenden.

$ Hinweise zur Datentypzuordnung zwischen Java und SQL finden Sie unter "Umwandlung von JAVA.setName( ’Tank Top’) WHERE id=302 Der Einsatz von Methoden anstelle der direkten Ansprache des Feldes ist langsamer.Kapitel 4 Java in der Datenbank benutzen ♦ Aus SQL können Sie eine SQL-Variable verwenden. set-Methoden verwenden Bei der Java-Programmmierung ist es allgemein üblich.zu JavaDatentypen laut der Beschreibung unter "Umwandlung von JAVA.in SQLDatentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. um Aktualisierungen vorzunehmen. die SQL-Datentypen entsprechen. Dabei verwenden Sie die Zuordnung von SQL. muss der Java-Typ des Feldes einem SQL-Typ zugeordnet sein: Der Ausdruck auf der rechten Seite der SET-Klausel muss mit diesem Typ übereinstimmen. Damit ein Java-Feld aktualisiert werden kann. da die Java VM laufen muss. sondern Methoden zu benutzen. um das benötigte Objekt aufzunehmen. 115 . die "void" zurückgeben" auf Seite 125. Sie müssen eventuell die CAST-Funktion verwenden.unit_price = 16. Felder nicht direkt anzusprechen.00 WHERE ID = 302 In der ersten Version von Java in der Datenbank musste eine spezielle Funktion (EVALUATE) verwendet werden. Sie können in SQL set-Methoden verwenden. damit die Variable darin eingefügt wird.setObject verwenden. $ Weitere Hinweise finden Sie unter "Rückgabewert von Methoden. und dann die Zeile aktualisieren. dass diese Methoden void zurückgeben. um die Werte zu holen und zu setzen. um die Datentypen entsprechend einzuordnen. Außerdem ist es allgemein üblich. Dies ist nicht mehr erforderlich. um eine Spalte zu aktualisieren: UPDATE jdba. Aus JDBC können Sie eine vorbereitete Anweisung und die Methode PreparedStatement. ♦ Felder des Objekts aktualisieren Einzelne Felder eines Objekts haben Datentypen.in SQL-Datentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch.Product SET JProd. Sie können einzelne Felder mit einer Standard-UPDATE-Anweisung aktualisieren: UPDATE Product SET JProd.

aktualisieren und löschen Java-Objekte. Mit Sybase Central können Sie auch eine ganze Java-Klasse oder JAR-Datei löschen. Rechtsklicken Sie auf die Klasse oder JAR-Datei und wählen Sie "Löschen" aus dem Einblendmenü. $ Weitere Hinweise finden Sie unter "DELETE-Anweisung" auf Seite 422 der Dokumentation ASA SQL-Referenzhandbuch. Suchen Sie die Klasse oder JAR-Datei. die Sie löschen wollen.Java-Objekte einfügen. $ Siehe auch: ♦ ♦ "Klasse installieren" auf Seite 104 "JAR-Datei installieren" auf Seite 105 116 . Die WHERE-Klausel in der DELETE-Anweisung kann Java-Objekte oder Java-Felder und Methoden enthalten. Klassen und JAR-Dateien löschen Das Löschen von Zeilen mit Java-Objekten unterscheidet sich nicht vom Löschen anderer Zeilen. v So löchen Sie eine Java-Klasse oder JAR-Datei (Sybase Central): 1 2 3 Öffnen Sie den Ordner "Java-Objekte".

zu JavaDatentypen laut der Beschreibung unter "Umwandlung von JAVA. Felder des Objekts abrufen Einzelne Felder eines Objekts haben Datentypen. um die Werte Ihrer Felder zu setzen und abzurufen. SELECT JProd>>getName() FROM Product WHERE ID = 401 $ Informationen über die Verwendung von Objekten in der WHEREKlausel und andere Hinweise zum Vergleich von Objekten finden Sie unter "Java-Felder und Objekte vergleichen" auf Seite 119. wie es beim objektorientierten Programmieren allgemein üblich ist. die SQL-Datentypen entsprechen. ♦ Sie können einzelne Felder abrufen. Sie können ein Objekt in eine serverseitige Java-Klasse abrufen.in SQLDatentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. Sie können auch ein Objekt in eine clientseitige Java-Anwendung abrufen.Kapitel 4 Java in der Datenbank benutzen Java-Objekte abfragen Java-Spaltenwerte können mit einer der folgenden Methoden abgefragt werden: ♦ ♦ Gesamtes Objekt abfragen Gesamtes Objekt abfragen Einige der Felder im Objekt abfragen Aus SQL können Sie eine Variable des geeigneten Typs erstellen und den Wert aus dem Objekt in diese Variable auswählen. indem Sie die Methode getObject des ResultSet einer Abfrage verwenden. finden Sie unter "Abfragen mit JDBC" auf Seite 169. Vor allem aber werden Sie das ganze Objekt in einer Java-Anwendung brauchen. SELECT JProd>>unit_price FROM product WHERE ID = 400 ♦ Wenn Sie Methoden verwenden. wie dies im folgenden einfachen Beispiel beschrieben wird. indem Sie sie in die Auswahlliste einer Abfrage einschließen. $ Wie Objekte mit JDBC abgerufen werden. 117 . können Sie eine Methode getField in Ihre Abfrage einbeziehen. Dabei verwenden Sie die Zuordnung von SQL.

00 One size fits all Visor: 7.00 Medium Tee Shirt: 14. Wenn Sie in Interactive SQL eine Abfrage ausführen.00 One size fits all Visor: 7.00 One size fits all Baseball Cap: 9. da für den Aufruf der Methode die Java VM gestartet werden muss.00 Large Sweatshirt: 24.00 118 . den Namen und den Stückpreis des Objekts auf.product Die Abfrage gibt die Sun-Serialisierung des Objekts an die Clientanwendung zurück.00 Medium Shorts: 15. Für die Klasse "Product" listet die Methode toString in einer Zeichenfolge die Größe. wird der Rückgabewert der toString-Methode des Objekts angezeigt. die ein Objekt abruft. Die Ergebnisse der Abfrage lauten wie folgt: JProd Small Tee Shirt: 9.00 One size fits all Tee Shirt: 14.Java-Objekte abfragen Performance-Tipp Das direkte Abrufen eines Feldes ist schneller als der Aufruf einer Methode.00 One size fits all Baseball Cap: 10. Die Ergebnisse der Anweisung SELECT Spaltenname Sie können den Spaltennamen in einer Abfrage-Auswahlliste auflisten. wie in der folgenden Abfrage: SELECT JProd FROM jdba.00 Large Sweatshirt: 24. die das Feld abruft.

Die Klasse "Product".Kapitel 4 Java in der Datenbank benutzen Java-Felder und Objekte vergleichen Öffentliche Java-Klassen sind Domänen. In diesem Zusammenhang ergibt sich die Frage. JProd. Damit wird folgende Abfrage ermöglicht: SELECT name.unit_price FROM Product ORDER BY JProd.unit_price FROM Product ORDER BY JProd Der benötigte Vergleich für die ORDER BY Klausel erfolgt automatisch basierend auf der Methode compareTo. dass die Werte in jeder Zeile miteinander verglichen werden. hat eine compareTo-Methode. die eine compareTo-Methode implementiert haben.oder UngleichheitsVergleichsbedingungen verwenden Indizes und eindeutige Spalten Primär. JProd. die Gleichheits. können verglichen werden.unit_price Diese Art des Vergleichs kann in Abfragen verwendet werden.und Fremdschlüsselspalten Sortieren von Zeilen in einer Abfrage oder in einem Index setzt voraus. 119 . die viel umfangreichere Funktionen bieten als herkömmliche SQL-Domänen. können Sie Vergleiche in der folgenden Weise ausführen: ♦ Vergleich über ein öffentliches Feld Sie können über ein öffentliches Feld genauso einen Vergleich vornehmen wie über eine normale Zeile. einer GROUP BY Klausel. Wenn Sie eine JavaSpalte haben. auf der die Spalte JProd basiert. die Objekte auf Grundlage des Feldes unit_price miteinander vergleicht. einem DISTINCT Schlüsselwort oder mit einer Aggregatfunktion Anweisungen. Beispielsweise könnten Sie folgende Abfrage ausführen: SELECT name. wie sich Java-Spalten in einer relationalen Datenbank im Vergleich zu traditionellen SQL-Datentypen verhalten. Die Frage des Vergleichs von Objekten hat Auswirkungen insbesondere in folgenden Bereichen: ♦ ♦ ♦ ♦ Art des Vergleichs von Java-Objekten Abfragen mit einer ORDER BY Klausel. ist aber für Indizes und Schlüsselspalten nicht anwendbar. ♦ Vergleich mit einer "compareTo"-Methode Java-Objekte.

Argumente Die Methode übernimmt ein einzelnes Argument. die eine compareTo-Methode hat. dass Sie für diesen Fall 1 zurückgeben. hat eine compareTo-Methode der folgenden Art: 120 . Das aktuelle Objekt wird mit dem gelieferten Objekt verglichen. ♦ Rückgabewerte Die Methode "compareTo" muss einen int-Datentyp mit folgenden Bedeutungen zurückgeben: ♦ Negative Ganzzahl Das aktuelle Objekt ist geringer als das gelieferte Objekt. Funktionen. das ein Objekt des aktuellen Typs ist. Beispiel Die Klasse Product. ♦ ♦ Anforderungen der "compareTo"Methode Die compareTo-Methode muss folgende Eigenschaften haben: ♦ ♦ Bereich Die Methode muss extern sichtbar und daher eine öffentliche Methode sein. müssen Sie eine compareTo-Methode implementieren: ♦ Damit Spalten mit Java-Datentypen als Primärschlüssel.compareTo hat folgendes Argument: compareTo( Produkt AnderesProdukt ) Die Methode vergleicht das Objekt AnderesProdukt vom Typ "Produkt" mit dem aktuellen Objekt. um die Kompatibilität mit "compareTo"-Methoden in Basis-Java-Klassen zu gewährleisten. um die Kompatibilität mit "compareTo"-Methoden in Basis-JavaKlassen zu gewährleisten. dass Sie für diesen Fall -1 zurückgeben. Die Spaltenklasse muss eine compareTo-Methode haben. wie MAX und MIN. die mit den Beispielklassen in der Beispieldatenbank installiert wird. Es wird empfohlen.Java-Felder und Objekte vergleichen Java-Objekte vergleichen Um zwei Objekte desselben Typs zu vergleichen. ♦ ♦ Ziffer Null Das aktuelle Objekt hat denselben Wert wie das gelieferte Objekt. GROUP BY oder DISTINCT in einer Abfrage verwenden zu können. können nur mit einer Java-Klasse benutzt werden. Beispiel: Product. die Vergleiche verwenden. Indizes oder eindeutige Spalten verwendet werden können. müssen die Werte der Spalte verglichen werden. muss die Spaltenklasse eine compareTo-Methode implementieren. Es wird empfohlen. Um die Klauseln ORDER BY. damit alle diese Klauseln gültig sind. Positive Ganzzahl Das aktuelle Objekt ist größer als das gelieferte Objekt.

int rVal = anotherProduct. und eine Methode compareTo.{ } } } Diese Methode vergleicht den Einheitspreis jedes Objekts.toString() ). } else { return toString(). die auf dem Preis basiert. Methoden "toString" und "compareTo" kompatibel machen Wenn Sie eine Java-Spalte in die Auswahlliste einbeziehen und in Interactive SQL ausführen. if ( lVal > rVal ) { return 1. wird die Methode compareTo verwendet. Wenn die Methoden toString und compareTo nicht konsistent implementiert sind. die augenscheinlich Duplikat-Zeilen zurückgeben. kann es zu unvorhergesehenen Ergebnissen kommen.unit_price. werden die beiden Objekte beim Vergleich als identisch angesehen. Als Beispiel nehmen wir an. die den Produktnamen zurückgibt. werden die Namen verglichen (mit JavaZeichenfolgenvergleichen. dass die Klasse "Product" in der Beispieldatenbank eine Methode toString hat. } else if (lVal < rVal ) { return -1. nicht mit Datenbank-Zeichenfolgenvergleichen). Wenn die Einheitspreise identisch sind.Kapitel 4 Java in der Datenbank benutzen public int compareTo( Product anotherProduct ) { // Erst auf Basis des Preises vergleichen // und dann auf Basis von toString() int lVal = unit_price.intValue(). Die folgende.compareTo( anotherProduct. Wenn Sie Spalten vergleichen. Nur wenn der Einheitspreis und der Name gleich sind.intValue(). in Interactive SQL eingegebene Abfrage würde in diesem Fall Doppelwerte ausgeben: SELECT DISTINCT JProd FROM product JProd Tee Shirt Tee Shirt Baseball Cap Visor Sweatshirt Shorts 121 . wie DISTINCTAbfragen. wird der Wert der Methode toString zurückgegeben.

wie von compareTo festgelegt. Da hier eine Implementierung der Methoden vorliegt. die die Beziehungen untereinander nicht berücksichtigt. als würden Duplikatzeilen zurückgegeben.Java-Felder und Objekte vergleichen Hier wird der angezeigte Rückgabewert durch toString festgelegt. sieht es so aus. Das DISTINCT-Schlüsselwort eliminiert Duplikate. 122 .

Wenn Sie die Klasse von der Befehlszeile aus mit einem Befehl wie dem folgenden ausführen.String[] args ){ ...java in Ihrem SQL AnywhereVerzeichnis eine Hauptmethode (main). indem Sie die Java VM mit einer Klasse ausführen. Zum Beispiel hat die Klasse JDBCExamples in der Datei Samples\ASA\Java\JDBCExamples. die in einer Datenbank eingesetzt werden. } 2 Rufen Sie die Methode main mit der CALL-Anweisung auf. v So wird die Hauptmethode (main) einer Klasse von SQL aus aufgerufen: 1 Deklarieren Sie die Methode mit einem Array von Zeichenfolgen als Argument. die eine main-Methode hat. Die JavaLaufzeitklassen. $ Weitere Hinweise über unterstützte Pakete finden Sie unter "Unterstützte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch.Kapitel 4 Java in der Datenbank benutzen Besondere Funktionen von Java-Klassen in der Datenbank In diesem Abschnitt werden besondere Funktionen von Java-Klassen beschrieben.lang. 123 . wird die Hauptmethode (main) ausgeführt: java JDBCExamples $ Hinweise über das Ausführen der Klasse JDBCExamples finden Sie unter "JDBC-Verbindungen herstellen" auf Seite 157. Unterstützte Klassen Sie können nicht alle Klassen aus dem JDK verwenden. public static void main( java. die für den Einsatz in einem Datenbankserver verfügbar sind. gehören zu einer Teilmenge der Java-API. Hauptmethode (main) verwenden Sie starten Java-Anwendungen (außerhalb der Datenbank).

’ two’. sodass nur ein Thread jeweils JDBC ausführt. } } } Sie können diese Methode aus SQL wie folgt ausführen: call ReverseWrite.Besondere Funktionen von Java-Klassen in der Datenbank Jedes Mitglied des Arrays von Zeichenfolgen muss den Datentyp CHAR oder VARCHAR haben oder muss ein Literal sein.lang. unterbrechen oder stoppen. i > 0 .){ System. Sie können Threads in Java-Anwendungen synchronisieren.length.main( ’ one’. indem Sie Funktionen des Pakets java. Prüfen Sie in diesem Fall Anzahl und Typ der Argumente. die die Argumente in umgekehrter Reihenfolge ausgibt: public class ReverseWrite { public static void main( String[] args ){ int i: for( i = args. wieder aufnehmen. Beispiel Die folgende Klasse enthält eine main-Methode.Thread einsetzen. Serialisierung von JDBC-Aufrufen Alle Aufrufe zum serverseitigen JDBC-Treiber sind serialisiert. ’three’ ) Das Datenbankserver-Fenster zeigt die Ausgabe: three two one Threads in Java-Anwendungen verwenden Sie können mehrere Threads in einer Java-Anwendung benutzen. Fehler "Prozedur nicht gefunden" Wenn Sie eine falsche Anzahl von Argumenten für den Aufruf einer JavaMethode eingeben oder einen falschen Datentyp verwenden. vorläufig aussetzen. Jeder Java-Thread ist ein Engine-Thread und wird aus der Menge der zulässigen Threads gemäß der Option -gn des Datenbankservers bezogen.print( args[ i-1 ] ). $ Hinweise zu Datenbankserver-Threads finden Sie unter "–gnServeroption" auf Seite 158 der Dokumentation ASA Datenbankadministration. i-. 124 .out. antwortet der Server mit der Fehlermeldung Prozedur nicht gefunden.

das Objekt selbst. Rückgabewert von Methoden. wo Sie einen Ausdruck benutzen können. und diese Methode in eine in SQL geschriebene gespeicherte Prozedur einbauen. Sie müssen eine Java-Methode schreiben.product set JProd = JProd.in SQL-Datentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. dass der Rückgabe-Datentyp der Java-Methode zum entsprechenden SQLDatentyp passt. Für jede Ergebnismenge. muss die Methode einen Parameter vom Typ java.und SQL-Datentypen finden Sie unter "Umwandlung von JAVA. nicht von Java aus.in SQL-Datentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. in denen set-Methoden in der Regel "void" zurückgeben.Kapitel 4 Java in der Datenbank benutzen $ Eine Liste der Datentypkonvertierungen zwischen SQL und Java finden Sie unter "Umwandlung von JAVA. wird der Wert this an SQL zurückgegeben. d. dass die Java-Methode als öffentlich und statisch in einer öffentlichen Klasse deklariert wird. Sie können die folgende UPDATE-Anweisung in der Beispieldatenbank benutzen: update jdba. die die Methode zurückgeben soll. die von SQL aus ausgeführt werden. Diese Ergebnismengen-Parameter müssen am Ende der Parameterliste stehen. $ Weitere Hinweise über Zuordnungen von Java. die eine Ergebnismenge an die aufrufende Umgebung zurückgibt.setName(’Tank Top’) where id=302 Die Methode setName gibt "void" und daher implizit das Objekt "Product" an SQL zurück. v So werden Ergebnismengen aus einer Java-Methode zurückgegeben: 1 2 Achten Sie darauf. Sie müssen dafür Sorge tragen. Die Funktion betrifft nur Aufrufe. Wenn eine Methode jedoch eine leere Menge zurückgibt. die "void" zurückgeben Sie können Java-Methoden in SQL-Anweisungen überall dort verwenden. wie Ergebnismengen aus Java-Methoden verfügbar gemacht werden. Diese Funktion ist besonders gut in UPDATE-Anweisungen einsetzbar.sql.h. Ergebnismengen aus Java-Methoden zurückgeben Dieser Abschnitt beschreibt. die als EXTERNAL NAME of LANGUAGE JAVA deklariert sein muss. 125 .ResultSet[] haben.

sql. Statement stmt = conn.return_rset ([Ljava/sql/ResultSet.executeQuery ( "SELECT CAST( JName. ResultSet rset = stmt.createStatement().getConnection( "jdbc:default:connection" ). Beispiel Die folgende Beispielklasse hat eine einzige Methode. $ Hinweise zur Syntax für gespeicherte Prozeduren. Eine Anweisung vom Typ CREATE PROCEDURE. die Ergebnismengen zurückgeben.lastName " + "AS CHAR( 50 ) )" + "FROM jdba. import java. die eine Ergebnismenge anzeigt.)V’ LANGUAGE JAVA Ein Cursor kann für diese Prozedur genauso wie für andere ASA-Prozeduren geöffnet werden. 126 . könnte wie folgt definiert werden: CREATE PROCEDURE result_set() DYNAMIC RESULT SETS 1 EXTERNAL NAME ’MyResultSet. rset1[0] = rset.Besondere Funktionen von Java-Klassen in der Datenbank 3 4 In der Methode erstellen Sie erst eine Instanz von java. } } Die Ergebnismenge wird in SQL mit der Anweisung CREATE PROCEDURE exponiert. public class MyResultSet { public static void return_rset( ResultSet[] rset1 ) throws SQLException { Connection conn = DriverManager. die eine Abfrage ausführt und die Ergebnismenge an die aufrufende Umgebung zurückgibt. die als Mantel für Java-Methoden verwendet werden. Erstellen Sie eine in SQL geschriebene gespeicherte Prozedur des Typs EXTERNAL NAME LANGUAGE JAVA.*. womit die Anzahl der von der Prozedur zurückgegebenen Ergebnismengen und die Signatur der Java-Methode angezeigt werden. finden Sie unter "CREATE PROCEDURE-Anweisung" auf Seite 331 der Dokumentation ASA SQLReferenzhandbuch. Dieser Prozedurtyp ist ein Mantel für eine Java-Methode.sql.ResultSet und ordnen sie dann einem der ResultSet[]-Parameter zu.contact " ). die Ergebnismengen zurückgibt. Sie können einen Cursor für die Ergebnismenge der SQL-Prozedur auf dieselbe Weise verwenden wie jede andere Prozedur.

finden Sie unter "CREATE PROCEDURE-Anweisung" auf Seite 331 der Dokumentation ASA SQL-Referenzhandbuch. einschließlich der Methodensignatur. Sie müssen die Methoden so definieren. den Sie als OUT. dass OUT. In diesem Abschnitt wird beschrieben. damit der Methodenparameter. der ein Array von Ganzzahlen darstellt und einen Boolschen Wert zurückgibt. Java hat keine explizite Unterstützung für INOUT. Rückgabe von Werten aus Java über gespeicherte Prozeduren Sie können gespeicherte Prozeduren. $ Weitere Hinweise zu Java-Methodensignaturen finden Sie unter "CREATE PROCEDURE-Anweisung" auf Seite 331 der Dokumentation ASA SQL-Referenzhandbuch. als Mantel für Java-Methoden verwenden. die mit EXTERNAL NAME LANGUAGE JAVA erstellt wurden. erstellen Sie ein Array von genau einer Ganzzahl: public class TestClass { public static boolean testOut( int[] param ){ param[0] = 123.oder INOUTParameter verwenden wollen. 127 . $ Weitere Hinweise finden Sie unter "Umwandlung von JAVA. Anstelle dessen können Sie ein Array des Parameters verwenden.Kapitel 4 Java in der Datenbank benutzen Die Zeichenfolge (Ljava/sql/ResultSet. der dem SQL-Datentyp des OUT. } } Die folgende Prozedur benutzt die testOut-Methode: CREATE PROCEDURE sp_testOut ( OUT p INTEGER ) EXTERNAL NAME ’TestClass/testOut ([I)Z’ LANGUAGE JAVA Die Zeichenfolge ([I)Z ist eine Java-Methodensignatur. $ Hinweise zur Syntax.oder INOUT-Parameters entspricht.in SQLDatentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. dass die Methode einen einzelnen Parameter hat. die anzeigt.oder INOUT-Parameter in der gespeicherten Prozedur benutzt werden können. return true. wie Sie Ihre JavaMethode so schreiben. ein Array eines Java-Datentyps ist. also eine kompakte Zeichendarstellung der Anzahl und der Typen der Parameter und Rückgabewerte.)V ist eine Java-Methodensignatur. Beispiel: Um einen Ganzzahl-OUT-Parameter zu benutzen.oder OUT-Parameter.

wird eine java.asa. Der StandardSicherheitsManager Der standardmäßige Sicherheits-Manager ist die Klasse com.jrt. Standardmäßig wird diese Option auf OFF gesetzt. ob der Datenbankserver mit der Datenbankserveroption -sc im C2-Sicherheitsmodus gestartet wurde. wie etwa Dateizugriff und Netzwerkzugriff.sybase. v So wird der Dateizugriff mit dem standardmäßigen SicherheitsManager zugelassen: ♦ Setzen Sie die Option JAVA_INPUT_OUTPUT auf ON: SET OPTION JAVA_INPUT_OUTPUT=’ON’ 128 . $ Weitere Hinweise finden Sie unter "JAVA_INPUT_OUTPUT-Option" auf Seite 642 der Dokumentation ASA Datenbankadministration.net-Pakete verwehrt. die Sie zur Steuerung des Benutzerzugriffs auf vertrauliche Funktionen Ihrer Anwendungen. wird damit der Zugriff auf Java-Datei-I/O-Funktionen deaktiviert. Adaptive Server Anywhere bietet die folgende Unterstützung für Java-Sicherheitsmanager in der Datenbank: ♦ ♦ Adaptive Server Anywhere liefert einen standardmäßigen SicherheitsManager. Wenn der Sicherheits-Manager einen Benutzer am Zugriff auf eine Funktion hindert.Besondere Funktionen von Java-Klassen in der Datenbank Sicherheits-Management für Java Java bietet Sicherheits-Manager. sodass Datei-I/O-Vorgänge nicht zulässig sind. und "–scServeroption" auf Seite 167 der Dokumentation ASA Datenbankadministration. Java-Datei-I/OVorgänge mit dem standardmäßigen SicherheitsManager steuern Die Java-Datei-I/O-Vorgänge werden über die Datenbankoption JAVA_INPUT_OUTPUT gesteuert.SAGenericSecurityManager. Wenn der Datenbankserver im C2-Sicherheitsmodus läuft.SecurityException zurückgegeben. $ Hinweise dazu finden Sie unter "Eigenen Sicherheits-Manager implementieren" auf Seite 129.lang. Sie können Ihren eigenen Sicherheitsmanager stellen. wird der Zugriff auf java. Falls die Verbindungseigenschaft auf OFF steht. Er führt die folgenden Aufgaben durch: 1 2 3 4 5 Er prüft den Wert der Datenbankoption JAVA_INPUT_OUTPUT. einsetzen können. Er prüft.

2 Ordnen Sie Ihrem Sicherheits-Manager die betreffenden Benutzer zu.add_user_security_manager( Benutzername. Die Klasse SecurityManager umfasst eine Reihe von Methoden.lang. Sie müssen Methoden aufheben. Falls die Methode einen Wert zurückgibt. Verwenden Sie die gespeicherten Systemprozeduren add_user_security_manager. die prüfen.checkWrite werden nicht aufgehoben und verhindern Schreibvorgänge in den Dateien. Object) {} } Die Methoden SecurityManager. die Klasse MeinSicherheitsManager einem Benutzer als Sicherheits-Manager zuordnen wollen. v So wird Ihr eigener Sicherheits-Manager verfügbar gemacht: 1 Implementieren Sie eine Klasse. kehrt die Methode stillschweigend zurück. update_user_security_manager und delete_user_security_manager. call dbo. Falls die Aktion zulässig ist.SecurityManager erweitert. wird eine SecurityException ausgegeben. jedoch das Schreiben untersagen: public class MeinSicherheitsManager extends SecurityManager { public void checkRead(FileDescriptor) {} public void checkRead(String) {} public void checkRead(String. die Aktionen mit stillschweigend zurückkehrenden Methoden steuern. 129 . die java. ’MeinSicherheitsManager’. NULL ) Beispiel Mit der folgenden Klasse können Sie das Lesen aus Dateien zulassen. um einem Benutzer SicherheitsManager zuzuordnen. Sie können dies durch Implementieren einer Methode public void erreichen. würden Sie den folgenden Befehl ausführen. ob ein bestimmter Vorgang zulässig ist.Kapitel 4 Java in der Datenbank benutzen Eigenen Sicherheits-Manager implementieren Ein eigener Sicherheits-Manager wird mit mehreren Schritten implementiert. Wenn Sie z. Die Methoden checkRead kehren stillschweigend zurück und lassen die Aktion zu.B.

130 . Falls die Klasse viele Variablen umfasst.oder writeObjectMethode kann sich auf die Performance auswirken. dass jede Zeile folgende Informationen enthält: ♦ ♦ ♦ ♦ Einen Versionsbezeichner Einen Bezeichner für die Klasse (oder Unterklasse). die gespeichert wird Die Werte von nicht-statischen.So werden Java-Objekte gespeichert So werden Java-Objekte gespeichert Java-Werte werden in serialisierter Form gespeichert. Daher werden diese Informationen hier etwas genauer ausgeführt. Anstelle dessen enthält der Bezeichner eine Referenz auf die Klassendefinition. Dies kann bedeutende Performanceeinbußen verursachen. ♦ Serialisierung Wenn eine Klasse eine readObject. nicht-zeitweiligen Feldern in der Klasse Andere Overhead-Informationen Die Klassendefinition wird nicht für jede Zeile gespeichert. ♦ Performance Wenn Sie einen Java-Wert einfügen oder aktualisieren. Hinweise ♦ Plattenspeicher Der Overhead pro Zeile ist 10 bis 15 Byte. Jedes Mal. wird diese beim Serialisieren oder Deserialisieren der Instanz aufgerufen. indem Sie berechnete Spalten verwenden. wie diese Elemente zusammenwirken. ♦ Indizieren Indizes auf Java-Spalten sind nicht sehr selektiv und bieten nicht die Performancevorteile wie Indizes auf einfachen SQLDatentypen. aber die Art der Speicherung dieser Objekte hat einige Auswirkungen auf die Verarbeitungsleistung. Der Einsatz einer readObject.oder writeObjectMethode hat. weil die Java VM aufgerufen wird. kann der erforderliche Overhead dem für die Variable ähneln. Das bedeutet. wenn ein Java-Wert in einer Abfrage abgerufen wird. muss die Java VM ihn serialisieren. kann der Overhead vernachlässigt werden. Sie können die Performanceeinbußen für Abfragen vermeiden. muss er von der VM deserialisiert werden. Falls die Klasse nur über eine Variable verfügt. Sie können Java-Objekte verwenden. ohne im Detail zu wissen. die nur einmal gehalten wird.

Das bedeutet. sind beständig . aber in der alten Version fehlt oder nicht serialisierbar war.h. wird das Feld ignoriert. dass die neue Klasse mit den alten Zeilen arbeiten kann. werden die Daten für diese Überklasse ignoriert. Tabelle mit dieser Klasse als Datentyp für eine Spalte erstellen Zeilen in die Tabelle einfügen Neue Version der Klasse installieren Funktionsweise der bestehenden Zeilen mit der neuen Version der Klasse Zugriff auf Zeilen. und "NULL" für Objektreferenzen. die nicht eine Überklasse der alten Version war. Wenn ein serialisierbares Feld zwischen der älteren Version und der neueren Version den Typ ändert. "false" für Boolesche Werte. wenn die Klasse des Objekts oder eine ihrer Überklassen zu irgendeinem Zeitpunkt aus der Datenbank entfernt wurde. dass Sie folgende Aktionen ausführen können: 1 2 3 4 Installieren Sie eine Klasse. Die Regeln für den Zugriff auf diese älteren Werte lauten wie folgt: ♦ Wenn ein serialisierbares Feld in der alten Version der Klasse vorhanden ist. wird das Feld auf einen Standardwert initialisiert. Wenn eine Überklasse der neuen Version vorhanden ist. sie bestehen. Dieses Verhalten ist kompatibel mit der Sun MicrosystemsSerialisierung. 131 . auch wenn kein Programmcode läuft. Typenkonvertierungen werden nicht unterstützt . werden die Daten für diese Überklasse auf Standardwerte initialisiert. wird das Feld auf Standardwerte initialisiert.d. die nicht eine Überklasse der neuen Version ist. Der Standardwert ist 0 für native Typen.Kapitel 4 Java in der Datenbank benutzen Java-Objekte und Klassenversionen Java-Objekte. aber in der neuen Version fehlt oder nicht serialisierbar ist. ♦ ♦ ♦ ♦ Unzugängliche Objekte Ein serialisiertes Objekt ist nicht zugänglich. die es ermöglicht.dies ist kompatibel mit der Sun Microsystems-Serialisierung. Wenn eine Überklasse der alten Version vorhanden war. wenn eine Klasse aktualisiert wird Adaptive Server Anywhere sieht eine Form der Evidenzhaltung von Klassenversionen vor. Wenn ein serialisierbares Feld in der neuen Version der Klasse vorhanden ist. die in der Datenbank gespeichert werden.

wenn die VM auf die Klasse zugreift. Wann die neue Klasse benutzt wird Die Klassendefinition für jede Klasse wird durch die VM jeder Verbindung geladen. wird die VM auf Ihrer Verbindung implizit gestartet. die die INSTALL-Anweisung ausführt. 132 . Die Verschiebung über Datenbanken kann wie nachstehend beschrieben erfolgen: ♦ ♦ ♦ Objekte werden in eine entfernte Datenbank verlegt. wenn die VM für diese Verbindung neu gestartet wird (zum Beispiel mit STOP JAVA und START JAVA). wird die neue Klasse das nächste Mal geladen. Eine Logdatei mit Objekten wird übersetzt und in einer anderen Datenbank angewendet. Eine Tabelle mit Objekten wird entladen und dann in eine andere Datenbank eingelesen. Daher haben Sie sofort Zugang zu der neuen Klasse. Wenn die Klasse von einer VM bereits geladen ist. sieht diese Verbindung die neue Klasse erst. Wenn Sie eine Klasse installieren. wenn die Klasse zum ersten Mal benutzt wird. Für andere Verbindungen als diejenige.So werden Java-Objekte gespeichert Objekte zwischen Datenbanken verschieben Diese Änderungen machen die Verschiebung von Objekten zwischen Datenbanken möglich. auch wenn die Versionen der Klassen voneinander abweichen.

Kapitel 4 Java in der Datenbank benutzen Java-Datenbankdesign Für das Design Ihrer relationalen Datenbanken gibt es einen umfangreichen theoretischen und praktischen Erfahrungsschatz.ein bestimmter Mitarbeiter. Bestellnummern. 133 . und dies gilt umso mehr für Java-relationale Datenbanken. ♦ ♦ Eine Adresse kann als Attribut eines Kunden gesehen werden. und die Methoden und Felder dieser Klasse beschreiben die Attribute der Entität. Eine derartige Vielfalt ist für die Theorie und Praxis von objekt-relationalen Datenbanken nicht vorhanden. hat. Jede Instanz der Klasse (jedes Objekt) enthält eine eigene Instanz der Entität. sondern auch in der Literatur für fortgeschrittene Anwender finden. Sie können Beschreibungen zum Design von Entitätsbeziehungen und andere Ansätze nicht nur in einleitender Form (siehe "Planung Ihrer Datenbank" auf Seite 3 der Dokumentation ASA SQL-Benutzerhandbuch). Beim objektorientierten Programmieren beschreibt jede Klasse eine Entität. Customer. dass relationale Spalten auf Java-Klassen basieren. Eine natürlichere Entsprechung liegt zwischen Tabellen und Klassen vor. dass sie in der Praxis nicht ganz so eindeutig ausfällt. aber bei näherem Hinsehen zeigt sich. Kundennummern. Sales_order und Department. Die Attribute dieser Entitäten werden zu den Spalten der Tabelle: Adressen der Mitarbeiter. ist aber auch eine Entität mit den Attributen "Summe" und "Währung". Es scheint daher unnatürlich. Jede Zeile in der Tabelle kann als getrennte Instanz der Entität bezeichnet werden . Stadt etc. Ein Preis kann als Attribut eines Produkts gesehen werden. die als eigene Attribute die Straße. Entitäten und Attribute in relationalen und objektorientierten Daten Beim Design relationaler Datenbanken beschreibt jede Tabelle eine Entität. Entitäten und Attribute in der realen Welt Die Unterscheidung zwischen Entität und Attribut scheint klar. und so weiter. Beispiel: In der Beispieldatenbank gibt es Tabellen mit dem Namen Employee. ist aber auch eine Entität. eine Bestellung eine Abteilung. Im Folgenden finden Sie einige Vorschläge für den Einsatz von Java zur Erweiterung des praktischen Einsatzes relationaler Datenbanken.

Sie können einige Entitäten als Tabellen. Und wenn eine einzelne Kundentabelle verwendet wird. Ist es besser. um die Begrenzungen relationaler Datenbanken zu überwinden. und beim Abfragen von Informationen zu allen Kunden müssen mehrere Tabellen durchsucht werden. Entitäten auszudrücken. kann das Datenbankdesign sehr unübersichtlich werden. die Begünstigten und Personen. in der alle Kunden der Gesellschaft enthalten sind. und andere Entitäten als Klassen in einer Tabelle ausdrücken. nämlich dass es zwei Möglichkeiten gibt. wobei für einige Informationen Java-Klassenspalten benutzt werden. Im nächsten Abschnitt wird ein Beispiel erläutert. für andere aber nicht. sicherzustellen.Java-Datenbankdesign Der Sinn der objektrelationalen Datenbank ist genau in diesem Faktum zu suchen. oder als Attribut des Kunden? Bei beiden Ansätzen gibt es Einschränkungen: ♦ Wenn für jeden Kundentyp eine eigene Tabelle eingerichtet wird. die die Prämien zu bezahlen haben. Ein Kunde kann als Entität angesehen werden. Für alle diese Kundentypen benötigt die Versicherungsgesellschaft verschiedene Informationen. 134 . ermöglicht die richtige Dateneingabe. die für einige Kunden nullwertfähig sind. sodass es sinnvoll ist. Es gibt in relationalen Datenbanken keine einfache Methode. das Überblick über seine Kunden behalten will. Für den Prämienzahler braucht man zusätzliche Finanzinformationen für die steuerlichen Aspekte. ist es nicht einfach. erzwingt sie aber nicht. diese unterschiedlichen Kundentypen als unterschiedliche Entitäten zu behandeln. Nun werden aber von Versicherungsgesellschaften verschiedene Arten von Kunden betreut. dass für jeden Kunden die richtigen Informationen eingegeben werden. ♦ Mit Klassen bestimmte Einschränkungen relationaler Datenbanken überwinden Sie können eine einzelne Kundentabelle verwenden. Für den Begünstigten braucht sie eigentlich nicht viel mehr als die Adresse. Einschränkungen der relationalen Datenbanken Stellen Sie sich ein Versicherungsunternehmen vor. eine einzelne Tabelle zu entwerfen. Das Einrichten von Spalten. Für den Policeninhaber sind Informationen über den Gesundheitszustand erforderlich. Es gibt die Policeninhaber. das Standardverhalten an ein Attribut der neuen Dateneingabe zu binden.

Referenzielle Daten gehören im Allgemeinen nicht in Java-Klassen. um aus diesem Feld oder dieser Methode eine eigene Spalte zu erstellen. Ihr Hauptzweck ist die Definition der Struktur der Datenbank und die Definition der Beziehungen zwischen Tabellen. sind Ganzzahlen und andere einfache Datentypen für diesen Zweck besser geeignet. Welche Daten gehören in eine Java-Klasse. und welche sollten besser in einer einfachen Datentyp-Spalte eingegeben werden? ♦ Spalten für die referenzielle Integrität Primärschlüsselspalten und Fremdschlüsselspalten haben gemeinsame Identifizierungsnummern. dass die richtigen Informationen eingegeben werden. Indem Sie neue Kunden nach ihrem Typ eingeben. die auf der Klasse Kontaktinformation basiert. Gehalt usw. sein. meist nicht indiziert. auch einen anderen Ausdruck) indizieren. wenn sie in weniger Spalten vom Typ Javaklasse kombiniert werden. bei denen dies nicht erforderlich ist. die im Allgemeinen indiziert werden. Dann definieren Sie Klassen mit den Namen PolicenhalterKontaktdaten und BegünstigterKontaktdaten. $ Weitere Hinweise finden Sie unter "Berechnete Spalten mit JavaKlassen verwenden" auf Seite 137. Für diese Daten kann es häufig von Vorteil sein. die Unterklassen der Klasse Kontaktdaten sind. können Sie berechnete Spalten verwenden. Adresse. Obwohl Sie aus einer Java-Klassenspalte eine Primärschlüsselspalte machen können. Abstraktionsebenen für relationale Daten Daten in einer relationalen Datenbank können nach Zweck kategorisiert werden. eher unscharf. Solche Daten werden für die referenzielle Integrität nicht verwendet. Sie brauchen für die Policeninhaber andere Kontaktinformationen als für die Begünstigten. sie auf ein Feld oder eine Methode dieser Spalte zu indizieren. werden ebenfalls nicht in Java-Klassen angelegt. Allerdings ist die Trennlinie zwischen Daten. indem Sie eine Spalte definieren. 135 . ♦ Beschreibende Daten In jeder Zeile gibt es im Allgemeinen auch beschreibende Daten. Bei berechneten Spalten können Sie selektiv ein Java-Feld oder eine Java-Methode (bzw. Diese Identifizierungsnummern können als referenzielle Daten bezeichnet werden. Vergünstigungen. die indiziert werden sollen.Kapitel 4 Java in der Datenbank benutzen Beispiel: Nehmen wir an. können Sie sicherstellen. und solchen. ♦ Indizierte Daten Spalten. Bei einer Mitarbeitertabelle können dies Daten wie Einstellungsdatum. Sie können dieses Problem lösen. dass es sinnvoll wäre. Wenn Sie eine Java-Klassenspalte definieren und dann feststellen. aber häufig in Abfragen verwendet.

Java-Datenbankdesign Java-Klassen sind für die Abstraktion auf einer Ebene zwischen der der einzelnen relationalen Spalte und der relationalen Tabelle nützlich. 136 .

♦ Java-Spalte einer relationalen Tabelle hinzufügen Wenn Sie einige der Funktionen von Java-Klassen nutzen. Eine UPDATE-Anweisung. um das Design von Java-Datenbanken einfacher zu gestalten. den Wert einer berechneten Spalte zu ändern. Tabellen mit berechneten Spalten erstellen Die folgende CREATE TABLE-Anweisung wird benutzt. damit Java-Funktionen in bestehenden Datenbanken besser genutzt werden können. und daher einen Index auf dieses Feld erstellen. und um die Performance von Java-Datentypen zu verbessern. können Sie JavaSpalten als berechnete Spalten hinzufügen. Sie können eine berechnete Spalte hinzufügen. die ihre Werte aus anderen Spalten in der Tabelle beziehen. die versucht. Eine berechnete Spalte ist eine Spalte. um die Tabelle product in den Java-Beispieltabellen zu erstellen: CREATE TABLE product ( id INTEGER NOT NULL. können Sie mit berechneten Spalten eines der Felder einer Klasse indizieren. Einsatzbereich berechneter Spalten Es gibt zwei Haupteinsatzgebiete für berechnete Spalten mit Java-Klassen: ♦ Java-Spalte aufgliedern Wenn Sie eine Spalte mit einem Java-Klassen- Datentyp erstellen. die den Wert des Feldes enthält.Kapitel 4 Java in der Datenbank benutzen Berechnete Spalten mit Java-Klassen verwenden Berechnete Spalten sind ein Merkmal. JProd asademo. deren Werte aus anderen Spalten ausgewertet werden. aber in die bestehende Datenbank so wenig wie möglich eingreifen wollen. das entwickelt wurde. PRIMARY KEY ("id") ) 137 .Product NOT NULL. die mit der Spalte verbunden sind. Berechnete Spalten festlegen Berechnete Spalten werden in den Anweisungen CREATE TABLE oder ALTER TABLE deklariert. löst aber Trigger aus. name CHAR(15) COMPUTE ( JProd>>name ). Sie können in berechneten Spalten kein INSERT und kein UPDATE durchführen.

product in den Java-Beispieltabellen hat eine berechnete Spalte (name). die wir zur Erläuterung dieses Problemfeldes heranziehen. Die folgende Anweisung macht aus einer berechneten Spalte wieder eine normale Spalte. der in einer berechneten Spalte verwendet wird. Wenn der neue Ausdruck ungültig ist. schlägt die ALTER TABLEAnweisung fehl. Berechnete Spalten einfügen und aktualisieren Berechnete Spalten haben Auswirkungen auf die Gültigkeit von INSERT und UPDATE. "name" CHAR(15) COMPUTE( JProd. auf der eine berechnete Spalte basiert: ALTER TABLE Tabellenname ALTER Spaltenname SET COMPUTE ( Ausdruck ) Die Spalte wird neu berechnet. indem eine weitere berechnete Spalte hinzugefügt wird: ALTER TABLE product ADD inventory_Value INTEGER COMPUTE ( JProd. ’bad insert statement’ ) 138 .Berechnete Spalten mit Java-Klassen verwenden Berechnete Spalten zu Tabellen hinzufügen Ausdruck für berechnete Spalten ändern Die folgende Anweisung ändert die Tabelle product. name) VALUES( 3006. wenn diese Anweisung ausgeführt wird.name ).Product NOT NULL.Falsche Anweisung INSERT INTO PRODUCT (id. PRIMARY KEY ("id") ) ♦ Keine direkten Einfügungen oder Aktualisierungen Sie können in eine berechnete Spalte keinen Wert direkt einfügen.quantity * JProd. Die folgende Anweisung ändert den Ausdruck. -. ALTER TABLE Tabellenname ALTER Spaltenname DROP COMPUTE Wenn Sie diese Anweisung ausführen.unit_price ) Sie können mit der Anweisung ALTER TABLE den Ausdruck ändern. Die Tabellendefinition lautet wie folgt: CREATE TABLE "jdba". werden die Werte in der Spalte nicht verändert. "JProd" asademo. Die Tabelle jdba."product" ( "id" INTEGER NOT NULL. Die folgende Anweisung schlägt mit der Fehlermeldung Duplikat beim Einfügen in eine Spalte fehl.

Eine Zeile wird eingefügt.Kapitel 4 Java in der Datenbank benutzen Eine UPDATE-Anweisung kann eine berechnete Spalte nicht direkt aktualisieren. Wenn Sie einen Ausdruck verwenden.Product() ) ♦ Trigger Sie können Trigger für eine berechnete Spalte definieren. wenn sie abgefragt werden. JProd ) VALUES( 3007. Zeitpunkt der Neuberechnung von Spalten Die berechneten Spalten werden unter folgenden Bedingungen neu berechnet: ♦ ♦ ♦ ♦ ♦ Eine Spalte wird gelöscht. 139 .Product() ) Anstelle dessen müssen Sie die Spalten wie folgt auflisten: INSERT INTO PRODUCT( id. Der Datentyp oder die COMPUTE-Klausel einer Spalte wird geändert. Berechnete Spalten werden nicht neu berechnet. der zeitabhängig ist oder in anderer Weise vom Status der Datenbank abhängt. Eine Zeile wird aktualisiert. ♦ Auflisten von Spaltennamen Sie müssen in INSERT-Anweisungen für Tabellen mit berechneten Spalten immer die Spaltennamen angeben. Die Spalte wird umbenannt.Falsche Anweisung INSERT INTO PRODUCT VALUES( 3007. hinzugefügt oder umbenannt. damit ein INSERT oder UPDATE in diesen Spalten den Trigger auslöst. bringt die berechnete Spalte möglicherweise nicht das gewünschte Ergebnis. Die folgende Anweisung schlägt mit der Fehlermeldung Falsche Anzahl von Werten für INSERT fehl: -.new asademo.new asademo.

Dieser Typ des Speichers ist nicht für den Server vorgesehen. Der erforderliche Speicher für eine Verbindung ist entweder komplett im Cache oder komplett in einer temporären Datei. holt das System die VM in den Speicher. Jede in einer Java-Anwendung benutzte Klassendefinition wird in den Speicher geladen.Speicher für Java konfigurieren Speicher für Java konfigurieren In diesem Abschnitt wird beschrieben. 200 KByte pro Verbindung. müssen Sie die Erfordernisse für jede Datenbank zusammenzählen. $ Hinweise zur Optimierung des Caches finden Sie unter "Performance durch den Einsatz eines Cachespeichers steigern" auf Seite 170 der Dokumentation ASA SQL-Benutzerhandbuch. ♦ Der erforderliche Speicher für die Datenbank ist nicht auslagerbar: Die Seiten können nicht auf die Festplatte ausgelagert werden. die Java benutzt. Datenbank und Verbindung Die Java VM benutzt Speicher sowohl pro Datenbank. dass diese Anforderungen erfüllt werden. Dieser Speicherbedarf wird in den erforderlichen Speicher für die Datenbank eingerechnet. aber nur als Einheit. Jede Verbindung benötigt eine arbeitende Gruppe von Java-Variablen und Anwendungs-Stack-Speicherplatz für Methodenargumente etc. als auch pro Verbindung. die auf dem Server laufen soll. Sie müssen in den Servercache passen. Der erforderliche Speicher pro Verbindung ist auslagerbar. Die neue Instanz benötigt ca. die Java benutzt. wird eine neue Instanz der VM für diese Verbindung geladen. ♦ ♦ ♦ 140 . und wie Sie Ihren Server so einrichten.5 MByte Platz. ♦ Speicherbelegung Java in der Datenbank benötigt Speicher für verschiedene Zwecke: ♦ Wenn Java auf einem laufenden Server zum ersten Mal benutzt wird. Die Java VM benötigt viel Cachespeicher. Eine zusätzliche VM wird für jede Datenbank geladen. welche Speichererfordernisse für Java in der Datenbank bestehen.). Die VM braucht dort ca. 1. Für jede Verbindung. Sie wird im Datenbankspeicher untergebracht: Getrennte Kopien sind für die einzelnen Verbindungen nicht erforderlich. sondern für jede Datenbank. Wenn Sie die Cacheerfordernisse berechnen wollen.

Kapitel 4 Java in der Datenbank benutzen Verwaltung des Speichers Sie können die Speicherbelegung wie folgt steuern: ♦ Gesamtcachegröße setzen Sie müssen die Größe des Caches so setzen. Diese Option ist global und kann nur von einem Benutzer mit DBA-Berechtigung gesetzt werden. ♦ Heap-Größe setzen Diese Option JAVA_HEAP_SIZE setzt die Maximalgröße des pro Verbindung erforderlichen Speichers in Byte. indem Sie die Anweisung STOP JAVA aufrufen. Nur ein Benutzer mit DBA-Berechtigung kann diese Anweisung ausführen. Sie können diesen Wert mit der Option JAVA_NAMESPACE_SIZE setzen. sondern auch die VM entladen. damit sie für Java-Vorgänge bereit steht. VM starten und stoppen Sie können nicht nur Speicherparameter für Java setzen. wenn Java nicht benutzt wird. Die Cachegröße wird mit der Befehlszeilenoption -c beim Serverstart gesetzt. ♦ Speicher für den Namensbereich setzen Der Java-Namensbereich ist die Maximalgröße der Datenbankspeichererfordernisse in Bytes. dass alle Erfordernisse des nicht auslagerbaren Speichers erfüllt werden. können Sie folgende Anweisung ausführen: START JAVA 141 . Die Syntax ist einfach: STOP JAVA Die VM wird geladen. Wenn Sie die VM explizit laden wollen. Diese Option kann für einzelne Verbindungen gesetzt werden. betrifft aber den für andere Benutzer verfügbaren Speicher und darf daher nur von einem Benutzer mit DBA-Berechtigung verwendet werden. In vielen Fällen reicht eine Cachegröße von 8 MByte aus. wenn ein Java-Vorgang ausgeführt wird.

Speicher für Java konfigurieren 142 .

K A P I T E L 5 Datenzugriff über JDBC Über dieses Kapitel In diesem Kapitel wird beschrieben. Java-Klassen. wie JDBC für den Zugriff auf Daten eingesetzt werden kann. bieten eine leistungsstärkere Alternative zu gespeicherten Prozeduren in SQL für die Einbeziehung von Programmierlogik in die Datenbank. JDBC kann sowohl aus Clientanwendungen als auch innerhalb einer Datenbank eingesetzt werden. die JDBC verwenden. Inhalt Thema Überblick über JDBC jConnect-JDBC-Treiber verwenden JDBC-ODBC-Brücke verwenden JDBC-Verbindungen herstellen JDBC für den Zugriff auf Daten verwenden Verteilte Anwendungen erstellen Seite 144 150 155 157 165 174 143 .

wie sie beim Client und in der Datenbank eingesetzt werden kann. JDBC-Ressourcen ♦ Erforderliche Software Sie benötigen TCP/IP für den Sybase jConnect- Treiber. SQL Anywhere Studio enthält zwei JDBC-Treiber: den jConnect-Treiber für Anwendungen in reinem Java sowie eine JDBC-ODBC-Brücke. um mit Hilfe eines internen JDBCTreibers auf Daten in der Datenbank zuzugreifen und diese zu ändern. tun Sie dies über JDBCAufrufe. Dieses Kapitel ist keine detailgenaue Anleitung für die JDBCDatenbankschnittstelle. einschließlich der Klasse JDBCExamples. $ Hinweise zur Installation von Java-Beispielen. $ Weitere Hinweise den jConnect-Treiber und seinen Standort finden Sie unter "Die Dateien des jConnect-Treibers" auf Seite 150. die auf dem Rechner des Benutzers laufen. Der Sybase jConnect Treiber kann abhängig von Ihrer Installation von Adaptive Server Anywhere bereits verfügbar sein.Überblick über JDBC Überblick über JDBC JDBC bietet eine SQL-Schnittstelle für Java-Anwendungen: Wenn Sie auf relationale Daten von Java zugreifen wollen. finden Sie unter "Java-Beispiele einrichten" auf Seite 94. sondern liefert einige einfache Beispiele zur Einführung von JDBC und zur Illustration.java in Ihrem SQL Anywhere-Verzeichnis. ♦ JDBC in der Datenbank In einer Datenbank installierte Java-Klassen können JDBC-Aufrufe ausführen. als auch auf Mittelschicht-Anwendungsserver. JDBC und Adaptive Server Anywhere Sie können JDBC auf folgende Weise mit Adaptive Server Anywhere verwenden: ♦ JDBC auf dem Client Java-Clientanwendungen können JDBC-Aufrufe in Adaptive Server Anywhere ausführen. ♦ Beispiel-Quellcode Quellcode für die Beispiele in diesem Kapitel finden Sie in der Datei Samples\ASA\Java\JDBCExamples. 144 . Weitere Hinweise zum Programmieren von JDBC finden Sie in jedem beliebigen JDBCProgrammierhandbuch. $ Die Beispiele veranschaulichen die unterschiedlichen Funktionen beim Einsatz von JDBC in Adaptive Server Anywhere. In diesem Kapitel bezieht sich der Ausdruck Clientanwendung sowohl auf Anwendungen. Die Verbindung erfolgt über einen JDBC-Treiber.

Beide Treiber sind für Windows 95/98/Me und Windows NT/2000/XP sowie die unterstützten UNIX. Einige Aspekte des Verhaltens dieses Treibers werden durch das Protokoll bestimmt und sind so konfiguriert. Er kommuniziert mit Adaptive Server Anywhere über das TDS-Client/Server-Protokoll. Die JDBC-ODBCBrücke bietet vollständig abrollbare Cursor. JDBC-Programmstruktur In JDBC-Anwendungen sind folgende Abläufe typisch: 1 Verbindungsobjekt erstellen Mit dem Aufruf der getConnectionKlassenmethode der Klasse DriverManager wird ein ConnectionObjekt erstellt. das eine Verbindung mit einer Datenbank einrichtet. Die JDBC-ODBC-Brücke benötigt den Adaptive Server Anywhere ODBCTreiber und ist keine reine Java-Lösung. Bei der Auswahl des geeigneten Treibers sollten die folgenden Faktoren beachtet werden: ♦ Features Beide Treiber sind JDK 2-kompatibel. Kompatibilität Das vom jConnect-Treiber verwendete TDS-Protokoll wird mit Adaptive Server Enterprise gemeinsam genutzt.und OLE DBAnwendungen konsistent. "Pure Java" ♦ Der jConnect-Treiber ist eine reine Java-Lösung.Kapitel 5 Datenzugriff über JDBC JDBC-Treiber wählen Für Adaptive Server Anywhere werden zwei JDBC-Treiber bereitgestellt: ♦ jConnect Dieser Treiber ist eine 100% reine Java-Implementierung des Treiber. Sie sind nicht für NetWare oder Windows CE erhältlich. JDBC-ODBC-Brücke ♦ Dieser Treiber kommuniziert mit Adaptive Server Anywhere über das Command Sequence-Client/Server-Protokoll. Statement-Objekt erstellen Das Objekt Connection erstellt ein 2 Statement-Objekt. ♦ ♦ Performance Die JDBC-ODBC-Brücke bietet bessere Performance für die meisten Einsatzbereiche als der jConnect-Treiber.und Linux-Betriebssystemen verfügbar. dass die Kompatibilität mit Adaptive Server Enterprise gewährleistet bleibt. Embedded SQL. Sein Verhalten ist mit ODBC-. 145 . die in jConnect nicht verfügbar sind.

Überblick über JDBC 3 SQL-Anweisung übergeben Eine SQL-Anweisung. die in der Datenbankumgebung ausgeführt werden soll. um den Wert einer Spalte in der aktuellen Zeile zu beziehen. Wenn die Anweisung eine Abfrage ist. wird von der JDK-Version bestimmt. können Sie die JDBC 2. wird an das StatementObjekt übergeben. Das ResultSet-Objekt enthält die von der SQL-Anweisung zurückgegebenen Daten. wird durch diese Aktion ein ResultSet-Objekt zurückgegeben. gibt jedoch jeweils nur eine Zeile aus (ähnlich wie die Arbeitsweise des Cursors). der angibt.0 API verwenden. Sie können die Methode getDate verwenden. ♦ Falls Ihre Datenbank mit JDK 1. JDBC-Funktionen in der Datenbank Die Version von JDBC.2 oder JDK 1.2 oder JDK 1. um mit einer Datenbank zu interagieren und Daten für die eigene Verwendung abzurufen. können Sie die Funktionen von JDBC 1. 146 .1 initialisiert wurde.1 (asajdbc) stellt einige Funktionen von JDBC 2. $ Hinweise zum Upgrade der Datenbanken auf JDK 1.0 von serverseitigen Java-Anwendungen zur Verfügung. 5 Für jede Zeile Werte abrufen Für jede Zeile im ResultSet-Objekt werden Werte entweder mit dem Namen oder der Position der Spalte abgerufen. ♦ Wenn Ihre Datenbank mit JDK 1. ob eine Zeile vorhanden ist. bietet aber keine volle JDBC 2.3 initialisiert wurde. wird eine Zeile weitergeschoben.0-Unterstützung. 4 Schleife über die Zeilen der Ergebnismenge Die next-Methode des Objekts ResultSet führt zwei Aktionen aus: ♦ ♦ Die aktuelle Zeile (die Zeile in der über das Objekt ResultSet ausgegebenen Ergebnismenge). zu der weitergeschoben werden kann.2 verwenden. Java-Objekte können JDBC-Objekte verwenden. Ein Boolescher Wert wird zurückgegeben (TRUE/FALSE). die Sie von Java in der Datenbank benutzen können.3 finden Sie unter "ALTER DATABASE-Anweisung" auf Seite 224 der Dokumentation ASA SQL-Referenzhandbuch oder "Upgrade einer Datenbank mit dem Befehlszeilenprogramm ""dbupgrad""" auf Seite 583 der Dokumentation ASA Datenbankadministration. Der interne JDBC-Treiber für JDK 1. die für die Datenbank eingerichtet wurde. und zwar für die eigene Verarbeitung oder für den Einsatz in anderen Abfragen.

asa. enthält das Paket sybase.0.sql.ResultSet java.ASA und nicht im Paket java.sql. // hier mehr Code ( ( sybase.1-Datenbanken aus benutzen" auf Seite 147.0 Die folgenden Klassen sind Teil der Kernschnittstelle von JDBC 2. Um diese JDBC 2.SAResultSet sybase. Einschränkungen von JDBC 2.1-Datenbanken aus benutzen In diesem Abschnitt wird beschrieben.0-Funktionen von Datenbanken aus benutzt werden. stehen aber im Paket sybase.sql.SAConnection sybase.sql deklariert sind.3 umzustellen. ResultSet rs. wie JDBC 2.sql.sql.sql. Klassen.describe() Der folgende Code ruft die vorherige Zeile in einer Ergebnismenge ab.2-Funktionen beschränkt. In vielen Fällen ist es besser.sql.0-Funktionen von JDK 1. die als java.*.CallableStatement java.0-Funktionen verwenden zu können.sql.sql.SACallableStatement sybase.SADatabaseMetaData Die folgende Funktion bietet ein ResultSetMetaData-Objekt für eine vorbereitete Anweisung ohne das ResultSet oder das Ausführen der Anweisung nötig sind.ResultSetMetaData java.SAResultSetMetaData sybase. bleiben auf die JDBC 1.sql.sql.sql.sql.2 nicht unterstützt wird: import java. eine Funktion. JDBC 2.SAPreparedStatement sybase. ResultSetMetaData sybase.ASA.0 sind.ASA.sql.0-Funktionen von JDK 1. die mit JDK 1.ASA sind: JDBC-Klasse java.SAStatement sybase.sql.SAResultSet)rs ).sql.ASA Funktionen.ASA. Die Klassen in sybase. die Teil von JDBC 2.DatabaseMetaData Interne Sybase-Treiberklasse sybase.ASA. Diese Funktion ist nicht Teil des Standards JDBC 1.Kapitel 5 Datenzugriff über JDBC $ Weitere Hinweise finden Sie unter "JDBC 2.PreparedStatement java. die in JDBC 1.SAPreparedStatement. Ihre Version von Java in der Datenbank auf 1.Connection java. die mit JDK 1. Bei Datenbanken.sql.sql. import sybase.sql.sql.1 initialisiert wurden.*.ASA.2.Statement java.asa.ASA nicht zur Verfügung: 147 .ASA.sql einbauen.sql. müssen Sie Ihre JDBC-Objekte in die entsprechenden Klassen im Paket sybase.sql.previous().1 initialisiert wurden.

sql.sql.sql.Clob getClob( int pidx ) java. java.Blob getBlob( int cidx ) java. java.sql.sql.Clob getClob( int cidx ) java. java.Clob java.sql.Ref getRef( int cidx ) java.util.Map getTypeMap() void setTypeMap( java.Blob getBlob( String cName ) java. java.util.sql.Blob b ) void setClob( int pidx.sql.0 sind im Paket sybase.Clob getClob( String cName ) java.Array java.sql.util.Map Die folgenden Kernfunktionen von JDBC 2. java.Map map ) java.sql.sql.sql.Map map ) java.Clob c ) void setArray( int pidx.sql.sql.ASA nicht verfügbar: Klasse in sybase.Array a ) SACallableStatement Object getObject( pidx.sql.Map map ) SAPreparedStatement void setRef( int pidx.sql.sql.Ref java.Map map ) java.ASA SAConnection Fehlende Funktionen java. java.Ref getRef( String cName ) java.Blob java.sql. java.Array getArray( int pidx ) SAResultSet Object getObject( int cidx.Überblick über JDBC ♦ ♦ ♦ ♦ ♦ ♦ java.Ref getRef( int pidx ) java.Array getArray( int cidx ) Object getObject( String cName.sql.sql.sql.util.Struct java.Ref r ) void setBlob( int pidx.Blob getBlob( int pidx ) java.Array getArray( String cName ) 148 .sql.sql.util.sql.

dass eine Verbindung mit der Datenbankumgebung hergestellt wird. ♦ Serverseitig Wenn JDBC innerhalb des Datenbankservers eingesetzt wird. ist bereits eine Verbindung vorhanden. während die interne Verbindung jdbc:default:connection benötigt.und auf der Serverseite ausgeführt werden. JDBC-Klassen können so geschrieben werden.und serverseitigen JDBCVerbindungen Der Unterschied zwischen dem JDBC-Treiber auf dem Client bzw.Kapitel 5 Datenzugriff über JDBC Unterschiede zwischen client.getConnection übergeben. effizienter und sicherer Vorgang. weil die Clientanwendung die Sicherheitsprüfung der Datenbank zur Herstellung der Verbindung bereits bestanden hat. Die Datenbankumgebung ist von der Perspektive der Clientanwendung aus eine externe Anwendung. Die Übergabe von Argumenten an DriverManager. auf dem Datenbankserver liegt darin.Treiber oder der JDBCODBC-Brücke von Adaptive Server Anywhere. Der Wert jdbc:default:connection wird an DriverManager. Dies ist ein schneller. ♦ Clientseitig Beim clientseitigen JDBC-Treiber erfordert die Herstellung einer Verbindung den Sybase jConnect JDBC. Eine externe Verbindung erfordert den Rechnernamen und die Portnummer. indem Sie eine einzige bedingte Anweisung für die Angabe des URL verwenden.getConnection richtet die Verbindung ein. damit die JDBC-Anwendung die Möglichkeit erhält. innerhalb der aktuellen Benutzerverbindung zu arbeiten. Der interne JDBC-Treiber kann nur mit der Datenbank der aktuellen Verbindung eine Verbindung herstellen. Benutzer-ID und Kennwort wurden angegeben und brauchen nicht noch einmal angegeben zu werden. 149 . dass sie auf der Client.

jar Mit dem folgenden Befehl wird der jConnect 4. Beispiele in diesem Kapitel verwenden jConnect 5. Es werden zwei Versionen von jConnect bereitgestellt: ♦ jConnect 4. jConnect 5.5 wird als jar-Datei mit dem Namen jconn2. um JDBC von Clientanwendungen aus einsetzen zu können. besteht die Möglichkeit.5 ist im Verzeichnis Sybase\Shared\jConnect-4_5 installiert.Suchpfad\jConnect-5_5\classes\jconn2.5 Diese Version von jConnect ist für die Entwicklung von JDK 1. müssen die jConnectKlassen beim Kompilieren und Ausführen in die Umgebungsvariable CLASSPATH einbezogen sein. wobei Suchpfad Ihr Sybase\Shared– Verzeichnis ist.5-Treiber einer vorhandenen CLASSPATH-Umgebungsvariablen hinzugefügt: set classpath=%classpath%. sodass der Java-Compiler und die JavaMachine die notwendigen Dateien ausfindig machen können.2-Anwendungen vorgesehen. set classpath=%classpath%.jConnect-JDBC-Treiber verwenden jConnect-JDBC-Treiber verwenden Wenn Sie JDBC von einer Clientanwendung oder einem Applet aus verwenden wollen.5. jConnect 4.5-Treiber in eine vorhandene CLASSPATH-Umgebungsvariable ein.5 ist im Verzeichnis Sybase\Shared\jConnect-5_5 installiert. jConnect gehört zum Lieferumfang von SQL Anywhere Studio. Wenn Sie Adaptive Server Anywhere als Teil eines anderen Paketes erhalten haben. Der folgende Befehl fügt den jConnect 5. Sie können JDBC in der Datenbank ohne jConnect verwenden. brauchen Sie den jConnect JDBC-Treiber. jConnect 4. jConnect 5.1-Anwendungen vorgesehen. Benutzer von jConnect 4. Die Dateien des jConnect-Treibers Der jConnect JDBC-Treiber ist in einer Reihe von Verzeichnissen unter Sybase\Shared installiert. ♦ jConnect 5. dass jConnect nicht enthalten ist.jar geliefert.5 Diese Version von jConnect ist für die Entwicklung von JDK 1.5 müssen die entsprechenden Anpassungen vornehmen. um eine Verbindung mit Datenbanken von Adaptive Server Anywhere herstellen zu können.5 wird als Gruppe von Klassen geliefert. CLASSPATH für jConnect einrichten Damit Ihre Anwendung "jConnect" verwenden kann.Suchpfad\jConnect-4_5\classes 150 . Sie brauchen jConnect.

Sie können die jConnect-Systemobjekte über Sybase Central oder über Interactive SQL installieren.* Wenn Sie jConnect 4.Kapitel 5 Datenzugriff über JDBC jConnect-Klassen importieren Die Klassen in jConnect befinden sich alle im Paket com.5 verwenden.5 verwenden.jdbc2. Die jConnect-Systemobjekte werden standardmäßig jeder neuen Datenbank hinzugefügt. Sie müssen diese Klassen am Anfang einer jeden Quelldatei importieren: import com.sql wobei Suchpfad Ihr SQL Anywhere-Verzeichnis ist.sybase. Im linken Fensterausschnitt von Sybase Central rechtsklicken Sie auf das Datenbanksymbol und wählen "jConnect Metadatenunterstützung neu installieren" aus dem Einblendmenü.jdbc. jdbc.sybase.* jConnect-Systemobjekte in einer Datenbank installieren Wenn Sie mit jConnect auf Systemtabellendaten zugreifen wollen (Datenbank-Metadaten). v So fügen Sie jConnect-Systemobjekte einer Datenbank hinzu (Sybase Central): 1 2 Stellen Sie von Sybase Central aus als Benutzer mit DBA-Berechtigung eine Verbindung her.jdbc. müssen Sie die jConnect-Systemobjekte Ihrer Datenbank hinzufügen. muss Ihre Anwendung auf Klassen in com. beim Upgrade oder zu einem späteren Zeitpunkt hinzufügen.sybase. 151 .jdbc zugreifen. Wenn Sie jConnect 5.jdbc2. befinden sich die Klassen in com. Sie müssen diese Klassen am Anfang einer jeden Quelldatei importieren: import com. v So fügen Sie jConnect-Systemobjekte einer Datenbank hinzu (Interactive SQL): ♦ Stellen Sie über Interactive SQL als Benutzer mit DBA-Berechtigung eine Verbindung her und geben Sie im Ausschnitt für die Eingabe der SQL-Anweisungen folgenden Befehl ein: read Suchpfad\scripts\jcatalog. Sie können die jConnect-Objekte der Datenbank beim Erstellen.sybase.sybase.

// jConnect-Treiber verwenden .. // zur Verbindung mit angegebenem Rechnernamen. jConnect-Treiber laden Bevor Sie jConnect in Ihrer Anwendung benutzen können. temp. _props ).append("jdbc:sybase:Tds:").sql Dabei gilt: Benutzer und Kennwort gehören zu einem Benutzer mit DBABerechtigung. und Suchpfad ist Ihr SQL Anywhere-Verzeichnis.. Mit der Methode newInstance werden Probleme in einigen Browsern vermieden.. conn = DriverManager.toString() .jConnect-JDBC-Treiber verwenden Tipp Sie können die jConnect-Systemobjekte einer Datenbank auch über die Befehlszeile hinzufügen: Die Eingabe bei der Eingabeaufforderung lautet wie folgt: dbisql -c "uid=Benutzer.jdbc. Ein Beispiel finden Sie im Abschnitt "Von einer JDBC-Clientanwendung aus mit jConnect eine Verbindung herstellen" auf Seite 157 Die Anweisung lautet wie folgt: StringBuffer temp = new StringBuffer().jdbc2.append(_coninfo). müssen Sie einen "Uniform Resource Locator" (URL) für die Datenbank angeben.SybDriver").. // und baue Verbindung auf.getConnection(temp. temp. müssen Sie die Treiber laden. temp.toString()). System. Einem Server einen URL liefern Um per jConnect eine Verbindung mit einer Datenbank herzustellen.pwd=Kennwort" Suchpfad\scripts\jcatalog.. Der URL wird folgendermaßen zusammengesetzt: jdbc:sybase:Tds:Rechnername:Portnummer Die einzelnen Komponenten sind: 152 .println(temp. Class.out.sybase. // auf der Standard-Portnummer des ASA.newInstance(). indem Sie folgende Anweisung eingeben..append(":2638").forName("com.

forName( "com. props = new Properties(). und vor bzw.Kapitel 5 Datenzugriff über JDBC ♦ ♦ jdbc:sybase:Tds Der Sybase jConnect JDBC Treiber unter Verwendung des TDS-Anwendungsprotokolls Rechnername Die IP-Adresse oder der Name des Rechners. es sei denn. sybDrvr.db". "dbf=asademo. "DBA" ). Wenn Sie eine Verbindung auf demselben Rechner herstellen.getConnection( "jdbc:sybase:Tds:localhost". sybDrvr = (SybDriver)Class. Der Verbindungsversuch wird mit der Standarddatenbank auf dem Server vorgenommen. props. ist ein Standardverfahren. props ). props.und Kleinschreibung von servicename wird nicht berücksichtigt. Sie können eine bestimmte Datenbank angeben. Portnummer Die Portnummer. um einem URL Argumente zu liefern.SybDriver" ).jdbc2. dies nicht zu tun. es gibt besondere Gründe.newInstance(). also den aktuellen Rechner. Datenbank auf einem Server angeben Jeder Adaptive Server Anywhere-Server kann mehrere Datenbanken gleichzeitig laden. nicht aber eine Datenbank. gefolgt von einer Reihe von Zuordnungen. props ). Nachstehend wird ein Beispielcode für die Verwendung dieses Feldes gezeigt. können Sie localhost benutzen.put( "Password".sybase. nach dem =-Zeichen darf es keine Leerstellen geben.put( "User". Die Groß. Connection con = DriverManager. auf dem der Server läuft. Die Verbindungszeichenfolge darf nicht länger als 252 Zeichen sein. Die Adaptive Server Anywhere zugewiesene Portnummer ist 2638. Der oben angegebene URL legt einen Server fest.jdbc. Sie sollten diese Nummer verwenden.setRemotePassword( null. Mit dem Parameter RemotePWD 153 . Der Parameter DBN ist der Datenbankname. "SQL" ). indem Sie die URL-Angabe wie folgt erweitern: Mit dem Parameter ServiceName jdbc:sybase:Tds:Rechnername:Portnummer?ServiceName=DBN Das Fragezeichen. Eine allgemeinere Methode ist die Eingabe zusätzlicher Verbindungsparameter wie Datenbankname oder Datenbankdatei mit dem Feld RemotePWD: Setzen Sie RemotePWD als Eigenschaftsfeld mit der Methode setRemotePassword(). an der der Datenbankserver auf ♦ Verbindungsanforderungen wartet.

Standardmäßig wird die Datenbank mit autostop=YES gestartet.jConnect-JDBC-Treiber verwenden Mit dem Parameter für die Datenbankdatei DBF können Sie mit jConnect eine Datenbank auf einem Server starten. 154 . Für jConnect-Verbindungen eingestellte Datenbankoptionen Wenn sich eine Anwendung mit dem jConnect-Treiber mit der Datenbank verbindet. werden zwei gespeicherte Prozeduren aufgerufen: 1 2 sp_tsql_environment stellt einige Datenbankoptionen für die Kompatibilität mit Adaptive Server Enterprise ein. die einige andere Optionen einstellt. Insbesondere legt die Prozedur spt_mda die Einstellung der Option QUOTED_IDENTIFIER fest. Anschließend wird die Prozedur spt_mda aufgerufen. Wenn Sie DBF oder DBN mit utility_db eingeben. $ Weitere Hinweise zur Dienstprogramm-Datenbank finden Sie unter "Die Dienstprogrammdatenbank verwenden" auf Seite 249 der Dokumentation ASA Datenbankadministration. wird die Dienstprogramm-Datenbank automatisch gestartet. Zum Ändern des Standardverhaltens sollten Sie die Prozedur spt_mda ändern.

IDriver". wie eine Verbindung mit der JDBCODBC-Brücke hergestellt wird: String driver. Connection conn. Wenn Anwendungen mit diesem Treiber eingeführt werden. url = "jdbc:odbc:dsn=ASA 8. Class. finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration.forName( driver ). die Sie im Unterverzeichnis Java der SQL Anywhere-Installation finden. Unter Windows ist die systemeigene Komponente in der Datei dbjodbc8.forName geladen werden. $ Hinweise zur Auswahl des JDBC-Treibers finden Sie unter "JDBCTreiber wählen" auf Seite 145. nicht mit import-Anweisungen importiert werden. Die Komponente muss im Systempfad enthalten sein.ml.getConnection( url ). Verbindung herstellen Dieser Code weist folgende Besonderheiten auf: ♦ Da die Klassen mit Class. Die Verbindungszeichenfolge ist in der Regel eine ODBC-Datenquelle.jdbcodbc.dll im Unterverzeichnis win32 der SQL Anywhere-Installation zu finden. 155 . das die JDBC-ODBC-Brücke enthält. die Sie in einer Verbindungszeichenfolge verwenden können. einzelne Verbindungszeichenfolgen zusätzlich zu oder an Stelle der Datenquelle verwenden. die JDBC-ODBC-Brücke ist jedoch im Gegensatz zum jConnect-Treiber keine reine Java-Lösung. gefolgt von einer standardmäßigen ODBC-Verbindungszeichenfolge. url. Der folgende Code veranschaulicht.0 Sample". driver="ianywhere. ♦ jodbc.so. Sie können jedoch auch explizit durch Strichpunkte getrennte. Erforderliche Dateien Die Java-Komponente der JDBC-ODBC-Brücke ist in der Datei jodbc. für UNIX und Linux befindet sich die systemeigene Komponente in dbjodbc8. wenn Sie die Anwendung ausführen.jar enthalten. Weitere Hinweise zu den Optionen. ♦ Der URL enthält jdbc:odbc:. conn = DriverManager. muss das Paket. der eine bessere Performance sowie einige zusätzliche Funktionen im Vergleich zum jConnect JDBC-Treiber ausweist. müssen auch die ODBC-Treiberdateien installiert werden.Kapitel 5 Datenzugriff über JDBC JDBC-ODBC-Brücke verwenden Die JDBC-ODBC-Brücke bietet einen JDBC-Treiber.jar muss im Classpath enthalten sein.

. url += "driver=Adaptive Server Anywhere 8.. 156 . sollen Sie den ODBC-Treiber angeben. Zeichensätze Unter UNIX verwendet die JDBC-ODBC-Brücke keine ODBC-UnicodeBindungen oder -Aufrufe und nimmt keine Zeichensatzkonvertierungen vor.".JDBC-ODBC-Brücke verwenden Falls Sie keine Datenquelle verwenden. Das Senden von Nicht-ASCII-Daten über die Brücke führt zur Beschädigung der Daten.0. um Zeichensatzkonvertierungen vorzunehmen. Unter Windows verwendet die JDBC-ODBC-Brücke ODBC-UnicodeBindungen und -Aufrufe. indem Sie die Treiberoption zur Verbindungszeichenfolge hinzufügen: url = "jdbc:odbc:"..

die von einer JavaAnwendung aus eine JDBC-Datenbankverbindung herstellen. eine Reihe von Daten auf der Befehlszeile ausgibt und beendet wird. Hinweise zur Herstellung von Verbindungen mit der JDBC-ODBC-Brücken finden Sie unter "JDBC-ODBC-Brücke verwenden" auf Seite 155. vollständige Java-Anwendung ist eine Befehlszeilenanwendung. die im Datenbankserver laufen. bei der es sich um eine reguläre Client/Server-Verbindung handelt. finden Sie unter "Verbindung von einer serverseitigen JDBC-Klasse herstellen" auf Seite 161. Diese Prozeduren werden in allen Datenbanken standardmäßig installiert. Der erste Schritt einer beliebigen JDBC-Anwendung ist die Herstellung der Verbindung mit der Datenbank. In den Beispielen in diesem Abschnit werden jConnect (clientseitig) oder Java in der Datenbank (serverseitig) verwendet. Die folgende. Von einer JDBC-Clientanwendung aus mit jConnect eine Verbindung herstellen Wenn Sie von einer JDBC-Anwendung auf Datenbank-Systemtabellen zugreifen wollen (Datenbank-Metadaten). wenn sie mit dieser arbeiten will. Die internen JDBCTreiberklassen und jConnect nutzen gemeinsam gespeicherte Prozeduren für die Unterstützung der Datenbank-Metadaten.Kapitel 5 Datenzugriff über JDBC JDBC-Verbindungen herstellen In diesem Abschnitt werden Klassen vorgestellt. Hinweise zum Erstellen einer internen Verbindung von Java-Klassen. 157 . Der Parameter dbinit -i verhindert die Installation. $ Dieses Beispiel veranschaulicht eine externe Verbindung. müssen Sie eine Reihe von jConnect-Systemobjekten in Ihre Datenbank einfügen. die eine Verbindung mit einer laufenden Datenbank herstellt. $ Weitere Hinweise zum Hinzufügen von jConnect-Systemobjekten in eine Datenbank finden Sie unter "jConnect-JDBC-Treiber verwenden" auf Seite 150.

Der Quellcode befindet sich in den Methoden main und ASAConnect in der Datei JDBCExamples. } try{ getObjectColumn().println( "Error: " + e.*. // classes public class JDBCExamples{ private static Connection conn.printStackTrace(). getObjectColumnCastClass(). ASAConnect( "DBA".Properties.java im Verzeichnis Samples\ASA\Java in Ihrem SQL Anywhere-Verzeichnis. // import com. import java.out. }else{ System. // import asademo.length == 1 ? args[0] : "localhost" ). e. public static void main( String args[] ){ // Verbindung herstellen conn = null. } catch( Exception e ){ System.sql. } } JDBC // Sybase jConnect Eigenschaften Sybase Dienstprogramme Beispielklassen 158 .*.sybase. // import sybase. insertObject().) import java.*.jdbc2. if( conn!=null ) { System.println( "Connection failed" ).getMessage() ).println( "Connection successful" ). machineName ).JDBC-Verbindungen herstellen Beispielcode für eine externe Verbindung Es folgt ein Beispiel-Quellcode für die Methoden.sql.util.*. String machineName = ( args. (Die Kommentare werden zum besseren Verständnis hier in deutscher Übersetzung wiedergegeben.out.out. "SQL". die zum Herstellen einer Verbindung eingesetzt werden.jdbc.

Der aus com. Sie finden sie in der Datei classes. userID ). Die Anwendung benutzt eine Eigenschaftsliste (property list). Sie finden sie in der Datei classes. 159 ♦ ♦ ♦ .printStackTrace(). props. String password. props. Pakete importieren Die Anwendung benötigt mehrere Bibliotheken.getConnection( dbURL . die Verbindungen über jConnect herstellen.util. e.jdbc2. } catch ( Exception e ) { System.sybase. Deren Import erfolgt in den ersten Zeilen von JDBCExamples. die für alle JDBC-Anwendungen erforderlich sind.jar.SybDriver" ). um mit Eigenschaftslisten arbeiten zu können.zip im Java-Unterverzeichnis.println( dbURL ).jdbc importierte Sybase jConnect JDBCTreiber ist für alle Anwendungen erforderlich.sql enthält die JDBC-Klassen von Sun Microsystems. Die Klasse java. } } So funktioniert das Beispiel für eine externe Verbindung Das Beispiel für eine externe Verbindung ist eine JavaBefehlszeilenanwendung.out.println( "Error: " + e.Properties ist erforderlich.out.put( "user". password ).forName( "com. // jConnect laden try { Class.zip im JavaUnterverzeichnis. "true").jdbc.sybase. String dbURL = "jdbc:sybase:Tds:" + machineName + ":2638/?JCONNECT_VERSION=5".java: ♦ Das Paket java. props ). System. die in einigen Beispielen verwendet werden. String machineName ) { // Mit einem Adaptive Server Anywhere verbinden String coninfo = new String( machineName ).put( "password". conn = DriverManager. props.put("DYNAMIC_PREPARE".Kapitel 5 Datenzugriff über JDBC private static void ASAConnect( String userID. Das Paket asademo enthält Klassen.getMessage() ). Properties props = new Properties().jdbc2. Sie finden es in der Datei Samples\ASA\Java\asademo.newInstance().

Einen solchen Server können Sie auf Ihrem lokalen Rechner starten. indem Sie folgenden Befehl ausführen (vom Unterverzeichnis Samples\ASA\Java aus): 160 . wie das Beispiel für eine externe Verbindung ausgeführt wird. Wechseln Sie in das Unterverzeichnis Samples\ASA\Java.getConnection stellt mit der Verbindungszeichenfolge eine Verbindung her. die beim Programmstart aufgerufen wird. wenn ein solcher übergeben wurde. Die Methode JDBCExamples. ♦ ♦ Class. Sie ruft die Methode "ASAConnect" auf. 2 3 Die Methode "ASAConnect" Die Methode JDBCExamples. In diesem einfachen Beispiel ist JDBCExamples.main die einzige Methode in der Anwendung. damit eine Verbindung hergestellt wird. Die Datenbank muss auf einem Datenbankserver geladen sein. der sich für den Personal Datenbankserver eignet. der mit TCP/IP läuft. ♦ 2 Sie gibt die Kontrolle an die aufrufende Methode zurück.ASAConnect führt folgende Aufgaben aus: 1 Sie stellt über Sybase jConnect eine Verbindung mit der laufenden Standarddatenbank her.forName lädt jConnect. Beispiel für eine externe Verbindung In diesem Abschnitt wird beschrieben. Mit der Methode newInstance werden Probleme in einigen Browsern vermieden. v So wird die Beispielanwendung für eine externe Verbindung erstellt und ausgeführt: 1 2 3 4 Öffnen Sie eine Befehlszeile. Sie führt mehrere Methoden aus. Wechseln Sie in Ihr SQL Anywhere-Verzeichnis. die Daten in die Befehlszeile abrollen. Die StringBuffer-Anweisungen bauen aus der Literal-Zeichenfolge und dem in der Befehlszeile angegebenen Rechnernamen eine Verbindungszeichenfolge auf.main führt folgende Aufgaben aus: 1 Sie verarbeitet das Befehlszeilenargument und benutzt dabei den Rechnernamen. Standardmäßig ist der Name des Rechners localhost.JDBC-Verbindungen herstellen Die Methode "main" Jede Java-Anwendung erfordert eine Klasse mit einer Methode mit dem Namen main. DriverManager.

Auch Klassen. Da die serverseitige Klasse von einem bereits verbundenen Benutzer ausgeführt wird.java in Ihrem SQL AnywhereVerzeichnis: public static void InternalConnect() { try { conn = DriverManager. Verbindung von einer serverseitigen JDBC-Klasse herstellen SQL-Anweisungen werden in JDBC mit Hilfe der Methode createStatement des Connection-Objekts aufgebaut. wobei es sich um ein Alias für den Namen des aktuellen Rechners handelt. Eine Verbindung von einer serverseitigen JDBC-Klasse herzustellen ist einfacher. ob Ihr CLASSPATH richtig eingestellt wurde.out. Prüfen Sie.Kapitel 5 Datenzugriff über JDBC start dbeng8 .\. Den Quellcode finden Sie in der Methode InternalConnect in Samples\ASA\Java\JDBCExamples.. System. 161 . Prüfen Sie. als eine externe Verbindung einzurichten. Ein falscher CLASSPATH führt dazu. müssen eine Verbindung herstellen.\asademo 5 Führen Sie das Beispiel aus.\. $ Weitere Hinweise zur Verwendung von jConnect finden Sie unter "jConnect-JDBC-Treiber verwenden" auf Seite 150 sowie in der OnlineDokumentation für jConnect.. müssen Sie den Namen dieses Rechners eingeben. Wenn der Verbindungsversuch fehlschlägt. erscheint stattdessen eine Fehlermeldung. ob Sie alle erforderlichen Schritte ausgeführt haben.println("Hello World").. Beispielcode für eine serverseitige Verbindung Nachstehend wird der Quellcode für das Beispiel gezeigt. verwendet die Klasse einfach die vorhandene Verbindung. Der Standard ist localhost. die innerhalb des Servers laufen. dass eine Klasse nicht gefunden werden kann. 6 Eine Liste von Personen und Produkten muss an der Eingabeaufforderung angezeigt werden.getConnection("jdbc:default:connection"). der auf einem anderen Rechner läuft. indem Sie an der Eingabeaufforderung folgenden Befehl eingeben: java JDBCExamples Wenn Sie dies mit einem Server ausprobieren wollen. damit ein Connection-Objekt erstellt wird.

JDBC-Verbindungen herstellen } catch ( Exception e ) { System. } } } So funktioniert das Beispiel für eine serverseitige Verbindung In diesem einfachen Beispiel ist InternalConnect() die einzige Methode in der Anwendung. System. Die InternalConnect()-Methode führt folgende Aufgaben aus: 1 Sie stellt über die aktuelle Verbindung eine Verbindung mit der laufenden Standarddatenbank her: ♦ DriverManager.printStackTrace().getMessage()).out. die in der ersten Zeile der Klasse JDBCExamples. e. die Auskunft über die Stelle gibt. erscheint eine Fehlermeldung im Serverfenster. 4 Beendet die Klasse So wird das Beispiel für eine serverseitige Verbindung ausgeführt. wie das Beispiel für eine serverseitige Verbindung ausgeführt wird. Die Anweisungen try und catch bieten den Rahmen für die Fehlerbehandlung. d. Die Anwendung erfordert nur eine der Bibliotheken (JDBC).h. 2 3 Sie gibt an der aktuellen Standardausgabe. Das Paket java.java importiert werden. Hello World aus.println führt die Ausgabe aus. an der der Fehler aufgetreten ist.out. im Serverfenster. In diesem Abschnitt wird beschrieben. 162 . Wenn bei dem Verbindungsversuch ein Fehler auftritt.sql enthält die JDBC-Klassen.println("Error: " + e.getConnection stellt eine Verbindung unter Verwendung der Verbindungszeichenfolge jdbc:default:connection her. Die anderen werden für externe Verbindungen benötigt.

indem Sie folgenden Befehl ausführen (vom Unterverzeichnis Samples\ASA\Java aus): start dbeng8 .java 2 Starten Sie einen Datenbankserver mit der Beispieldatenbank. Wenn Sie das JDK verwenden. Wenn die Verbindung mit der Beispieldatenbank hergestellt ist. als wenn Sie eine gespeicherte Prozedur aufrufen würden: CALL JDBCExamples>>InternalConnect() Beim ersten Aufruf einer Java-Klasse muss die Java Virtual Machine gestartet werden. 5 Auf dem Serverbildschirm muss Hello World erscheinen..java. Dies kann einige Sekunden dauern. da jConnect nicht verwendet wird. die Klasse mit Sybase Central zu installieren. Öffnen Sie den Ordner mit den Java-Objekten bei vorhandener Verbindung mit der Datenbank und doppelklicken Sie auf "Java-Klasse hinzufügen". 3 Installieren Sie die Klasse in der Beispieldatenbank. Es besteht außerdem die Möglichkeit. 163 . 4 Jetzt können Sie die Methode InternalConnect dieser Klasse aufrufen.\asademo In diesem Fall ist das TCP/IP-Netzwerkprotokoll nicht erforderlich. Befolgen Sie dann die Anweisungen im Assistenten.\.class’ Dabei gilt: Suchpfad ist der Suchpfad zu Ihrem Installationsverzeichnis. können Sie im Verzeichnis Samples\ASA\Java von einer Befehlszeile aus folgendermaßen vorgehen: javac JDBCExamples. können Sie von Interactive SQL aus folgenden Befehl verwenden: INSTALL JAVA NEW FROM FILE ’Suchpfad\Samples\ASA\Java\JDBCExamples... kompilieren Sie die Datei JDBCExamples.Kapitel 5 Datenzugriff über JDBC v So wird die Beispielanwendung für eine interne Verbindung erstellt und ausgeführt: 1 Falls Sie es noch nicht getan haben.\. Einen solchen Server können Sie auf Ihrem lokalen Rechner starten.

Derzeit ist das serverseitige JDBC-Verhalten auf "Festschreiben" eingestellt. sondern auch für andere Verbindungseigenschaften wie TransactionIsolation und isReadOnly. Nachfolgende Aufrufe geben einen Behälter der aktuellen Verbindung mit allen unveränderten Verbindungseigenschaften zurück. ♦ Standardwerte für die Verbindung Bei der serverseitigen JDBC erstellt nur der erste Aufruf von getConnection( "jdbc:default:connection" ) eine neue Verbindung mit den Standardwerten.getAutoCommit(). Dabei gilt: conn ist das aktuelle Verbindungsobjekt. Sie können dieses Verhalten steuern. Verwenden Sie dafür den folgenden Programmcode: Connection conn = DriverManager.setAutoCommit( false ) . boolean oldAutoCommit = conn.JDBC-Verbindungen herstellen Hinweise zu JDBC-Verbindungen ♦ AutoCommit-Verhalten Die JDBC-Spezifikation erfordert. dass standardmäßig nach jeder Datenänderungsanweisung ein COMMIT ausgeführt wird. geben alle nachfolgenden getConnection Aufrufe in demselben Java-Code eine Verbindung mit AutoCommit in Stellung OFF zurück. 164 . } Diese Hinweise gelten nicht nur für AutoCommit. die Verbindungseigenschaften beim Schließen der Verbindung auf die Standardwerte zurücksetzen zu lassen.getConnection(""). try { // Code hierher setzen } finally { conn. Es kann sinnvoll sein. damit nachfolgende Verbindungen mit Standard-JDBC-Werten eingerichtet werden.setAutoCommit( oldAutoCommit ). indem Sie folgende Anweisung verwenden: conn. Wenn Sie AutoCommit in Ihrer ursprünglichen Verbindung auf OFF setzen.

Als Einführung kann es jedoch hilfreich sein. um die Fähigkeiten von JDBC zu demonstrieren. bieten einen erheblichen Vorteil gegenüber traditionellen in SQL geschriebenen gespeicherten Prozeduren. Der Datenbankserver analysiert die Anweisung syntaktisch. installieren Sie die Datei JDBCExamples. die eine Zeile in die Tabelle Department einfügen. Wenn eine ähnliche Anweisung häufig ausgeführt werden soll (z. Syntaktische Analyse und Auswahl eines Ausführungsplans werden in der Folge als Vorbereitung der Anweisung bezeichnet. Beispielcode Die Codefragmente in diesem Abschnitt stammen aus der vollständigen Klasse Samples\ASA\Java\JDBCExamples. Statische SQL-Anweisungen werden in der Java-Anwendung aufgebaut und zur Datenbank gesandt. welche Vorbereitungsmaßnahmen für die Beispiele im restlichen Teil des Kapitels ergriffen werden müssen. die einige oder alle Klassen in der Datenbank enthalten. In diesem Abschnitt verwenden wir statische SQL. v So wird die Klasse JDBCExamples installiert: 1 Wenn Sie dies noch nicht getan haben. wählt einen Ausführungsplan und führt die Anweisung aus. Wie auch bei anderen Schnittstellen können SQL-Anweisungen in JDBC entweder statisch oder dynamisch sein.Kapitel 5 Datenzugriff über JDBC JDBC für den Zugriff auf Daten verwenden Java-Anwendungen. viele Einfügungen in eine Tabelle). Die Anweisung wird einmal mit Hilfe dieser Platzhalter vorbereitet und kann dann mehrmals ausgeführt werden. Dynamische SQL wird weiter unten behandelt.B. Vorbereitung der Beispiele In diesem Abschnitt wird beschrieben. ohne dass sie neuerlich vorbereitet werden muss. können Sie im Fensterausschnitt für die SQL-Anweisungen folgenden Befehl verwenden: 165 . In den folgenden Beispielen werden Java-Klassen geschrieben. Wenn die Verbindung von Interactive SQL mit der Beispieldatenbank hergestellt ist. Parallelen zu mit SQL geschriebenen gespeicherten Prozeduren zu ziehen. kann dies zu erheblichem Overhead in der statischen SQL führen. Im Gegensatz dazu enthält eine dynamische SQL-Anweisung Platzhalter. weil jedesmal der Vorbereitungsschritt ausgeführt werden muss.class in der Beispieldatenbank.java.

Der Programmcode für das Einfügen von Werten aus einer externen Anwendung mit JDBC benötigt eine andere Verbindung.out. Es besteht außerdem die Möglichkeit. DELETE. // Anzahl von aktualisierten Zeilen ausgeben System. Das folgende Codefragment veranschaulicht. Anweisungen wie CREATE TABLE und andere Anweisungen zur Datendefinition können auch mit executeUpdate ausgeführt werden. Befolgen Sie dann die Anweisungen im Assistenten. // AutoCommit deaktivieren conn.setAutoCommit( false ).class’ Dabei gilt: Suchpfad ist der Suchpfad zu Ihrem Installationsverzeichnis.println(IRows. die Klasse mit Sybase Central zu installieren. UPDATE. } 166 . Aktualisieren und Löschen mit JDBC Das Objekt Statement führt statische SQL-Anweisungen aus. die keine Ergebnismengen zurückgeben. ist aber ansonsten unverändert. SQLAnweisungen wie INSERT. Einfügen.toString() + " row inserted" ). die im Verbindungsobjekt conn definiert ist. können Sie mit Hilfe der Methode executeUpdate des Objekts Statement ausführen. public static void InsertFixed() { // Gibt die aktuelle Verbindung zurück conn = DriverManager.JDBC für den Zugriff auf Daten verwenden INSTALL JAVA NEW FROM FILE ’Suchpfad\Samples\ASA\Java\JDBCExamples.createStatement(). wie INSERT-Anweisungen innerhalb von JDBC ausgeführt werden.executeUpdate ("INSERT INTO Department (dept_id. Öffnen Sie den Ordner mit den Java-Objekten bei vorhandener Verbindung mit der Datenbank und doppelklicken Sie auf "Java-Klasse hinzufügen". dept_name )" + "VALUES (201. Statement stmt = conn. Integer IRows = new Integer( stmt. 'Eastern Sales')" ) ). Es benutzt eine interne Verbindung.getConnection("jdbc:default:connection").

um die Zeile zu entfernen. In diesem Beispiel haben Sie gesehen. Hinweise ♦ Die Methode setAutoCommit deaktiviert das AutoCommit-Verhalten. Die Klasse "Integer" ist ein Behälter für den grundlegenden Datentyp int. Sie wird gemeinsam mit den anderen Java-Beispielklassen installiert. die ausgegeben werden muss. sodass Änderungen nur festgeschrieben werden. Die Ausgabe erfolgt im Serverfenster. 167 . wie eine sehr einfache JDBC-Klasse erstellt wird. toString(). der einige nützliche Methoden enthält.B. die von dem Vorgang betroffen waren. Sie können eine ROLLBACKAnweisung ausführen. wie z. wie Sie die Java-Beispiele installieren können. die sich im Unterverzeichnis Samples\ASA\Java Ihres Installationsverzeichnisses befindet. Die nächsten Beispiele bauen darauf auf. finden Sie unter "Java-Beispiele einrichten" auf Seite 94. die die Anzahl der Zeilen ausdrückt. Die Ganzzahl IRows wird in eine Zeichenfolge konvertiert. $ Weitere Hinweise. In diesem Fall würde ein erfolgreicher INSERT-Vorgang den Wert Eins (1) zurückgeben. Der Rückgabetyp "Ganzzahl" wird in ein Objekt Integer konvertiert. wenn eine explizite COMMIT-Anweisung ausgeführt wird.Kapitel 5 Datenzugriff über JDBC Quellcode verfügbar Dieses Codefragment ist Teil der Methode InsertFixed der Klasse JDBCExamples. Die Klasse JDBCExamples muss installiert sein. ♦ ♦ ♦ v So wird das Beispiel JDBC Insert ausgeführt: 1 2 Über Interactive SQL stellen Sie als Benutzer DBA eine Verbindung mit der Beispieldatenbank her. 3 4 Rufen Sie die Methode wie folgt auf: CALL JDBCExamples>>InsertFixed() Vergewissern Sie sich. Die Methode executeUpdate gibt eine Ganzzahl zurück. SELECT * FROM department Die Zeile 201 ist nicht festgeschrieben. dass in die Tabelle Department eine zusätzliche Zeile eingefügt wurde.

installieren Sie die Datei JDBCExamples.printStackTrace(). e.println(IRows. } catch ( Exception e ) { System. erscheint die Fehlermeldung Prozedur nicht gefunden (Procedure Not Found).toString() ) ). // Anzahl von aktualisierten Zeilen ausgeben System.out. String name) { try { conn = DriverManager. } } Hinweise ♦ Die beiden Argumente sind "department ID" (eine Ganzzahl) und "department name" (eine Zeichenfolge). die im Aufruf als die einzufügenden Werte an die Methode übergeben werden: public static void InsertArguments( String id. 168 .getConnection( "jdbc:default:connection" ). // Anweisung ausführen Statement stmt = conn.JDBC für den Zugriff auf Daten verwenden Argumente an Java-Methoden übergeben Wir können die Methode InsertFixed erweitern. Integer IRows = new Integer( stmt. wie Argumente an Java-Methoden übergeben werden.class in der Beispieldatenbank.out. Die folgende Methode verwendet Argumente.createStatement(). ’" + name + "’)". dept_name )" + " VALUES (" + id + ". Hier werden beide Argumente als Zeichenfolgen an die Methode übergeben. String sqlStr = "INSERT INTO Department " + " ( dept_id. Wenn Sie eine falsche Anzahl oder einen falschen Typ von Argumenten angeben. um zu veranschaulichen.executeUpdate( sqlStr.println("Error: " + e. weil sie als Teil der Zeichenfolge der SQL-Anweisung verwendet werden.getMessage()). ♦ ♦ v So wird die Java-Methode mit Argumenten verwendet: 1 Wenn Sie dies noch nicht getan haben.toString() + " row inserted" ). INSERT ist eine statische Anweisung: Sie nimmt außer der SQL selbst keine Parameter an.

try{ conn = DriverManager. unit_price " + "FROM product" . Dies führt zur Rückgabe der Ergebnismenge in einem Objekt ResultSet.executeQuery( sqlStr ). wie Abfragen in JDBC behandelt werden. ’Northern Sales’ ) 3 Vergewissern Sie sich.createStatement(). // Abfrage aufbauen String sqlStr = "SELECT id. ResultSet result = stmt. dass in die Tabelle "Department" eine zusätzliche Zeile eingefügt wurde. Das Codefragment setzt den Gesamt-Bestandswert für ein Produkt in eine Variable mit dem Namen Inventory. die sich im Verbindungsobjekt mit der Bezeichnung conn befindet. Bei Abfragen verwenden Sie die Methode executeQuery des Objekts Statement.next() ) { 169 . Dieses Beispiel ist als Methode Query der Klasse JDBCExamples verfügbar. dass eine interne bzw. damit die Datenbank unverändert bleibt: ROLLBACK Abfragen mit JDBC Das Objekt Statement wird für die Ausführung von statischen Abfragen und für Anweisungen eingesetzt. SELECT * FROM Department 4 Setzen Sie die Änderungen zurück.Kapitel 5 Datenzugriff über JDBC 2 Stellen Sie über Interactive SQL eine Verbindung zur Beispieldatenbank her und geben Sie folgenden Befehl ein: call JDBCExamples>>InsertArguments( ’203’. externe Verbindung hergestellt wurde. while( result. Es gilt die Voraussetzung. Die Artikelbezeichnung wird in der String-Variablen prodname abgelegt. // Anweisung ausführen Statement stmt = conn. die keine Ergebnismengen zurückgeben. Das folgende Codefragment veranschaulicht.getConnection( "jdbc:default:connection" ). public static int Query () { int max_price = 0.

Diese Ergebnisse werden in das Objekt ResultSet mit dem Namen result zurückgegeben. Für jede Zeile wird der Wert jeder Spalte mit der Methode getInt in eine Ganzzahlvariable abgerufen.printStackTrace(). beginnend mit 1.println( "Price is " + price ). System. und Interactive SQL zeigt ihn auf dem Register "Ergebnisse" im Fenster "Ergebnisse" an. e. } return max_price. In der Ergebnismenge wird über jeder Zeile eine Schleife ausgeführt. JDBC bietet jedoch nur die Methode next. ResultSet umfasst ebenfalls Methoden für andere Datentypen.out.JDBC für den Zugriff auf Daten verwenden int price = result. ♦ 170 .getMessage()). wie etwa getString. Das Argument für die Methode getInt ist eine Indexnummer für die Spalte. können Sie diese Methode mit folgender Anweisung in Interactive SQL ausführen: select JDBCExamples>>Query() Hinweise ♦ Die Abfrage wählt Menge und Einheitspreis für alle Produkte mit dem Namen prodname. getDate und getBinaryString. ♦ ♦ ♦ Adaptive Server Anywhere unterstützt bidirektional abrollende Cursor.println("Error: " + e. Die Methode gibt der aufrufenden Umgebung den Wert max_price zurück. if( price > max_price ) { max_price = price . } } } catch( Exception e ) { System. Die Datentyp-Konvertierung von SQL auf Java wird gemäß den Angaben im folgenden Abschnitt erklärt: "Datentypkonvertierung von SQL in Java" auf Seite 96 der Dokumentation ASA SQLReferenzhandbuch. Die Schleife verwendet die Methode next.out. } Das Beispiel ausführen Wenn Sie die Klasse JDBCExamples in der Beispieldatenbank installiert haben.getInt(2). die dem Vorwärts-Abrollen durch die Ergebnismenge entspricht.

setInt(1. syntaktisch analysiert werden. die Sie an die Datenbank senden. id). stmt.setString(2. // INSERT-Anweisung erstellen // ? ist ein Platzhalterzeichen String sqlStr = "INSERT INTO Department " + "( dept_id. } 171 . wenn viele ähnliche Aktionen ausgeführt werden. Außerdem ist ein Zugriffsplan zu generieren und die Anweisung auszuführen. wie etwa das Einfügen von vielen Zeilen. stmt. wenn Sie die PreparedStatement-Schnittstelle verwenden.executeUpdate() ). Beispiel Das folgende Beispiel zeigt.prepareStatement( sqlStr ). Damit haben Sie die Möglichkeit.toString() + " row inserted" ). obwohl das Einfügen einer einzelnen Zeile in der Praxis nicht mit vorbereiteten Anweisungen erfolgen sollte.getConnection( "jdbc:default:connection").out. Sie können Performance-Vorteile erzielen. name ). $ Weitere Hinweise über vorbereitete Anweisungen finden Sie unter "Anweisungen vorbereiten" auf Seite 12. ? )" . muss jede Anweisung.println(IRows. String name) try { conn = DriverManager. // Anzahl von aktualisierten Zeilen ausgeben System. eine Anweisung mit Platzhaltern vorzubereiten. wie die Schnittstelle PreparedStatement benutzt werden kann. Die folgende Methode der Klasse JDBCExamples führt eine vorbereitete Anweisung aus: public static void JInsertPrepared(int id. dept_name ) " + "VALUES ( ? . und dann beim Ausführen der Anweisung diesen Platzhaltern Werte zuzuordnen. Der Einsatz von vorbereiteten Anweisungen ist besonders dann nützlich.Kapitel 5 Datenzugriff über JDBC Vorbereitete Anweisungen für effizienteren Zugriff verwenden Wenn Sie ein Statement-Interface verwenden. // Anweisung vorbereiten PreparedStatement stmt = conn. Integer IRows = new Integer( stmt. Die Schritte vor der eigentlichen Ausführung werden als Vorbereitung der Anweisung bezeichnet.

wie Sie mit JDBC auf diese Java-Klassen zugreifen. ob Sie die Objekte einfügen oder abrufen. Adaptive Server Anywhere umfasst auch abstrakte Datentypen in Form von Java-Klassen. $ Weitere Hinweise zum Abrufen und Setzen ganzer Objekte finden Sie unter "Verteilte Anwendungen erstellen" auf Seite 174. Objekte einfügen und abrufen Als Schnittstelle für relationale Datenbanken ist JDBC für das Abrufen von traditionellen SQL-Datentypen sowie für das Arbeiten mit diesen Typen konzipiert. Die Art.printStackTrace().println("Error: " + e. wie etwa getInt oder getString.JDBC für den Zugriff auf Daten verwenden catch ( Exception e ) { System. hängt davon ab. Objekte abrufen Auf folgende Art und Weise können Sie Objekte. ’Eastern Sales’ ) Das Zeichenfolgenargument wird entsprechend den SQL-Regeln in Apostrophe eingeschlossen. Objekt abrufen Wenn Sie eine Spalte mit einem Java-Klassen-Datentyp ♦ in die Auswahlliste einer Abfrage einbeziehen.getMessage()). können Sie das Beispiel mit folgender Anweisung ausführen: call JDBCExamples>>InsertPrepared( 202. 172 . sind zur Begrenzung der Zeichenfolge Anführungszeichen zu verwenden. Dann können Sie innerhalb der Java-Klasse auf die Methoden und Felder des betreffenden Objekts zugreifen. um das Objekt in die JavaKlasse abzurufen. Wenn Sie diese Methode von einer JavaAnwendung aus aktiviert hätten. können Sie die ResultSet-Methode getObject verwenden. Sie können mit einer der standardmäßigen ResultSet-Methoden darauf zugreifen. } } Das Beispiel ausführen Wenn Sie die Klasse JDBCExamples in der Beispieldatenbank installiert haben. deren Felder und deren Methoden abrufen: ♦ Auf Methoden und Felder zugreifen Java-Methoden und -Felder können in die Auswahlliste einer Abfrage einbezogen werden. e.out. Eine Methode oder ein Feld erscheint als eine Spalte in der Ergebnismenge.

new MyJavaClass() ). Dieses Verhalten unterscheidet sich von dem der gespeicherten Prozeduren. eine SQL-Variable einzurichten. Gemischte JDBC-Hinweise ♦ Zugriffsberechtigungen Wie auf alle Java-Klassen in der Datenbank. kann jeder beliebige Benutzer auch auf Klassen mit JDBC-Anweisungen zugreifen. ein Objekt vom Typ "MyJavaClass" in eine Spalte der Tabelle T ein: java. die die Berechtigung zum Ausführen von Prozeduren erteilt.PreparedStatement ps = conn.prepareStatement("insert T values( ? )" ).executeUpdate().B. und dann die SQL-Variable in die Tabelle einzufügen. Eine Alternative wäre. Es gibt keine Entsprechung zur Anweisung GRANT EXECUTE. die das Objekt enthält. um ein Objekt in eine Spalte mit Java-Klassen-Datentyp einzufügen. die mit den Berechtigungen des Eigentümers ausgeführt werden.sql. ps. und der Name einer Klasse braucht nicht mit dem Namen des Eigentümers qualifiziert zu werden. Sie können Objekte mit einer vorbereiteten Anweisung einfügen. Das folgende Codefragment fügt z.Kapitel 5 Datenzugriff über JDBC Objekte einfügen Von einer serverseitigen Java-Klasse aus können Sie die JDBC-Methode setObject benutzen. ps. ♦ Berechtigung zum Ausführen Java-Klassen werden mit den Berechtigungen der sie ausführenden Verbindung ausgeführt. 173 .setObject( 1.

wie mehrere Aufgaben abgerufen werden. bei denen ein Teil der Logik auf dem Datenbankserver. Verwenden Sie die Methode sybase. jedoch nicht mit dem Abrufen des Objekts selbst verwechselt werden sollten. die in Beziehung mit abrufenden Objekten stehen. In Adaptive Server Anywhere können Sie verteilte Java-Anwendungen erstellen.Verteilte Anwendungen erstellen Verteilte Anwendungen erstellen In einer verteilten Anwendung laufen Teile der Anwendungslogik auf einem Rechner. In diesem Abschnitt wird beschrieben. Java-Objekte mit einem externen Java-Client auszutauschen. Die clientseitige Anwendung muss die Klasse importieren. Auch dies unterscheidet sich vom Abrufen eines Objekts in eine Java-Anwendung. ein Java-Objekt von einer Datenbank abzurufen. Dazugehörige Aufgaben In anderen Teilen dieses Kapitels haben wir beschrieben. "Java-Objekte abfragen" auf Seite 117 Hier wird auch beschrieben. ♦ ♦ Anforderungen für verteilte Anwendungen Beim Aufbau einer verteilten Anwendung müssen mehrere Aufgaben erfüllt werden. andere Teile auf einem anderen. "Objekte einfügen und abrufen" auf Seite 172 Hier wird beschrieben. Damit ist allerdings noch nicht das Problem gelöst. 174 . v So wird eine verteilte Anwendung aufgebaut: 1 2 3 Jede auf dem Server laufende Klasse muss die serialisierbare Schnittstelle implementieren. und ein Teil auf dem Clientsystem läuft.toByteArray auf der Serverseite. wie die öffentlichen Felder und der Rückgabewert von Java-Methoden abgerufen werden. wie ein Objekt in eine SQL-Variable abgerufen wird. Dies ist sehr einfach.1 und älter erforderlich. wie dies geschieht. um das Objekt zu serialisieren. Die Schlüsselaufgabe für eine Clientanwendung in einer verteilten Anwendung besteht darin. Dies ist nur für Adaptive Server Anywhere Version 6. Zum Beispiel: ♦ "Java-Objekte abfragen" auf Seite 117 Hier wird beschrieben.ASAUtils. Auch dies unterscheidet sich vom Abrufen von Objekten in eine Clientanwendung. Adaptive Server Anywhere ist in der Lage. wie Objekte in serverseitige Java-Klassen abgerufen werden.sql. wie das Objekt in Ihre Java-Anwendung gelangt.0. damit das Objekt auf der Clientseite wieder aufgebaut werden kann.

sql. Dies ist nur für Adaptive Server Anywhere Version 6.Serializable in Ihre Klassendefinition ein.Kapitel 5 Datenzugriff über JDBC 4 Verwenden Sie die Methode sybase.java die serialisierbare Schnittstelle über die folgende Deklaration: public class Product implements java. dass diese Klasse serialisiert werden kann. dass es in einen Byte-Strom konvertiert wird.fromByteArray auf der Clientseite. an eine Clientanwendung gesendet und deserialisiert wurde.1 und älter erforderlich. an eine andere Java-Anwendung gesendet werden und wieder aufgebaut bzw. Die serialisierbare Schnittstelle enthält weder Methoden noch Variable. Ein Java-Objekt. muss zunächst die serialisierbare Schnittstelle implementiert werden. sollten aus Sicherheitsgründen nicht serialisiert werden.io. Dies ist eine sehr einfache Aufgabe. Serialisierbare Schnittstelle implementieren Objekte werden in einer so genannten serialisierten Form vom Server an eine Clientanwendung übergeben. die gespeichert wird Die Werte von nicht-statischen. Diese Variablen werden wie in der folgenden Deklaration der Variablen mit Hilfe des Schlüsselworts transient deklariert: 175 .Serializable Die Implementierung der serialisierbaren Schnittstelle besteht lediglich darin. um das Objekt wieder aufzubauen. Zum Beispiel implementiert Samples\ASA\Java\asademo\Product. v So wird die serialisierbare Schnittstelle implementiert: ♦ Fügen Sie den Text implements java. das in einem Datenbankserver serialisiert. zu deklarieren.io. nicht-zeitweiligen Feldern in der Klasse Andere Overhead-Informationen Damit ein Objekt an eine Clientanwendung gesendet wird. dass jede Zeile folgende Informationen enthält: ♦ ♦ ♦ ♦ Einen Versionsbezeichner Einen Bezeichner für die Klasse (oder Unterklasse). Die Serialisierung eines Objekts besteht darin.ASAUtils. Das bedeutet. bzw. ist in jeder Hinsicht identisch mit dem Original. Einige Variable in einem Objekt brauchen nicht. deserialisiert werden kann. wodurch es auf einer Platte gespeichert bzw.0. Diese Aufgaben werden in den folgenden Abschnitten beschrieben.

So sieht die Methode getObjectColumn aus der Klasse JDBCExamples aus: private static void getObjectColumn() throws Exception { // Rückgabe einer Ergebnismenge von einer Spalte mit // Java-Objekten asademo.ContactInfo ci. ResultSet rs = stmt. müssen Sie folgende Zeile in Ihre Anwendung einbeziehen: import asademo.Verteilte Anwendungen erstellen transient String password. enthält die Variable immer ihren Standardwert Null. Beispiel für eine verteilte Anwendung Die Klasse JDBCExamples. Wenn ein Objekt mit dieser Variablen deserialisiert wird.* Die Datei asademo. Klassen clientseitig importieren Auf der Clientseite muss jede Klasse. die Teil des Pakets asademo ist. Diese Methode wird im Verbindungsbeispiel im Abschnitt "Von einer JDBC-Clientanwendung aus mit jConnect eine Verbindung herstellen" auf Seite 157 beschrieben und ist ein Beispiel für eine verteilte Anwendung. Sie werden alle von der Methode main aufgerufen.executeQuery( "SELECT JContactInfo FROM jdba. Um die Klasse Product verwenden zu können.jar muss in Ihren CLASSPATH einbezogen sein. if ( conn != null ) { Statement stmt = conn. 176 . Angepasste Serialisierung kann durch Hinzufügen der Methoden writeObject() und readObject() zu Ihren Klassen erreicht werden. damit dieses Paket gefunden werden kann. damit sie das Objekt benutzen kann.createStatement().java enthält drei Methoden als Beispiel für den verteilten Einsatz von Java.contact" ). $ Weitere Hinweise zur Serialisierung finden Sie im Java Development Kit (JDK) von Sun Microsystems. die ein Objekt abruft. String sComment . String name. Zugriff auf die geeignete Klassendefinition haben.

fromByteArray( arrayb ).sql.city + "\n\tState: " + ci. die ältere Methode beschrieben.next() ) { ci = ( asademo.contact" ). String name. die bei früheren Versionen der Software erforderlich waren.ContactInfo ci.ContactInfo )rs.street + "City: " + ci.toByteArray( JName.contact.ASAUtils.ASAUtils. die den älteren Programmcode benutzen. } } } Die getObject-Methode wird wie bei einem internen Java-Fall verwendet. while ( rs. private static void serializeColumn() throws Exception { Statement stmt.getObject(1). if ( conn != null ) { stmt = conn.next() ) { arrayb = rs.phone + "\n" ). Abfrageergebnisse serialisieren und deserialisieren Dies ist die Methode serializeColumn einer alten Version der Klasse JDBCExamples. rs = stmt. ResultSet rs. name = ( String )sybase.toByteArray( jdba. arrayb = rs.out.Kapitel 5 Datenzugriff über JDBC while ( rs. System.JContactInfo ) FROM jdba. In diesem Abschnitt wird beschrieben.println( "\n\tStreet: " + ci.sql.getName() ) AS Name. byte arrayb[]. sybase. In diesem Abschnitt wird für Benutzer.ASAUtils. asademo. 177 .getBytes("Name"). Ältere Methode getObject und setObject empfohlen Die Methoden getObject und setObject machen eine explizite Serialisierung und Deserialisierung überflüssig. Für die anderen Beispiele können Sie sich den Code ansehen.sql.getBytes(2). wie eines dieser Beispiele funktioniert.createStatement().executeQuery( "SELECT sybase.state + "Phone: " + ci.

und wenn es vorhanden ist.ASAUtils. Anstatt einfach nur die Spalten selbst bzw. wird der Code ausgeführt. Die Ausgabe (System.toByteArray( jdba. Für jede Zeile wird der Wert jeder Spalte in ein Objekt deserialisiert.ASAUtils.sql.out. sybase. } System. } } Und so funktioniert die Methode: 1 Es ist bereits eine Verbindung vorhanden.contact aus. eine Methode der Spalte abzurufen.out.city + "\n\tState: " + ci.sql.street + "\n\tCity: " + ci. dass die Felder und Methoden des Objekts ebenso wie im Originalstatus eingesetzt werden können.println( "\n\n" ).out.ASAUtils.sql.sql.Verteilte Anwendungen erstellen ci = (asademo. Sie ruft Daten aus den Spalten JName und JContactInfo ab. 178 . Die Abfrage lautet folgendermaßen: SELECT sybase.toByteArray( JName.println( "Name: " + name + "\n\tStreet: " + ci. und gibt es an die Clientanwendung zurück. System.toByteArray verwendet. das von einer SQL-Variablen auf dem Datenbankserver referenziert wird.ContactInfo)sybase. Das Verbindungsobjekt wird geprüft.state + "\n\tPhone: " + ci.contact.phone + "\n" ).println) zeigt. Sonstige Funktionen von verteilten Anwendungen Es gibt zwei weitere Methoden in JDBCExamples.java. wenn die Methode aufgerufen wird. 3 4 Der Client führt eine Schleife über die Zeilen der Ergebnismenge aus.fromByteArray( arrayb ).JContactInfo ) FROM jdba.getName() ) AS Name. wird die Funktion sybase. die verteilte Informatinosverarbeitung verwenden: ♦ serializeVariable Diese Methode erstellt ein natives Java-Objekt.ASAUtils. Eine SQL-Abfrage wird aufgebaut und ausgeführt.contact 2 Diese Anweisung führt eine Abfrage in der Tabelle jdba.

179 . wobei es sich um eine Unterklasse der Klasse "Product" handelt. Einige der Zeilen sind asademo. veranschaulicht jedoch.Hat. Die richtige Klasse wird clientseitig wieder aufgebaut.Kapitel 5 Datenzugriff über JDBC ♦ serializeColumnCastClass Diese Methode ähnelt der Methode serializeColumn.Product. wie Unterklassen wieder aufgebaut werden. Die abgefragte Spalte (JProd aus der Tabelle product) hat den Datentyp asademo.

Verteilte Anwendungen erstellen 180 .

K A P I T E L 6 Programmieren mit Embedded SQL Über dieses Kapitel Inhalt In diesem Kapitel wird beschrieben. wie die Embedded SQL-Schnittstelle zu Adaptive Server Anywhere verwendet wird. Thema Überblick Beispielprogramme mit Embedded SQL Datentypen in Embedded SQL Hostvariable benutzen SQL-Kommunikationsbereich (SQLCA) Daten abrufen Statische und dynamische SQL Der SQL-Deskriptor-Bereich (SQLDA) Lange Werte senden und abfragen Gespeicherte Prozeduren verwenden Programmiertechniken für Embedded SQL SQL-Präprozessor Referenz der Bibliotheksfunktion Befehlszusammenfassung für Embedded SQL Seite 182 190 196 200 208 214 223 228 237 243 247 249 253 272 181 .

dll.auf den meisten Betriebssystemplattformen . Es besteht aus SQL-Anweisungen.so.eine gemeinsam genutzte Bibliothek (shared library). die Sie anschließend kompilieren.DLL) oder . ♦ ♦ Unter Windows-Betriebssystemen ist die Schnittstellenbibliothek dblib8.Überblick Überblick Embedded SQL ist eine Datenbank-Programmierschnittstelle für die Programmiersprachen C und C++.oder C++-Quellcode konvertiert. die in C. Diese beiden Arten werden in diesem Kapitel behandelt. Die SQL-Anweisungen werden von einem SQL-Präprozessor in C. jedoch weniger flexibel als dynamisches Embedded SQL. Bei UNIX-Betriebssystemen heißt die Schnittstellenbibliothek je nach Betriebssystem libdblib8.a.sl oder libdblib8. Während der Laufzeit verwenden Embedded SQL-Anwendungen eine Adaptive Server Anywhere-Schnittstellenbibliothek für die Kommunikation mit dem Datenbankserver.oder C++-Quellcode eingebettet sind. Statisches Embedded SQL ist einfacher zu verwenden. 182 . Adaptive Server Anywhere liefert zwei Arten von Embedded SQL. libdblib8. Die Schnittstellenbibliothek ist eine dynamische Verknüpfungsbibliothek (dynamic link library .

Kapitel 6 Programmieren mit Embedded SQL Überblick über den Entwicklungsprozess Sobald das Anwendungsprogramm erfolgreich vom SQL-Präprozessor konvertiert und anschließend kompiliert ist.alternative Methode. Wenn die Datenbank läuft. Solange das Programm durch den Präprozessor läuft. $ Die Verwendung von Importbibliotheken ist die StandardEntwicklungsmethode für Anwendungen. die die Verwendung von Importbibliotheken vermeidet. um mit der Datenbank zu interagieren. 183 . wird es mit der Importbibliothek für die Schnittstellenbibliothek von Adaptive Server Anywhere verknüpft.empfohlene . verwendet diese Programmdatei die Adaptive Server Anywhere-DLL. für Microsoft Visual C++. Adaptive Server Anywhere bietet eine . Weitere Hinweise finden Sie unter "Die Schnittstellenbibliothek dynamisch laden" auf Seite 187. die Funktionen in DLLs aufrufen. um eine ausführbare Programmdatei zu erzeugen. braucht die Datenbank nicht zu laufen. und für Borland C++. Unter Windows gibt es verschiedene Importbibliotheken für Watcom C/C++.

6.5 5.5 und höher 1. bevor der C. Die normale Dateinamenerweiterung für Quelldateien mit embedded SQL ist . Der Präprozessor übersetzt die SQL-Anweisungen in C-/C++-Quellcode und schreibt den Quellcode in eine Ausgabedatei.c hat.0 und höher 4. Header-Dateien für Embedded SQL Alle Header-Dateien befinden sich nach der Installation von Adaptive Server Anywhere im Unterverzeichnis h des Installationsverzeichnisses.0 $ Anweisungen zur Erstellung von NetWare NLMs finden Sie unter "NetWare loadable Modules erstellen" auf Seite 188.exe.cc. Der voreingestellte Name für die Ausgabedatei ist der Name der SQL-Datei mit der Erweiterung . erhält die Ausgabedeitei standardmäßig die Erweiterung . $ Eine vollständige Auflistung der Optionen finden Sie unter "SQLPräprozessor" auf Seite 249.oder C++-Compiler ausgeführt wird.Überblick Den SQL-Präprozessor verwenden Der SQL-Präprozessor ist eine Programmdatei namens sqlpp. 11 Version 9.c. Befehlszeile Die SQLPP-Befehlszeile sieht wie folgt aus: sqlpp [ Parameter ] SQL-Dateiname [ Ausgabedateiname ] Der SQL-Präprozessor konvertiert ein C-Programm mit Embedded SQL. 184 . Unterstützte Compiler Der SQL-Präprozessor für C wird bisher in Verbindung mit folgenden Compilern benutzt: Betriebssystem Windows Windows Windows Windows CE UNIX NetWare Compiler Watcom C/C++ Microsoft Visual C/C++ Borland C++ Microsoft Visual C/C++ GNU oder nativer Compiler Watcom C/C++ 10.sqc. Falls der Name der SQL-Datei bereits die Erweiterung .

Microsoft Visual C++.h sqldef.lib libdblib8. dass das Strukturverdichten (structure packing) korrekt gehandhabt wird.SQLCA). die im Feld sqlstate des SQLCA-Bereichs zurückgegeben werden Diese Header stellen sicher.lib dblibtm.h.h. Definitionen für Fehlercodes.so 185 .lib dblib8. libdbtasks8. Betriebssystem Windows Windows Windows CE NetWare Solaris (nicht verkettete Anwendungen) Solaris (verkettete Anwendungen) Compiler Watcom C/C++ Microsoft Visual C++ Microsoft Visual C++ Watcom C/C++ Alle Compiler Alle Compiler Importbibliothek dblibtw. wird in Embedded SQL-Programme eingefügt.so libdblib8_r. die gebraucht werden.h Importbibliotheken Alle Importbibliotheken sind im Unterverzeichnis lib unter dem Installationsunterverzeichnis von Adaptive Server Anywhere installiert.so. IBM Visual Age und Borland C/C++. Die Windows-Importbibliotheken sind zum Beispiel im Unterverzeichnis win32\lib abgelegt. poppk.h sqlda. sqlca. pshpk2.so. sowie Prototypen für alle Embedded SQLDatenbankschnittstellenfunktionen. die dynamisches SQL benutzen Definition der Datentypen für die Embedded SQLSchnittstelle. Die Datei enthält auch Strukturdefinitionen und Rückgabewerte. Sie unterstützen die Compiler Watcom C/C++.lib dblib8. wird in alle Embedded SQLProgramme eingefügt. um den Datenbankserver aus einem C-Programm zu starten. die im Feld sqlcode des SQLCA-Bereichs zurückgegeben werden Definitionen für ANSI/ISO SQL-Standardfehlerzustände. SQL-Deskriptorbereich-Strukturdefinition.h sqlstate.Kapitel 6 Programmieren mit Embedded SQL Dateiname Beschreibung Wichtigste Header-Datei.h pshpk1. Die Datei fügt die Strukturdefinition für den SQL-Kommunikationsbereich ein (SQL Communication Area . libdbtasks8_r.h sqlerr.

Es gibt praktisch keine Interaktion zwischen dem SQL-Code und dem C-Code. die einen Fehler verursacht. #include <stdio.n". während Sie dies für andere explizit angeben müssen. } Dieses Beispiel stellt eine Verbindung mit der Datenbank her. Ein einfaches Beispiel Es folgt ein sehr einfaches Beispiel für ein Embedded SQL-Programm.h> EXEC SQL INCLUDE SQLCA. EXEC SQL DISCONNECT. main() { db_init( &sqlca ). Die Anweisung WHENEVER wird für Fehlerüberprüfung benutzt. schreibt die Änderung fest und beendet das Programm. aktualisiert den Nachnamen des Angestellten mit der Nummer 195. return( -1 ). error: printf( "update unsuccessful -. 186 . EXEC SQL UPDATE employee SET emp_lname = ’Plankton’ WHERE emp_id = 195. $ Weitere Hinweise zum Abrufen von Daten finden Sie unter "Daten abrufen" auf Seite 214. Einige Compiler ermitteln die Position von libdbtasks8 automatisch. Die Fehleraktion (in diesem Beispiel GOTO) wird nach jeder SQL-Anweisung ausgeführt.Überblick Die Bibliotheken libdbtasks8 werden von der Bibliothek libdblib8 aufgerufen. EXEC SQL COMMIT WORK.sqlcode ). db_fini( &sqlca ). C-Code wird in diesem Beispiel ausschließlich zur Ablaufsteuerung benutzt. return( 0 ). db_fini( &sqlca ). sqlca.sqlcode = %ld. EXEC SQL WHENEVER SQLERROR GOTO error. EXEC SQL CONNECT "DBA" IDENTIFIED BY "SQL".

c zu benutzen. Die CONNECT-Anweisung stellt eine Verbindung mit dem Datenbankserver her und spezifiziert die Benutzer-ID für alle Anweisungen. und zwar mit Hilfe des Moduls esqldll. die Anwendung mit einer Importbibliothek zu verknüpfen. Die wichtigsten sind die INCLUDE-Anweisung und die WHENEVER-Anweisung für die Fehlerbehandlung.Kapitel 6 Programmieren mit Embedded SQL Struktur von Embedded SQL-Programmen In Embedded-SQL-Programmen sind SQL-Anweisungen in normalen Coder C++-Code eingebettet.c im Unterverzeichnis src Ihres Installationsverzeichnisses. Die Schnittstellenbibliothek dynamisch laden Um Anwendungen zu entwickeln. muss eine CONNECT-Anweisung sein. Die CONNECT-Anweisung muss als erste Embedded SQL-Anweisung ausgeführt werden. muss vor der ersten Embedded SQL-Anweisung in der Quelldatei folgende Anweisung enthalten: EXEC SQL INCLUDE SQLCA. 187 . ist es üblich. die während der Verbindung ausgeführt werden. Alle Embedded SQL-Anweisungen beginnen mit den Worten EXEC SQL und enden mit einem Semikolon (. Dieser Abschnitt beschreibt eine alternative Methode. das Embedded SQL benutzt. Die erste Embedded SQL-Anweisung. Wir empfehlen. Die Adaptive Server Anywhere Schnittstellenbibliothek kann dynamisch geladen werden. die von dem C-Programm ausgeführt wird.). Der Quellcode eines C-Programms. Normale Kommentare der Sprache C sind innerhalb von Embedded SQLAnweisungen erlaubt. um Anwendungen für Adaptive Server Anywhere zu entwickeln. ohne dass sie mit der Importbibliothek verknüpft werden muss. Ausnahme: Einige Embedded SQL-Befehle erzeugen keinen C-Code oder benötigen keine Verbindung mit der Datenbank. denn diese Methode ist einfacher anzuwenden und findet die Schnittstellen-DLL zuverlässiger. die die erforderlichen Funktionsdefinitionen enthält. esqldll. die Funktionen aus DLLs aufrufen. Diese Befehle sind daher vor der CONNECT-Anweisung erlaubt.

sqc.Betriebssystem)-Makro muss definiert werden. Bei bestimmten Kombinationen von Betriebssystemen und Compilern kann dieser Versuch allerdings fehlschlagen. um Embedded SQL-Programme als NetWare loadable Modules (NLM) zu kompilieren. wie die Schnittstellenbibliothek dynamisch geladen werden kann. die mit esqdll. 188 . und es muss db_fini_dll aufrufen.obj. Die Header-Datei sqlca.h. Version 10. um die DLL wieder freizugeben. gehen Sie wie folgt vor: 1 Ihr Programm muss db_init_dll aufrufen.h> in Ihr Embedded SQL-Programm ein.c.6 oder 11. um die DLL zu laden. Der Quellcode befindet sich in Samples\ASA\ESQLDynamicLoad\sample. 2 Fügen Sie vor der Anweisung EXEC SQL INCLUDE SQLCA mit #include die Header-Datei esqldll. Nach db_fini_dll kann keine Funktion der Datenbankschnittstelle mehr aufgerufen werden.Überblick v Um die Schnittstellen-DLL dynamisch zu laden. Ein Beispielprogramm.c eingefügt wird.0 verwenden. finden Sie im Unterverzeichnis Samples\ASA\ESQLDynamicLoad in Ihrem SQL Anywhere-Verzeichnis. NetWare loadable Modules erstellen Sie müssen den Watcom C/C++-Compiler. Ein SQL OS (Operating System . versucht das passende Makro zu bestimmen und zu definieren. Statt mit der Importbibliothek verknüpfen Sie Ihre Embedded SQLAnwendung mit dem Objektmodul esqldll. Sie müssen trotzdem die Bibliotheksfunktionen db_init und db_fini aufrufen. db_init_dll muss vor jeder anderen Funktion der Datenbankschnittstelle aufgerufen werden.h ein. oder die Definition mit einer Compiler-Option liefern. In diesem Fall müssen Sie entweder mit #define eine Definition am Beginn Ihrer Datei einfügen. oder fügen Sie #include < sqlca. Makro _SQL_OS_WINNT _SQL_OS_UNIX _SQL_OS_UNIX Unterstützte Plattformen Alle Windows-Betriebssysteme UNIX NetWare 3 4 5 Beispiel Kompilieren Sie esqldll. aus dem ersichtlich ist.

6 oder 11.lib werden mit Adaptive Server Anywhere ausgeliefert und befinden sich im Verzeichnis nlm.sqc Diese Anweisung erstellt eine Datei mit der Erweiterung .c mit dem Watcom-Compiler (10. 189 .imp LIBRARY dblib8. Für die Zeilen IMPORT und LIBRARY ist eventuell der vollständige Suchpfad notwendig. 2 3 Kompilieren Sie file.lib Die Dateien dblib8.imp und dblib8.Kapitel 6 Programmieren mit Embedded SQL v So erstellen Sie ein Embedded SQL-NLM: 1 Auf einem Windows-basierten System müssen Sie die Embedded SQLDatei mit folgendem Befehl vorverarbeiten: sqlpp -o NETWARE srcfile. Verknüpfen Sie die sich ergebende Objektdatei mit Hilfe des WatcomLinkers mit den folgenden Optionen: FORMAT NOVELL MODULE dblib8 OPTION CASEEXACT IMPORT @dblib8.0) unter Verwendung der Option /bt=netware.c.

Sie werden im Unterverzeichnis Samples\ASA\C Ihres Verzeichnisses SQL Anywhere gespeichert. Um die Anzahl der Codezeilen zu verringern.sqc zeigt die Verwendung von dynamischen SQLAnweisungen.Beispielprogramme mit Embedded SQL Beispielprogramme mit Embedded SQL Die Embedded SQL-Beispiele sind Teil der Adaptive Server AnywhereInstallation.sqc zeigt die Verwendung von statischen SQL-Anweisungen. die von den Mainlines aufgerufen werden. der die erforderliche Benutzer-ID und das Kennwort bereitstellt. sind die Mainlines und die Druckfunktionen in einer separaten Datei enthalten. ♦ ♦ Das Beispiel für statische Cursor Samples\ASA\C\cur. bis der Benutzer das Programm beendet Die Routine WSQLEX_Finish aufzurufen 3 Die Verbindung mit der Datenbank wird mit dem Embedded SQL-Befehl CONNECT hergestellt. und WSQL_Process_Command aufruft. Das Beispiel für dynamische Cursor und Embedded SQL Samples\ASA\C\dcur. ♦ ♦ ♦ WSQLEX_Init Stellt eine Verbindung zur Datenbank her und öffnet den Cursor WSQLEX_Process_Command Verarbeitet Benutzerbefehle und bedient den Cursor WSQLEX_Finish Schließt den Cursor und trennt die Verbindung zur Datenbank Die Funktion der Mainline ist: 1 2 Die Routine WSQLEX_Init aufzurufen Sie ist eine Schleife. die in den Beispielprogrammen cur und dcur (und dem odbc-Beispiel) mehrmals vorkommen. Zusätzlich zu diesen Beispielen können Sie als Teil von SQL Anywhere Studio weitere Programme und Quelldateien finden. die Befehle vom Benutzer abholt.c für zeichenbasierte Systeme und in mainwin.c für fensterbasierte Systeme. 190 . die Eigenschaften des Servers für bestimmte Betriebssystemplattformen veranschaulichen. Die Beispielprogramme liefern jeweils folgende drei Routinen. Und zwar in mainch.

Für UNIX verwenden Sie das Shell-Skript makeall. Es ist eines der folgenden Programme: ♦ ♦ ♦ CUR Beispiel für statischen Cursor DCUR Beispiel für dynamischen Cursor ODBC Beispiel für ODBC Der zweite Parameter ist die Zielplattform. mit dem das Programm kompiliert werden soll.und NetWare-Betriebssystemen mit Windows als HostBetriebssystem. Sie ist eines der folgenden Programme: ♦ ♦ WINNT Für Windows kompilieren NETWARE Für NetWare NLM kompilieren Der dritte Parameter ist der Compiler. Der Compiler kann einer der folgenden sein: ♦ ♦ ♦ WC .Kapitel 6 Programmieren mit Embedded SQL Beispielprogramme erstellen Dateien für den Aufbau der Beispielprogramme werden mit dem Beispielcode geliefert. ♦ Bei Windows. Für Windows CE verwenden Sie die dcur.bat zum Kompilieren der Beispielprogramme.Watcom C/C++ MC Microsoft C BC Borland C Beispielprogramme ausführen Die ausführbaren Dateien befinden sich gemeinsam mit dem Quellcode im Verzeichnis Samples\ASA\C. v So wird das Beispielprogramm für einen statischen Cursor ausgeführt: 1 Starten Sie das Programm: 191 . ♦ ♦ Die Syntax des Befehls ist wie folgt: makeall {Beispiel} {Plattform} {Compiler} Der erste Parameter ist der Name des Beispielprogramms. das Sie kompilieren wollen.dsp-Projektdatei für Microsoft Visual C++. verwenden Sie makeall.

Befolgen Sie die Anweisungen auf dem Bildschirm.exe aus. Die verschiedenen Befehle verändern einen Datenbankcursor und geben Abfrageergebnisse am Bildschirm aus. Führen Sie die Datei Samples\ASA\C\curwnt. um den Befehl auszuführen. Um allerdings den Code für die Benutzeroberfläche nicht zu kompliziert zu gestalten. Geben Sie die nachstehende Zeichenfolge ein. eine Tabelle anzugeben. sondern nur die Eingabeaufforderung. Bei einigen Systemen müssen Sie anschließend die Eingabetaste (ENTER) drücken. Geben Sie einfach den Buchstaben des Befehls ein. Sie können z. 4 Befolgen Sie die Anweisungen auf dem Bildschirm. Geben Sie einfach den Buchstaben des Befehls ein. 2 Stellen Sie eine Verbindung zu einer Datenbank her: ♦ Alle Beispielprogramme haben eine Konsolen-Benutzeroberfläche mit einer Eingabeaufforderung. wurden einige Vereinfachungen vorgenommen.exe aus. um den Befehl auszuführen.0 Sample 3 Wählen Sie eine Tabelle: ♦ Jedes einzelne Beispielprogramm fordert Sie auf. damit eine Verbindung mit der Beispieldatenbank hergestellt wird: DSN=ASA 8. Windows Beispiele Die Windows-Versionen der Beispielprogramme sind echte WindowsProgramme. Im Besonderen schreiben diese Programme auf WM_PAINT-Nachrichten hin nicht die Fenster neu.Beispielprogramme mit Embedded SQL ♦ ♦ 2 Starten Sie die Personal Server Beispieldatenbank von Adaptive Server Anywhere. v So wird das Beispielprogramm für einen dynamischen Cursor ausgeführt: 1 Starten Sie das Programm: ♦ Führen Sie die Datei Samples\ASA\C\dcurwnt. Die verschiedenen Befehle verändern einen Datenbankcursor und geben Abfrageergebnisse am Bildschirm aus. den Sie ausführen wollen. Bei einigen Systemen müssen Sie anschließend die Eingabetaste (ENTER) drücken. den Sie ausführen wollen.B. Wählen Sie eine der Tabellen in der Beispieldatenbank. Customer oder Employee eingeben. 192 .

Der Cursor wird statisch deklariert. um den Cursor zu positionieren. Die open_cursor-Routine deklariert einen Cursor für den jeweiligen SQLBefehl und öffnet ebenfalls den Cursor. Beendet der Benutzer das Programm. Der Cursor wird durch eine ROLLBACK WORK-Anweisung geschlossen und die Verbindung mit DISCONNECT getrennt. ob eine Warnsituation vorliegt (wie Row not found). Beachten Sie. Das nächste Beispiel ("Beispiel für dynamischen Cursor" auf Seite 193) konvertiert dieses erste Beispiel und verwendet dynamische SQLAnweisungen. Beachten Sie bitte. Bitte sehen Sie sich das vorangehende "Beispiel für statischen Cursor" auf Seite 193 an. ist im Quellprogramm enthalten. dass diese Form der FETCH-Anweisung nicht tatsächlich die Daten abruft. die SQL-Anweisung. Außerdem positioniert das Programm den Cursor neu in der Zeile vor derjenigen. bevor Sie sich mit diesem Beispiel befassen. das heißt. Die Routinen move. die abhängig vom Vorzeichen des Parameters den Cursor in die eine oder andere Richtung bewegt. 193 . Die print-Routine druckt eine Seite mit Informationen. die Anweisung positioniert lediglich den Cursor. ruft bestimmte Informationen aus der Tabelle employee in der Beispieldatenbank ab. und gegebenenfalls die erforderliche Fehlermeldung ausgibt. Der Cursor. Dies ist ein gutes Beispiel. die eine einzelne Zeile vom Cursor abruft und druckt.Kapitel 6 Programmieren mit Embedded SQL Beispiel für statischen Cursor Dieses Beispiel zeigt die Verwendung von Cursorn. der hier verwendet wurde. wie Cursor funktionieren. um zu lernen. Sie führt pagesizemal eine Schleife aus. die am Anfang der aktuellen Datenseite ausgegeben wurde. dass die Abrufroutine überprüft. Es ist eine leichte Änderung des vorangehenden Beispiels. Außerdem wurde eine allgemeine Routine namens move zur relativen Positionierung implementiert. Beispiel für dynamischen Cursor Dieses Beispiel veranschaulicht. top und bottom benutzen die geeignete Form der FETCH-Anweisung. wie Cursor für eine dynamische SQLSELECT-Anweisung verwendet werden. finden Sie unter "Beispielprogramme mit Embedded SQL" auf Seite 190. wird der Cursor geschlossen und die Datenbankverbindung getrennt. $ Wo der Quellcode zu finden ist und wie Sie dieses Beispielprogramm kompilieren. die die Information abruft.

benutzt. der an die Routine übergeben wird. erwartet es eine Zeichenfolge für die Verbindung der Form: uid=DBA. Dann bereitet sie eine dynamische SQL-Anweisung mit Hilfe dieser Zeichenfolge vor. um die Zeichenfolge für die Verbindung zu unterstützen. Die Routine open_cursor baut zuerst die SELECT-Anweisung auf: SELECT * FROM Tabellenname Wobei Tabellenname der Parameter ist. die Zeichenfolgen enthalten. Die Funktion connect benutzt die Embedded SQL-Schnittstellenfunktion db_string_connect. die benutzt wird. finden Sie unter "Beispielprogramme mit Embedded SQL" auf Seite 190. Die SQLDA-Struktur wird dann mit Puffern gefüllt. die er anschauen möchte. 194 . Dann wird für diese Anweisung ein Cursor deklariert und geöffnet. wird die tatsächliche Größe der Auswahlliste. um die Verbindung zur Datenbank herzustellen. die wiederum für das Ergebnis der Abfrage stehen. Die übrigen Routinen zum Bewegen und Schließen des Cursors sind die gleichen wie beim vorhergehenden Beispiel. Das Programm dcur erlaubt dem Benutzer. um die Ergebnisse der SELECT-Anweisung in die SQLDA-Struktur zu schreiben. Größe der SQLDA Zu Beginn wird die Größe der SQLDA geschätzt (3).db Das C-Programm mit Embedded SQL befindet sich im Unterverzeichnis Samples\ASA\C Ihres SQL Anywhere-Installationsverzeichnisses. wie auf den Bildschirm passen.pwd=SQL. um eine SQLDA der richtigen Größe zuzuweisen. Abgesehen von den Funktionen connect. mit dem n-Befehl eine Tabelle auszuwählen. Ist das nicht groß genug. die vom Datenbankserver zurückgegeben wurde.Beispielprogramme mit Embedded SQL $ Wo der Quellcode zu finden ist und wie Sie dieses Beispielprogramm kompilieren. Wenn dieses Programm ausgeführt wird. Der Embedded SQL-Befehl DESCRIBE wird benutzt. Die Routine fill_s_sqlda konvertiert alle Datentypen in der SQLDA in DT_STRING und weist Puffer der passenden Größe zu. Das Programm zeigt dann so viele Informationen aus dieser Tabelle an.dbf=c:\Programme\Sybase\SQL Anywhere 8\asademo. Diese Funktion liefert die zusätzliche Funktionalität. um die Verbindung zur Datenbank herzustellen. open_cursor und print gleicht das Programm weitgehend dem vorigen Beispiel.

Wählen Sie das Beispielprogramm (curwnt.Kapitel 6 Programmieren mit Embedded SQL Die fetch-Routine differiert leicht. 5 6 Wird das Programm als Dienst ausgeführt. wenn sie für eine Windows-Version kompiliert werden. sind die Quelldatei ntsvc. Beispiele für Dienste Die Beispielprogramme cur. zeigt es. Die Ausgabe wird in das Ereignisprotokoll der Anwendung geschrieben.h. gehen Sie wie folgt vor: 1 2 3 4 Starten Sie Sybase Central und öffnen Sie das Verzeichnis "Dienste". schreiben die Programme eine Seite in das Ereignisprotokoll der Anwendung und halten an.exe) aus dem Unterverzeichnis Samples\ASA|C im SQL AnywhereInstallationsverzeichnis. die den Beispielcode für Windows-Dienste enthalten. um den Dienst zu installieren.5-Compiler und dem Microsoft Visual C++-Compiler getestet. auf denen Dienste laufen können.sqc und dcur.exe oder dcurwnt. Der Code ermöglicht es. das damit gelinkte ausführbare Programm entweder als normales Programm oder als Windows-Dienst auszuführen. Klicken Sie auf "Start" im Hauptfenster. 195 . Klicken Sie auf "OK". Falls die Benutzeroberfläche nicht gestartet werden kann. um Überschriften für die Spalten auszugeben. Geben Sie einen Dienstnamen in das entsprechende Feld ein.c und die Header-Datei ntsvc. um Ergebnisse aus der SQLDA-Struktur bis zur vollen Bildschirmbreite auszugeben. Die print-Routine ist leicht verändert. v Um eines der kompilierten Beispiele als Windows-Dienst auszuführen. Wählen Sie einen Diensttyp aus der Beispielanwendung aus und klicken Sie auf "OK".sqc werden optional als Dienste ausgeführt. Diese Beispiele wurden mit dem Watcom C/C++ 10. falls möglich. Die print-Routine benutzt auch die Namenfelder des SQLDA-Bereichs. die normale Benutzeroberfläche. sie schreibt die Ergebnisse in die SQLDA-Struktur statt in eine Liste von Hostvariablen. Die beiden Dateien. um den Dienst zu starten.

Beispielsweise kann mit DECL_BIGINT eine Variable mit einem BIGINT-Wert deklariert werden. Sie können diese Datentypen auch in einer SQLDA-Struktur benutzen. müssen alle Datenelemente einen Datentyp haben. DT_DATE Mit Nullwert endende Zeichenfolge. die ein gültiges Datum ♦ ♦ ♦ 196 repräsentiert DT_TIME Mit Nullwert endende Zeichenfolge. Eine Hostvariable kann jeden der unterstützten Datentypen haben. die einen gültigen Zeitstempel repräsentiert .Datentypen in Embedded SQL Datentypen in Embedded SQL Um Informationen zwischen einem Programm und dem Datenbankserver austauschen zu können. Die Zeichenfolge wird mit Leerzeichen aufgefüllt. Die Konstanten für Embedded SQL haben alle das Präfix DT_ und befinden sich in der Header-Datei sqldef. } DECIMAL. die eine gültige Zeitangabe repräsentiert DT_TIMESTAMP Mit Nullwert endende Zeichenfolge. Folgende Datentypen werden von der Embedded SQLProgrammierschnittstelle unterstützt: ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ DT_BIT 8-Bit Ganzzahl mit Vorzeichen DT_SMALLINT 16-Bit-Ganzzahl mit Vorzeichen DT_UNSSMALLINT 16-Bit Ganzzahl ohne Vorzeichen DT_TINYINT 8-Bit Ganzzahl mit Vorzeichen DT_BIGINT 64-Bit Ganzzahl mit Vorzeichen DT_INT 32-Bit Ganzzahl mit Vorzeichen DT_UNSINT 16-Bit Ganzzahl ohne Vorzeichen DT_FLOAT 4-Byte-Gleitkommazahl DT_DOUBLE 8-Byte-Gleitkommazahl. ♦ DT_STRING Mit Nullwert endende Zeichenfolge. DT_DECIMAL gepackte Dezimalzahl typedef struct DECIMAL { char array[1]. wenn bei der Initialisierung der Datenbank mit Leerzeichen aufgefüllte Zeichenfolgen verwendet werden.h. um Daten mit der Datenbank auszutauschen.h Variablen dieser Datentypen definieren. Sie können mit den DECL_-Makros in sqlca.

müssen Sie das Längenfeld setzen. typedef struct BINARY { unsigned short int len. $ Weitere Hinweise finden Sie unter "Lange Werte senden und abfragen" auf Seite 237. \ char array[size+1]. \ a_sql_uint32 untrunc_len. Umfangreiche Daten können auf einmal. Das Makro definiert eine Struktur folgendermaßen: #define DECL_LONGVARCHAR( size ) \ struct { a_sql_uint32 array_len. typedef struct VARCHAR { unsigned short int len. Wenn Sie dem Datenbankserver Informationen liefern. Das Makro definiert eine Struktur folgendermaßen: #define DECL_LONGBINARY( size ) struct { a_sql_uint32 array_len. müssen Sie das Längenfeld setzen. mit Leerzeichen aufgefüllt DT_VARCHAR Zeichenfolge variabler Länge. ♦ DT_LONGBINARY Lange Binärdaten. Die Daten werden nicht mit Nullwert abgeschlossen. a_sql_uint32 stored_len. \ a_sql_uint32 stored_len. } VARCHAR. Wenn Sie Informationen vom Datenbankserver abholen.\ } Die DECL_LONGVARCHAR-Struktur kann mit Daten über 32 Kbyte verwendet werden. mit einem 2-ByteLängenfeld. char array[1]. Wenn Sie dem Datenbankserver Informationen liefern. Sie können an den Server auf einmal. } BINARY.Kapitel 6 Programmieren mit Embedded SQL ♦ ♦ DT_FIXCHAR Zeichenfolge mit fester Länge. ♦ DT_BINARY Binärdaten variabler Länge mit einem 2-Byte-Längenfeld. char array[1]. und zwar mit der GET DATA-Anweisung. setzt der Datenbankserver das Längenfeld (nicht aufgefüllt). char array[size]. setzt der Datenbankserver das Längenfeld. indem sie an eine Datenbankvariable mit der SET-Anweisung angehängt werden. beziehungsweise in Abschnitten übermittelt werden. Wenn Sie Informationen vom Datenbankserver abholen. ♦ DT_LONGVARCHAR Lange Zeichendaten mit unterschiedlicher Länge. a_sql_uint32 untrunc_len. beziehungsweise in Abschnitten abgerufen werden. } \ \ \ \ \ 197 .

Dieser Datentyp wird ausschließlich benutzt. ♦ DT_VARIABLE mit Nullwert abgeschlossene Zeichenfolge. Beachten Sie. um Daten vom Datenbankserver abzurufen. erleichtert dem Programmierer den Umgang damit. TIME_FORMAT. Sie können an den Server auf einmal. /* 0-6 0=Sonntag */ unsigned short day_of_year. /* 0-365 */ unsigned char day. 198 . werden die Untersätze day_of_year und day_of_week ignoriert. beziehungsweise in Abschnitten übermittelt werden. typedef struct sqldatetime { unsigned short year. Die Zeichenfolge muss der Name einer SQL-Variablen sein. /* 0-59 */ unsigned long microsecond. $ Näheres finden Sie unter den Datenbankoptionen DATE_FORMAT. um Daten an den Datenbankserver zu liefern. /* 0-11 */ unsigned char day_of_week. /* 0-23 */ unsigned char minute. Die SQLDATETIME-Struktur kann benutzt werden. eine Zeit oder einen Zeitstempel in die Datenbank einzugeben. Er kann nicht benutzt werden. Wenn Sie eine SQLDATETIME-Struktur verwenden. /* 0-59 */ unsigned char second. und zwar mit der GET DATA-Anweisung. dass Felder vom Typ DATE. was in einen dieser Datentypen konvertiert werden kann). indem sie an eine Datenbankvariable mit der SET-Anweisung angehängt werden. B. TIMESTAMP_FORMAT und DATE_ORDER in "Datenbankoptionen" auf Seite 597 der Dokumentation ASA Datenbankadministration. um Felder vom Typ DATE. /* 1-31 */ unsigned char hour. deren Wert vom Datenbankserver benutzt wird. /* z. ♦ DT_TIMESTAMP_STRUCT SQLDATETIME-Struktur mit Feldern für jeden Teil des Zeitstempels. 1999 */ unsigned char month. $ Weitere Hinweise finden Sie unter "Lange Werte senden und abfragen" auf Seite 237. TIME und TIMESTAMP abzurufen (oder alles. Umfangreiche Daten können auf einmal beziehungsweise in Abschnitten abgerufen werden. Der Abruf von Daten in dieser Struktur. /* 0-999999 */ } SQLDATETIME. TIME und TIMESTAMP auch mit einem beliebigen Zeichendatentyp abgerufen und aktualisiert werden können.Datentypen in Embedded SQL Die DECL_ LONGBINARY -Struktur kann mit Daten über 32 Kbyte verwendet werden. Anwendungen haben häufig eigene Formate und einen eigenen Programmcode für Zeit und Datum. um ein Datum.

Die Datentypen VARCHAR.h festgelegt. BINARY und DECIMAL enthalten ein Array. $ Weitere Hinweise finden Sie unter "GET DATA-Anweisung [ESQL]" auf Seite 471 der Dokumentation ASA SQL-Referenzhandbuch und "SETAnweisung" auf Seite 572 der Dokumentation ASA SQL-Referenzhandbuch. das aus einem einzigen Zeichen besteht und sind daher nicht geeignet. die den verschiedenen Datenbank-Datentypen von DATE und TIME entsprechen. um Hostvariable zu deklarieren.Kapitel 6 Programmieren mit Embedded SQL Die Strukturen sind in der Datei sqlca. Sie sind dagegen nützlich. 199 . DatenbankDatentypen DATE und TIME Die Embedded SQL-Schnittstelle bietet keine Datentypen. Diese Datenbank-Datentypen werden alle entweder mit der Struktur SQLDATETIME oder mit Zeichenfolgen abgerufen und aktualisiert. um Variable dynamisch zuzuweisen oder Variable zu konvertieren (typecasting).

in der Hostvariablen verwendet werden. werden Hostvariable definiert.SQLDA). TYPEDEFTypen und –Strukturen sind also nicht zulässig. Der Variablenname hat in einer SQL-Anweisung einen Doppelpunkt (:) als Präfix. Ein standardmäßiger SQL-Präprozessor durchsucht nur den CProgrammcode. die dem SQL-Präprozessor bekannt gemacht werden. indem eine normale C-Variable mit folgenden Zeilen eingeschlossen wird: EXEC SQL BEGIN DECLARE SECTION. um ihn von anderen Namen zu unterscheiden. um Werte an den Datenbankserver zu übergeben oder um Werte vom Datenbankserver abzurufen. Wie in den Standards für IBM SAA und ANSI Embedded SQL beschrieben. indem sie in einen Deklarationsabschnitt eingefügt werden (declaration section). Beispiel ♦ Das folgende Beispiel zeigt den Gebrauch von Hostvariablen für einen INSERT-Befehl. Hostvariable können benutzt werden. der innerhalb des Deklarationsabschnitts steht. automatisch ein SQLDA. Diese Hostvariable können dann an Stelle von konstanten Werten in jeder SQL-Anweisung verwendet werden. Dynamische SQL ist eine allgemeinere Art. Hostvariable deklarieren Hostvariable werden definiert. $ Weitere Hinweise zu dynamischem SQL finden Sie unter "Statische und dynamische SQL" auf Seite 223. Wenn der Datenbankserver den Befehl ausführt.oder Spaltennamen verwendet werden können: Dafür ist dynamisches SQL erforderlich. mit Hilfe einer Struktur namens SQL-Deskriptor-Bereich (SQL Descriptor Area . wird der Wert der Hostvariable benutzt. Beachten Sie. die in der Anweisung erlaubt sind. Die Variablen werden von dem Programm belegt und dann in die Datenbank eingefügt: 200 . /* Deklarationen der C-Variablen */ EXEC SQL END DECLARE SECTION. Der SQL-Präprozessor erzeugt für jede einzelne Anweisung. um Informationen mit dem Datenbankserver auszutauschen.Hostvariable benutzen Hostvariable benutzen Hostvariable sind C-Variable. Hostvariable sind recht einfach zu benutzen. dass Hostvariable nicht an Stelle von Tabellen. aber sie unterliegen einigen Einschränkungen. Variable können innerhalb des DECLARE-Abschnitts initialisiert werden.

$ Ein größeres Beispiel finden Sie unter "Beispiel für statischen Cursor" auf Seite 193.h festgelegte Makros können dazu verwendet werden. DECL_LONGBINARY( 128000 ) v_longbinary. :employee_name. char employee_initials[8]. Sie werden wie folgt benutzt: EXEC SQL BEGIN DECLARE SECTION. DECL_VARCHAR( 10 ) v_varchar. :employee_initials. LONG VARCHAR. FIXCHAR. die als Hostvariable erlaubt sind und die entsprechenden Datentypen der Embedded SQL-Schnittstelle. C-Hostvariablentypen Nur eine begrenzte Anzahl von C-Datentypen werden als Hostvariable unterstützt. In der Header-Datei sqlca. EXEC SQL END DECLARE SECTION. Die folgende Tabelle zeigt die C-Variablentypen. DECL_DATETIME v_datetime. char employee_phone[15]. 2 ) v_packed_decimal.Kapitel 6 Programmieren mit Embedded SQL EXEC SQL BEGIN DECLARE SECTION. BINARY. long employee_number. DECL_BINARY( 4000 ) v_binary. DECL_DECIMAL( 10. Hostvariable folgenden Typs zu definieren: VARCHAR. Der Präprozessor erkennt diese Makros innerhalb eines Deklarationsabschnitts und behandelt Variable ihrem Typ entsprechend. char employee_name[50]. EXEC SQL END DECLARE SECTION. /* Das Programm belegt die Variablen mit passenden Werten*/ */ EXEC SQL INSERT INTO Employee VALUES (:employee_number. PACKED DECIMAL. DECL_LONGVARCHAR( 32678 ) v_longvarchar. LONG BINARY oder SQLDATETIME. 201 . DECL_FIXCHAR( 10 ) v_fixchar. :employee_phone ). Andererseits haben bestimmte Hostvariable keinen entsprechenden Datentyp in C.

Die Zeichenfolge wird mit Leerzeichen aufgefüllt. DECL_LONGVARCHAR( n ) a. /*n=1*/ DECL_FIXCHAR(n) a.s) DT_FIXCHAR(n) DT_STRING(n) char *a.Hostvariable benutzen C-Datentyp short i. DT_INT DT_FLOAT DT_DOUBLE DT_DECIMAL(p. DECL_VARCHAR(n) a. float f. wenn bei der Initialisierung der Datenbank mit Leerzeichen aufgefüllte Zeichenfolgen verwendet werden. DECL_DECIMAL(p. DT_STRING(32767) DT_VARCHAR(n) DECL_BINARY(n) a. Lange Binärdaten von variabler Länge mit drei 4Byte-Längenfeldern. long int l. unsigned long int l. DT_LONGBINARY 202 . Mit Nullwert abgeschlossene Zeichenfolge. nicht mit Leerzeichen aufgefüllt Zeichenfolge mit variabler Länge mit 2-ByteLängenfeld SQLDATETIME-Struktur Lange Zeichenfolgen von variabler Länge mit drei 4Byte-Längenfeldern. Nicht mit Leerzeichen aufgefüllt. short int i. long l. unsigned short int i. char a[n]. double d. DT_TIMESTAMP_STRUCT DT_LONGVARCHAR DECL_LONGBINARY( n ) a. DT_BINARY(n) DECL_DATETIME a. Mit Nullwert abgeschlossene Zeichenfolge Zeichenfolge mit variabler Länge mit 2-ByteLängenfeld. /*n>=1*/ Datentyp der Embedded SQL-Schnittstelle DT_SMALLINT Beschreibung 16-Bit-Ganzzahl mit Vorzeichen 32-Bit-Ganzzahl mit Vorzeichen 4-Byte-Gleitkomma 8-Byte-Gleitkomma Gepackte Dezimalzahl Mit Leerzeichen aufgefüllte Zeichenfolge fester Länge. DECL_FIXCHAR a[n].s) char a. Nicht mit Leerzeichen aufgefüllt oder mit Nullwert endend.

Für den SQL-Präprozessor sind Hostvariable globale Variable: zwei Hostvariable können niemals den gleichen Namen haben. in dem sie definiert sind). sodass sie größer wird als zu dem Zeitpunkt.767 Bytes lang ist. nimmt die Datenbankschnittstelle an. eines Cursornamens oder eines Optionsnamens. Hostvariable benutzen Hostvariable können unter folgenden Umständen benutzt werden: ♦ In SELECT-. Da aber der SQL-Präprozessor den C-Code nicht durchsucht.oder Zeichenfolgenkonstante erlaubt sind.767 Bytes einen Programm-Stack-Überlauf verursachen. einer Verbindungszeichenfolge oder eines Datenbank-Umgebungsnamens. UPDATE. die einen pointer to char erwartet. wo auch eine C-Variablendeklaration stehen könnte. Die dort deklarierten CVariablen haben ihre normalen Aufgaben (sie stehen innerhalb des Blocks zur Verfügung. dass sie 32. der groß genug ist. ♦ ♦ ♦ 203 . So erkennt die PREPAREAnweisung die Größe des Arrays.und DELETE-Anweisungen sind sie überall dort erlaubt. um jeden Wert enthalten zu können.Kapitel 6 Programmieren mit Embedded SQL Zeiger auf ein Zeichen (pointer to char) Von einer Hostvariable. In der INTO-Klausel einer SELECT oder FETCH-Anweisung Hostvariable können auch in Embedded SQL-Befehlen benutzt werden an Stelle eines Anweisungsnamens. Im Fall von CONNECT. eines Kennworts. Gültigkeitsbereich von Hostvariablen Die Deklaration einer Hostvariablen kann im Allgemeinen überall dort stehen. Jede Hostvariable vom Typ pointer to char. auch als Parameter für eine Funktion. Es ist daher vorzuziehen. ein deklariertes Array zu benutzen. denn jemand könnte die Definition der Spalte in der Datenbank ändern. Falls Sie einen 16-Bit-Compiler benutzen. Das gilt auch für den Parameterdeklarationsbereich einer C-Funktion. um Informationen von der Datenbank abzurufen. Dies kann recht gefährlich sein. die als pointer to char (char *a) deklariert ist. Dies wiederum könnte zu unvorhersehbaren Speicherbelegungen und daraus resultierenden Problemen führen. muss auf einen Puffer zeigen. wo eine Zahlen. als das Programm geschrieben wurde. die benutzt wird. INSERT-. der möglicherweise von der Datenbank zurückkommen könnte. könnten die erforderlichen 32. eines Verbindungsnamens. erkennt er keine C-Blöcke. DISCONNECT und SET CONNECT kann eine Hostvariable benutzt werden an Stelle einer Benutzer-ID.

long SQLCODE. eines Optionsnamens oder eines Optionswerts.Hostvariable benutzen ♦ Im Fall von SET OPTION und GET OPTION kann eine Hostvariable benutzt werden an Stelle einer Benutzer-ID. char SQLSTATE[6]. Gekürzte Zeichenfolgen Damit eine Anwendung Fälle behandeln kann. um in eine Hostvariable zu passen.. sub1() { char SQLSTATE[6]. in denen ein abgerufener Wert gekürzt werden muss. Der ISO/ANSIStandard verlangt. Folgendes ist gültiges Embedded SQL: INCLUDE SQLCA. die zusätzliche Informationen liefern. Hostvariable können nicht an Stelle eines Tabellennamens oder eines Spaltennamens in einer Anweisung benutzt werden. wenn Sie Daten abrufen oder speichern. Indikatorvariable Indikatorvariable sind C-Variable. exec SQL CREATE TABLE ... Indikatorvariable werden in folgenden Fällen benutzt: ♦ ♦ NULL-Werte Damit eine Anwendung mit NULL-Werten umgehen kann. dass sie exakt wie folgt definiert werden: long SQLCODE. // Kein SQLSTATE im Gültigkeitsbereich dieser Anweisung } ♦ SQLSTATE und SQLCODE sind besonders wichtig. } sub2() { exec SQL DROP TABLE. ♦ Konvertierungsfehler Für Fehlerinformationen 204 .. sub1() { char SQLSTATE[6]. exec SQL CREATE TABLE ... } ♦ Beispiele ♦ ♦ Folgendes ist nicht gültiges Embedded SQL: INCLUDE SQLCA.

/* Das Programm belegt empnum. EXEC SQL END DECLARE SECTION.Kapitel 6 Programmieren mit Embedded SQL Eine Indikatorvariable ist eine Hostvariable vom Typ short int. NULL kann nicht für einen Wert stehen. short int employee_number. :employee_initials. :employee_phone:ind_phone ). der dem für die Spalte definierten Typ entspricht. In der Dokumentation zum Adaptive Server Anywhere bezieht sich eine Erwähnung von NULL immer auf die Bedeutung. 205 . NULL in SQL darf nicht verwechselt werden mit der C-Konstante gleichen Namens (NULL). Indikatorvariable verwenden. In der folgenden INSERT-Anweisung zum Beispiel ist :ind_phone eine Indikatorvariable: EXEC SQL INSERT INTO Employee VALUES (:employee_number. short int ind_phone. :employee_name. char employee_name[50]. um NULL einzufügen Eine INSERT-Anweisung könnte wie folgt eine Indikatorvariable einfügen: EXEC SQL BEGIN DECLARE SECTION. die es in einer SQLDatenbank hat (wie oben definiert). die in einer SQL-Anweisung unmittelbar auf eine normale Hostvariable folgt. char employee_phone[15]. :employee_phone:ind_phone ). char employee_initials[6]. Die gleichnamige C-Konstante wird dagegen als Null-Zeiger bezeichnet (Groß-/Kleinschreibung). um nicht initialisierte oder ungültige Zeiger zu repräsentieren. :employee_name. :employee_initials. ist daher mehr als eine normale Hostvariable erforderlich. Um einen NULL-Wert an die Datenbank zu übergeben oder NULL als Ergebnis von der Datenbank erhalten zu können. Indikatorvariable für die Behandlung von Nullwerten verwenden In SQL-Daten repräsentiert NULL entweder ein unbekanntes Attribut oder eine nicht anwendbare Information. empname. initials und homephone */ if( /* falls die Telefonnummer unbekannt ist */ ) { ind_phone = -1. } else { ind_phone = 0. Die C-Konstante NULL wird benutzt. } EXEC SQL INSERT INTO Employee VALUES (:employee_number. Indikatorvariable werden für diesen Zweck eingesetzt.

um Daten von der Datenbank abzurufen. Sie werden verwendet. in der der Konvertierungsfehler auftrat.Hostvariable benutzen Hat die Indikatorvariable den Wert –1. wird der Wert NULL eingefügt. den der aus der Datenbank abgerufene Wert vor dem Kürzen hatte. um festzustellen. erzeugt jede fehlgeschlagene Datentypkonvertierung (statt eines Fehlers) die Warnung CANNOT_CONVERT. falls eine fehlgeschlagene Konvertierung auftritt. wird ein Fehler erzeugt (SQLE_NO_INDICATOR). wird der tatsächliche Wert von employee_phone eingefügt. Falls ein Wert beim Abrufen gekürzt wurde. wird NULL eingefügt. ob irgendwelche abgerufenen Werte gekürzt wurden. Dieser Wert gibt die Länge an. Falls ein NULL-Wert von der Datenbank abgerufen wird und keine Indikatorvariable zur Verfügung steht. um in eine Hostvariable zu passen. Ist die Länge des gekürzten Werts größer als 32.767. hat die Indikatorvariable den Wert 32. Indikatorvariable für gekürzte Werte verwenden Indikatorvariable zeigen an. wird diese Variable mit –2 belegt. Hat die Spalte. wird die Indikatorvariable mit einem positiven Wert belegt. Wenn Sie die Datenbankoption CONVERSION_ERROR auf OFF setzen. um NULL abzurufen Indikatorvariable werden auch benutzt. eine Indikatorvariable. 206 . Fehler werden im nächsten Abschnitt erklärt. Sie können Indikatorvariable verwenden. Indikatorvariable verwenden. So können Anwendungen mit dem Kürzen von Werten angemessen umgehen. um anzuzeigen. in welcher Spalte eine fehlgeschlagene Datentypkonvertierung auftrat. Hat sie den Wert 0. dass ein NULL-Wert abgerufen wurde (der Indikator ist negativ).767. Zusammenfassung: Werte für Indikatorvariable Folgende Tabelle bietet eine Zusammenfassung zum Gebrauch von Indikatorvariablen. Indikatorwerte für Konvertierungsfehler verwenden Als Voreinstellung ist die Datenbankoption CONVERSION_ERROR auf ON gesetzt. jede fehlgeschlagene Datentypkonvertierung führt zu einem Fehler und es wird keine Zeile zurückgegeben. Wenn Sie beim Einfügen von Daten in die Datenbank die Datenbankoption CONVERSION_ERROR auf OFF setzen.

an die Datenbank übergeben Wert der Hostvariable Wert von der Datenbank erhalten Der abgerufene Wert wurde gekürzt tatsächliche Länge in der Indikatorvariable Entweder das Abrufen war erfolgreich oder CONVERSION_ERROR ist auf ON gesetzt. SQLCODE gibt die Warnung CANNOT_CONVERT aus.Kapitel 6 Programmieren mit Embedded SQL Indikatorwert >0 Wert. Ergebnis NULL 0 Wert der Hostvariable –1 –2 Nullwert Nullwert < –2 Nullwert $ Weitere Informationen über das Abrufen von long-Werten finden Sie unter "GET DATA-Anweisung [ESQL]" auf Seite 471 der Dokumentation ASA SQL-Referenzhandbuch. Ergebnis NULL Konvertierungsfehler (nur wenn CONVERSION_ERROR auf OFF gesetzt ist). 207 .

wenn Sie Speicherinhalte untersuchen.SQL-Kommunikationsbereich (SQLCA) SQL-Kommunikationsbereich (SQLCA) Der SQL-Kommunikationsbereich (SQL Communication Area . der bei jeder Datenbankanforderung benutzt wird. Der Präprozessor erzeugt eine externe Referenz auf die globale SQLCAVariable und eine externe Referenz auf einen Zeiger auf die Variable. Der Zeiger heißt sqlcaptr. sqlstate und einige weitere anzusprechen. die den Fehlercode angibt. um auf einen bestimmten Fehlercode zu testen.h definiert. Eine globale SQLCA-Variable ist in der Schnittstellenbibliothek definiert. Er wird allen Datenbank-Bibliotheksfunktionen übergeben. Die externe Referenz heißt sqlca und ist vom Typ SQLCA. ♦ ♦ $ Eine vollständige Auflistung der Fehlercodes finden Sie unter "Datenbank-Fehlermeldungen" auf Seite 1 der Dokumentation ASA Fehlermeldungen. SQLCA-Felder Die SQLCA-Felder haben folgende Bedeutung: ♦ sqlcaid 8-Byte Zeichenfeld. Der SQLCA-Bereich ist in der Header-Datei sqlca. 208 . um Statistiken und Fehlermeldungen von der Anwendung zum Datenbankserver zu übermitteln und umgekehrt. Bei einer erfolgreichen Operation ist der Fehlercode 0 (Null). falls eine Anforderung an die Datenbank einen Fehler hervorrief (siehe unten). die mit dem Datenbankserver kommunizieren müssen. die im Unterverzeichnis h Ihres Installationsverzeichnisses enthalten ist. um die Felder sqlcode.h. sqlcabc Ganzzahl (long integer). Der SQLCA-Bereich wird als Handle für die Kommunikationsverbindung zwischen Anwendung und Datenbank benutzt. das die Zeichenfolge SQLCA enthält (zur Identifizierung der SQLCA-Struktur). Einige C-Makros sind definiert. Dieses Feld unterstützt die Fehlersuche. SQLCA-Bereich bietet Fehlercodes Sie benutzen den SQLCA-Bereich. Die globale Variable selbst wird in der Importbibliothek deklariert. Definitionen für die Fehlercodes befinden sich in der Header-Datei sqlerr. Die Felder sqlcode und sqlstate enthalten Fehlercodes. wenn die Datenbank einen Fehler bei einer Anforderung feststellt. Er wird implizit allen Embedded SQL-Anweisungen übergeben. die die Länge der SQLCA-Struktur enthält (136 Bytes) sqlcode Eine Ganzzahl ("long integer").SQLCA) ist ein Speicherbereich. bei einer Warnung ist er positiv und bei einem Fehler ist er negativ.

Nach dem letzten Befehl zeigt der Wert der Variablen die Gesamtzahl der Eingabe/Ausgabe-Vorgänge für die gesamte Befehlssequenz an. enthält sqlerrmc den Tabellennamen. die erforderlich waren. …). Einige Fehlermeldungen enthalten eine oder mehr Platzhalter-Zeichenfolgen (%1. die mit 0 bis 4 oder A bis H beginnt. ♦ ♦ ♦ ♦ sqlerrp Reserviert sqlerrd Array von Ganzzahlen ("long integer") sqlwarn Reserviert sqlstate SQLSTATE-Statuswert. Ihr Programm kann diese Variable vor der Ausführung einer Befehlssequenz auf 0 (Null) setzen. Andere Klassen und Unterklassen sind durch die Implementierung definiert. die in eine Fehlermeldung einzufügen sind. $ Eine vollständige Auflistung der Fehlermeldungen finden Sie unter "Datenbank-Fehlermeldungen" auf Seite 1 der Dokumentation ASA Fehlermeldungen. 209 . Die Datenbank beginnt diese Zählung nicht mit 0 (Null) für jeden Befehl. Hat SQLSTATE den Wert '00000'. %2. Jede Klasse oder Unterklasse. welche Anweisung ausgeführt wurde. ist durch den SQL-Standard definiert. Wenn zum Beispiel ein Fehler Table Not Found erzeugt wird. der dann an passender Stelle in die Fehlermeldung eingefügt wird. zusätzlich zu dem in früheren Standards definierten SQLCODE. die durch die Zeichenfolge in diesem Feld ersetzt werden. um einen Befehl auszuführen.Kapitel 6 Programmieren mit Embedded SQL ♦ ♦ sqlerrml Die Länge der Daten im Feld sqlerrmc sqlerrmc Kann eine oder mehrere Zeichenfolgen enthalten. ♦ sqlerrd[2] (SQLCOUNT) Der Wert dieses Felds hängt davon ab. aufgeteilt in eine zwei Zeichen lange Klasse (die ersten zwei Zeichen) und eine drei Zeichen lange Unterklasse. Jedes Zeichen kann eine Ziffer von 0 bis 9 sein oder ein Großbuchstabe von A bis Z. Der ANSI SQL-Standard (SQL-92) definiert einen neuen Rückgabewerttyp für SQL-Anweisungen. ist kein Fehler und keine Warnung aufgetreten. Der Wert von SQLSTATE ist immer eine fünf Zeichen lange mit 0 (Null) abgeschlossene Zeichenfolge. sqlerror-Array Das Array sqlerror besteht aus folgenden Elementen: ♦ sqlerrd[1] (SQLIOCOUNT) Die Anzahl der Eingabe/Ausgabe-Vorgänge. $ Weitere SQLSTATE-Werte finden Sie unter "DatenbankFehlermeldungen" auf Seite 1 der Dokumentation ASA Fehlermeldungen.

falls das Abrufen vor dem Anfang des Cursors versucht wurde. falls eine SQLE_NOTFOUND-Warnung zurückgegeben wird. wenn der Datenbankserver sie errechnen kann. zum Beispiel wenn FETCH RELATIVE 1 ausgeführt wird. falls das Abrufen jenseits des Cursors versucht wurde. Im Fall eines Syntaxfehlers. Eine erneute Beschreibung ist nicht erforderlich. und negativ. $ Weitere Hinweise zu weiten Abrufen finden Sie unter "Mehr als eine Zeile auf einmal abrufen" auf Seite 218. PUT und DELETE-Anweisungen Anzahl der Zeilen. UPDATE-. Der Wert ist positiv. die mehr als ein Ergebnis haben können. Die Datenbank kann auch so konfiguriert werden. und die Position ist auf der letzten Zeile eines Cursors. die benutzt wird. enthält dieses Feld die ungefähre Position des Zeichens innerhalb der Befehlszeichenfolge. dass sie immer die tatsächliche Anzahl der Zeilen liefert (mit der Option ROW_COUNT). Der Wert ist 0 (Null). 1 Die Ergebnismenge ist unveränderlich. wo der Fehler erkannt wurde. ♦ ♦ GET DATA-Anweisung Das Feld SQLCOUNT enthält die tatsächliche Länge des Werts. vor der ersten Zeile oder nach der letzten Zeile befinden. die von der Anweisung betroffen waren Bei Cursor OPEN wird das Feld belegt entweder mit der tatsächlichen Anzahl der Zeilen im Cursor (ein Wert größer als oder gleich 0) oder mit einer Schätzung der Anzahl (ein negative Zahl. um die eine FETCH RELATIVEoder eine FETCH ABSOLUTE-Anweisung den Bereich der möglichen Cursorpositionen überschritten hat. DESCRIBE-Anweisung In der Klausel WITH VARIABLE RESULT. falls die Zeile nicht gefunden wurde. deren absoluter Wert die Schätzung ist). Es enthält die Anzahl der Zeilen. 210 . die Position aber gültig ist. Es wird sich um die tatsächliche Anzahl der Zeilen handeln. um Prozeduren zu beschreiben. SQLE_SYNTAX_ERROR. ohne die Zeilen zu zählen.) Bei weiten Abrufen entspricht SQLCOUNT der Anzahl der tatsächlich abgerufenen Zeilen und ist kleiner oder gleich der Anzahl der angeforderten Zeilen. ♦ FETCH Cursor-Anweisung Das Feld SQLCOUNT wird belegt. Während eines weiten Abrufs wird SQLE_NOTFOUND nicht festgelegt.SQL-Kommunikationsbereich (SQLCA) ♦ INSERT-. (Ein Cursor kann sich auf einer Zeile. wird SQLCOUNT auf einen der folgenden Werte gesetzt: ♦ ♦ 0 Die Ergebnismenge kann sich ändern: der Prozeduraufruf sollte nach jeder OPEN-Anweisung neu beschrieben werden.

Jeder SQLCA-Bereich. Der SQLCA-Bereich wird von der Laufzeitbibliothek benutzt. für alle Threads dieselbe Verbindung zur Datenbank benutzen. 2 211 . Sie können ohne Einschränkung für jeden Thread. Dieses Feld wird bei einem OPEN. der eine Verbindung zur Datenbank benötigt. $ Hinweise zur Abbruchanforderung finden Sie unter "AnforderungsManagement implementieren" auf Seite 247. SQLCA-Verwaltung für Code mit mehreren Threads oder "reentrant"-Code Sie können Embedded SQL-Anweisungen in Code mit mehreren Threads oder reentrant-Code benutzen. weil keine statisch initialisierten globalen Variablen benutzt werden können. der die Datenbank benutzen will.oder EXPLAIN-Befehl belegt. der in Ihrem Programm benutzt wird. sind Sie auf eine aktive Anforderung pro Verbindung beschränkt. Jede einzelne Datenbankverbindung ist nur von einem einzelnen SQLCABereich aus zugänglich. der reentrant-Code erzeugt ( -r). eine separate Verbindung öffnen. seinen eigenen SQCLA-Bereich. Mehrere SQLCA-Bereiche benutzen v Um mehrere SQLCA-Bereiche in Ihrer Anwendung zu benutzen. Wenn Sie allerdings eine einfache Verbindung benutzen. um zwischen den verschiedenen ThreadKontexten zu unterscheiden. die von einem separaten Thread aus ausgegeben werden muss. außer bei der Abbruchanweisung. Daher braucht jeder Thread. Diese Auswirkungen sind allerdings minimal. muss mit einem Aufruf von db_init initialisiert und am Ende mit einem Aufruf von db_fini wieder freigegeben werden. In einer Applikation mit mehreren Threads sollten Sie es vermeiden. außer wenn Sie Semaphore für die Zugriffssteuerung benutzen. gehen Sie wie folgt vor: 1 Sie müssen für den SQL-Präprozessor den Befehlszeilenschalter benutzen. Der reentrant-Code ist etwas umfangreicher und etwas langsamer.Kapitel 6 Programmieren mit Embedded SQL ♦ sqlerrd[3] (SQLIOESTIMATE) Die geschätzte Anzahl der Eingabe/Ausgabe-Vorgänge für den Abschluss des Befehls.

einen anderen SQLCA-Bereich für Datenbankanforderungen zu benutzen. um SQLCAReferenzen so einzustellen. kann ein Kontextwechsel verursachen. In welchen Fällen Sie mehrere SQLCA-Bereiche benutzen Sie können die Unterstützung mehrfacher SQLCAs in jeder der unterstützten Embedded SQL-Umgebungen benutzen. sodass jede Referenz auf den SQLCA-Bereich die angegebene Zeichenfolge benutzt. kann das den Datenbankserver und den NetWare-Dateiserver zum Absturz bringen. die Embedded SQL benutzt und die von mehr als einem Thread in Ihrer Anwendung aufgerufen wird. Die folgende Aufstellung gibt einen Überblick über die Umgebungen. sie ist jedoch nur für reentrant-Code erforderlich. dass sie auf Task-spezifische Daten zeigen. $ Weitere Hinweise zum Erstellen von SQLCA-Bereichen finden Sie unter "SET SQLCA-Anweisung [ESQL]" auf Seite 588 der Dokumentation ASA SQL-Referenzhandbuch. 3 Die Embedded SQL-Anweisung SET SQLCA ("SET SQLCAAnweisung [ESQL]" auf Seite 588 der Dokumentation ASA SQLReferenzhandbuch) wird verwendet. Ein Beispiel ist die folgende Anweisung: EXEC SQL SET SQLCA 'task_data->sqlca' wird zu Beginn eines Programms oder in einer Header-Datei benutzt. 212 . dass zum gleichen Zeitpunkt mehr als ein Thread auf den SQLCA-Bereich zugreift.SQL-Kommunikationsbereich (SQLCA) Vorsicht Wird unter NetWare nicht db_fini für jedes db_init aufgerufen. in denen mehrfache SQLCAs benutzt werden müssen: ♦ Anwendungen mit mehreren Threads Falls mehr als ein Thread denselben SQLCA-Bereich benutzt. Sie ändert den Status innerhalb des Präprozessors. Jeder Thread braucht seinen eigenen SQLCABereich. wenn Sie eine DLL haben. Diese Anweisung erzeugt keinen Code und hat daher keinen Einfluss auf die Performance. Das kann auch geschehen. um den SQL-Präprozessor anzuweisen.

Jede Windows-Anwendung braucht ihren eigenen SQLCA-Bereich. die ebenfalls eine Anforderung an den Datenbankserver richtet. dürfen Sie aus dem gleichen Grund nicht den globalen SQLCA-Bereich benutzen. greifen beide Anwendungen gleichzeitig darauf zu. Alle Vorgänge. könnte er die Kontrolle an eine andere Anwendung übergeben. Während der Datenbankserver eine Anforderung von einer Anwendung bearbeitet. Jeder SQLCA-Bereich hat eine aktive oder aktuelle Verbindung (siehe "SET CONNECTION-Anweisung [Interactive SQL]" auf Seite 578 der Dokumentation ASA SQL-Referenzhandbuch). als die Verbindung geöffnet wurde. ♦ Eine DLL mit einem Datensegment Eine DLL kann mit nur einem Datensegment erstellt werden oder mit einem Datensegment für jede Anwendung. die sich auf eine angegebene Datenbankverbindung beziehen. Verbindungsverwaltung mit mehreren SQLCA-Bereichen Sie müssen nicht mehrere SQLCA-Bereiche benutzen. die sich auf verschiedene Verbindungen beziehen.Kapitel 6 Programmieren mit Embedded SQL ♦ Dynamische Verknüpfungsbibliotheken (DLL) und gemeinsam genutzte Bibliotheken Eine DLL hat nur ein Datensegment. Falls Ihre DLL den globalen SQLCA-Bereich benutzt. um Verbindungen zu mehr als einer Datenbank herzustellen oder um mehr als eine Verbindung zu einer einzelnen Datenbank zu halten. Datensatz sperren Vorgänge. sind den normalen Datensatz-Sperrmechanismen unterworfen und können sich gegenseitig blockieren oder möglicherweise zu einer Deadlock-Situation führen. 213 . Jeder SQLCA-Bereich kann eine namenlose Verbindung haben. Falls Ihre DLL nur ein Datensegment hat. müssen denselben SQLCA-Bereich benutzen. aus dem eine DLL den globalen SQLCA-Bereich nicht benutzen kann. Information über Sperrmechanismen finden Sie im Kapitel "Transaktionen und Isolationsstufen verwenden" auf Seite 99 der Dokumentation ASA SQL-Benutzerhandbuch. der verwendet wurde. Jede Anwendung braucht ihren eigenen SQLCA-Bereich.

214 . und –1. die höchstens eine Zeile zurückgeben" auf Seite 214. wird eine Row Not Found-Warnung zurückgeben. Weitere Hinweise finden Sie unter "LONG-Daten abrufen" auf Seite 238.Daten abrufen Daten abrufen In Embedded SQL werden Daten mit der Anweisung SELECT abgerufen. Falls die Abfrageergebnisse mehr als eine Zeile enthalten. Die INTO-Klausel enthält eine Liste der Hostvariablen. ruft der Datenbankserver die Ergebnisse ab und schreibt sie in die Hostvariable. $ Weitere Hinweise finden Sie unter "Cursor in Embedded SQL verwenden" auf Seite 215. falls ein Fehler auftritt. Falls das Abfrageergebnis ist. $ LONG VARCHAR. Die Hostvariable können von Indikatorvariablen gefolgt sein. SELECT-Anweisungen. Beispiel Folgendes Code-Fragment gibt zum Beispiel 1 zurück. EXEC SQL BEGIN DECLARE SECTION. um NULLErgebnisse anzuzeigen. die die Werte der Auswahllisten-Elemente übernehmen sollen. wie beschrieben in "SQLKommunikationsbereich (SQLCA)" auf Seite 208. Die Anzahl der Hostvariablen muss mit der Anzahl der Auswahllisten-Elemente übereinstimmen. Sobald die SELECT-Anweisung ausgeführt wird. damit die zurückgegebenen Werte direkt Hostvariablen zugeordnet werden. Fehler und Warnungen werden in der SQLCA-Struktur zurückgegeben. die höchstens eine Zeile zurückgeben Eine einzeilige Abfrage fragt höchstens eine Zeile von der Datenbank ab. $ Hinweise dazu finden Sie unter "SELECT-Anweisungen. 0. Dabei werden zwei Fälle unterschieden: ♦ Die SELECT-Anweisung gibt mehr als eine Zeile zurück Verwenden Sie eine INTO-Klausel. ♦ Die SELECT-Anweisung kann mehrere Zeilen zurückgeben Verwenden Sie Cursor zur Verwaltung der Zeilen in der Ergebnismenge. gibt der Datenbankserver einen Fehler zurück. In einer SELECT-Anweisung für eine einzeilige Abfrage befindet sich eine INTO-Klausel nach der Auswahlliste und vor der FROM-Klausel. falls eine Zeile der Tabelle "employee" erfolgreich abgerufen wird. falls die Zeile nicht existiert.und LONG BINARY-Datentypen werden unterschiedlich zu anderen Datentypen behandelt. dass keine Zeile ausgewählt ist.

/* gefunden */ } } Cursor in Embedded SQL verwenden Ein Cursor wird benutzt. die mehrere Zeilen in Ihrer Ergebnismenge hat. bis die Warnung Row Not Found zurückgegeben wird. . $ Eine Einführung zu Cursorn finden Sie unter "Mit Cursorn arbeiten" auf Seite 20. int find_employee( long employee ) { emp_id = employee. Öffnen Sie den Cursor mit der Anweisung OPEN.Kapitel 6 Programmieren mit Embedded SQL long emp_id. sex. char sex.employee WHERE emp_id = :emp_id. /* ’employee’ wurde nicht gefunden */ } else if( SQLCODE < 0 ) { return( -1 ). char birthdate[15]. EXEC SQL SELECT emp_fname || ’ ’ || emp_lname. um Zeilen aus einer Abfrage abzurufen. /* Fehler */ } else { return( 1 ). short int ind_birthdate. 215 . char name[41]. . Ein Cursor ist ein Handle oder ein Name (identifier) für die SQL-Abfrage und eine Position innerhalb der Ergebnismenge. Rufen Sie die Ergebnisse Zeile für Zeile aus dem Cursor ab mit der FETCH-Anweisung. v So verwalten Sie einen Cursor in Embedded SQL: 1 2 3 4 Deklarieren Sie einen Cursor für eine bestimmte SELECT-Anweisung mit der DECLARE-Anweisung. :sex. EXEC SQL END DECLARE SECTION. :birthdate:ind_birthdate FROM "DBA". birth_date INTO :name. if( SQLCODE == SQLE_NOTFOUND ) { return( 0 ). Wiederholen Sie das Abrufen der Zeilen. .

n". Cursor positionieren Ein Cursor wird an einer von drei Stellen positioniert: ♦ ♦ 216 Auf einer Zeile Vor der ersten Zeile . Das folgende einfache Beispiel zeigt den Gebrauch von Cursorn: void print_employees( void ) { EXEC SQL BEGIN DECLARE SECTION. sex. bleiben für folgende Transaktionen geöffnet. birthdate ). } $ Vollständige Beispiele für Cursor finden Sie unter "Beispiel für statischen Cursor" auf Seite 193 und "Beispiel für dynamischen Cursor" auf Seite 193. birth_date FROM "DBA". EXEC SQL DECLARE C1 CURSOR FOR SELECT emp_fname || ’ ’ || emp_lname.Daten abrufen Fehler und Warnungen werden in der SQLCA-Struktur zurückgegeben. short int ind_birthdate. for( . if( SQLCODE == SQLE_NOTFOUND ) { break. char birthdate[15]. wie in "SQL-Kommunikationsbereich (SQLCA)" auf Seite 208 beschrieben. :sex. :birthdate:ind_birthdate. die mit einer WITH HOLD-Klausel geöffnet werden. } printf( "Name: %s Sex: %c Birthdate: %s. char sex. char name[50]. EXEC SQL END DECLARE SECTION. EXEC SQL OPEN C1. } EXEC SQL CLOSE C1.. sex. bis sie explizit geschlossen werden. ) { EXEC SQL FETCH C1 INTO :name. } else if( SQLCODE < 0 ) { break. } if( ind_birthdate < 0 ) { strcpy( birthdate. "UNKNOWN" ).employee. 5 Schließen Sie den Cursor mit der CLOSE-Anweisung. Cursor. Als Voreinstellung werden Cursor automatisch am Ende der Transaktion geschlossen (bei COMMIT oder ROLLBACK).name.

um eine Zeile in einen Cursor einzufügen. Ist der Cursor vor der ersten Zeile oder nach der letzten Zeile positioniert. falls die SELECT-Anweisung keine ORDER BYKlausel hat. Mit speziellen positioned-Versionen der Anweisungen UPDATE und DELETE können Sie die Zeile an der aktuellen Cursor-Position aktualisieren oder löschen. In einigen Fällen erscheint die eingefügte Zeile überhaupt nicht. Die Cursorposition kann mit dem FETCH-Befehl verschoben werden (siehe "FETCH-Anweisung [ESQL] [GP]" auf Seite 458 der Dokumentation ASA SQL-Referenzhandbuch ). Er kann absolut positioniert werden. Er kann auch relativ zur aktuellen Cursorposition verschoben werden. Der Datenbankserver platziert eingefügte Zeilen an unvorhersehbaren Positionen innerhalb eines Cursors. entweder bezogen auf den Anfang oder auf das Ende des Abfrageergebnisses. bis der Cursor geschlossen und wieder geöffnet wurde. Die Anweisung PUT kann verwendet werden. ist er vor der ersten Zeile positioniert. Cursorpositionierungsprobleme Einfügungen und einige Aktualisierungen zu DYNAMIC SCROLL-Cursorn können Probleme bei der Cursorpositionierung verursachen. wird der Fehler No Current Row of Cursor zurückgeben. 217 .Kapitel 6 Programmieren mit Embedded SQL ♦ Nach der letzten Zeile Wird ein Cursor geöffnet.

und so fort. wenn der Cursor eine ORDER BY-Klausel hat. Der Server gibt in SQLCOUNT die Anzahl der Datensätze zurück. Die Abrufanzahl nnn kann eine Hostvariable sein. dass sie mehr als eine Zeile auf einmal abruft. wenn zum Öffnen eines Cursors eine temporäre Tabelle erstellt werden musste. Diese Anzahl ist immer größer als 0 (Null). Bei einem mehrzeiligen Abruf gibt ein SQLCOUNT von 1 ohne Fehlerzustand an. außer wenn ein Fehler oder eine Warnung ausgegeben wird. Mehr als eine Zeile auf einmal abrufen Die FETCH-Anweisung kann so modifiziert werden. die einen vorhandenen Index benutzt (es wird keine temporäre Tabelle erstellt). Das passiert. Hinweise dazu finden Sie unter "PUT-Anweisung [ESQL]" auf Seite 538 der Dokumentation ASA SQL-Referenzhandbuch und "EXECUTE-Anweisung [ESQL]" auf Seite 449 der Dokumentation ASA SQL-Referenzhandbuch.Daten abrufen Bei Adaptive Server Anywhere tritt dies auf.sqc in Ihrem SQL AnywhereVerzeichnis finden. die abgerufen wurden. Die Anzahl der Variablen im SQLDA-Bereich muss das Produkt aus nnn multipliziert mit der Anzahl der Spalten pro Zeile sein. Man nennt diese Methode mehrzeiliges Abrufen (wide fetch) oder auch ArrayAbrufen (array fetch). Das kann die Performance verbessern. $ Eine Beschreibung finden Sie unter "Arbeitstabellen in der Abfrageverarbeitung verwenden" auf Seite 178 der Dokumentation ASA SQL-Benutzerhandbuch. Die erste Zeile wird in die SQLDA-Variablen von 0 bis (Anzahl der Spalten pro Zeile)-1 geschrieben. fügen Sie die Abrufanweisung wie folgt in Ihren Code ein: EXEC SQL FETCH . ARRAY nnn Dabei ist ARRAY nnn das letzte Element der FETCH-Anweisung. Beispiel Der folgende Beispielcode zeigt den Gebrauch von mehrzeiligen Abrufen (wide fetches). Jede Spalte muss in jeder Zeile des SQLDA-Bereichs vom selben Typ sein. sonst wird der Fehler SQLDA_INCONSISTENT ausgegeben. 218 . . . Um mehrzeiliges Abrufen (wide fetches) in Embedded SQL zu verwenden. Die UPDATE-Anweisung kann bewirken. Sie können diesen Code auch in samples\ASA\esqlwidefetch\widefetch. dass eine gültige Zeile abgerufen wurde. $ Der Adaptive Server Anywhere unterstützt auch mehrzeiliges Speichern (wide puts) und mehrzeiliges Einfügen (wide inserts). dass sich eine Zeile im Cursor verschiebt.

SQLDA * sqlda. }.h> <string. SQLCODE.h> "sqldef. if( num_cols * width > sqlda->sqln ) { free_sqlda( sqlda ). stat = stat0. sizeof( buffer ) ) ). unsigned width. printf( "SQL error %d -. if( sqlda == NULL ) return( NULL ).h> <stdlib. sqlerror_message( &sqlca. offset. sqlda = alloc_sqlda( 100 ). unsigned row.h" INCLUDE SQLCA. EXEC SQL DESCRIBE :stat INTO sqlda.Kapitel 6 Programmieren mit Embedded SQL #include #include #include #include EXEC SQL <stdio. */ { int num_cols. a_sql_statement_number stat. } static SQLDA * PrepareSQLDA( a_sql_statement_number stat0. *cols_per_row = num_cols = sqlda->sqld. if( sqlda == NULL ) return( NULL ).%s\n". } // Erste Zeile in SQLDA mit describe in // folgende (weite) Zeilen kopieren 219 . EXEC SQL END DECLARE SECTION. EXEC SQL BEGIN DECLARE SECTION. goto err. sqlda = alloc_sqlda( num_cols * width ). col. buffer. static void PrintSQLError() /*************************/ { char buffer[200]. EXEC SQL WHENEVER SQLERROR { PrintSQLError(). unsigned *cols_per_row ) /*********************************************/ /* Einen SQLDA-Bereich für Abrufe von der von "stat0" definierten Anweisung zuordnen. EXEC SQL DESCRIBE :stat INTO sqlda. Die Anzahl der Spalten wird "cols_per_row" zugeordnet. "width"Zeilen werden bei jeder FETCH-Anforderung abgerufen.

row < width.sqldata ). err: return( NULL ). offset++ ) { sqlda->sqlvar[offset]. return( sqlda ).sqltype = sqlda->sqlvar[col]. &sqlda->sqlvar[col]. row++ ) { for( col = 0. col++. col. if( SQLCOUNT == 0 ) { rows_fetched = 1.sqllen. (char *)sqlda->sqlvar[offset] . } else { rows_fetched = SQLCOUNT.sqllen = sqlda->sqlvar[col]. } } static int DoQuery( char * query_str0. unsigned fetch_width0 ) 220 . unsigned cols_per_row ) /******************************************/ /* Bereits durch weite Abrufe erhaltene Zeilen in SQLDA ausgeben */ { long rows_fetched. offset.sqlname. for( row = 1. col < num_cols. int row. // optional: beschriebenen Spaltennamen kopieren memcpy( &sqlda->sqlvar[offset]. for( row = 0. } printf( "\n" ). 40 ). offset = num_cols.sqltype. row++ ) { for( col = 0. sizeof( sqlda->sqlvar[0]. } } fill_s_sqlda( sqlda.sqlname. rows_fetched ).Daten abrufen sqlda->sqld = num_cols * width.sqlname ) ). col < cols_per_row. } printf( "Abgerufene %d Zeilen:\n". row < rows_fetched. printf( " \"%s\"". sqlda->sqlvar[offset]. } static void PrintFetchedRows( SQLDA * sqlda. col++ ) { offset = row * cols_per_row + col.

unsigned fetch_width. } EXEC SQL CLOSE QCURSOR. char *argv[] ) /*********************************/ /* Optionales erstes Argument ist ’select’-Anweisung * optionales zweites Argument ist ’Fetch’-Weite */ { char *query_str = "select emp_fname. fetch_width = fetch_width0. ) { EXEC SQL FETCH QCURSOR INTO DESCRIPTOR sqlda ARRAY :fetch_width. a_sql_statement_number stat. free_filled_sqlda( sqlda ). EXEC SQL DROP STATEMENT :stat. if( argc > 1 ) { query_str = argv[1]. unsigned fetch_width = 10. EXEC SQL BEGIN DECLARE SECTION. EXEC SQL PREPARE :stat FROM :query_str. EXEC SQL OPEN QCURSOR. 221 . err: return( SQLCODE ). if( SQLCODE != SQLE_NOERROR ) break. EXEC SQL END DECLARE SECTION. return( SQLE_NO_MEMORY ). if( argc > 2 ) { fetch_width = atoi( argv[2] ). } void main( int argc.. query_str = query_str0. sqlda = PrepareSQLDA( stat. emp_lname from employee". unsigned cols_per_row. fetch_width. EXEC SQL DECLARE QCURSOR CURSOR FOR :stat FOR READ ONLY.Kapitel 6 Programmieren mit Embedded SQL /*****************************************/ /* Wide Fetch "query_str0"-Auswahlanweisung * mit der Weite von "fetch_width0" Zeilen" */ { SQLDA * sqlda. } for( . PrintFetchedRows( sqlda. char * query_str. if( sqlda == NULL ) { printf( "Fehler beim Zuweisen von SQLDA\n" ). &cols_per_row ). cols_per_row ).

einschließlich der Zeile. fetch_width ). abgerufen wurden (zum Beispiel am Ende des Cursors). die den Fehler verursachte. EXEC SQL CONNECT "dba" IDENTIFIED BY "sql". enthält SQLCOUNT die Anzahl der Zeilen. } } } db_init( &sqlca ). SQLCOUNT enthält die Anzahl der Zeilen. die die Warnung verursacht hat. falls nötig. denn bei Fehlern werden keine SQLDA-Werte zurückgegeben. um die Zeilen zu lesen. DoQuery( query_str. und die eine Warnung SQLE_ROW_UPDATED_WARNING hervorgerufen hat. Der Wert von SQLCOUNT kann verwendet werden. Der SQLDA-Bereich enthält keine Werte für die Zeilen. wird ein Fehler erzeugt (SQLE_NO_INDICATOR: keine Indikatorvariable für ein NULLErgebnis). die abgerufen werden soll. die die Warnung verursacht hat. Falls eine Zeile zurückgegeben wird. jedoch nicht Null. gelöscht oder gesperrt wurde und so einen Fehler hervorruft (SQLE_NO_CURRENT_ROW oder SQLE_LOCKED). Falls weniger als die angeforderte Anzahl von Zeilen. Alle verbleibenden SQLDA-Elemente werden mit NULL gekennzeichnet. wird für die nicht abgerufenen SQLDA-Elemente jeweils NULL zurückgegeben. die die Warnung verursacht hat). wird der Abruf in der Zeile angehalten. So wird Platz für Indikatorvariable ermöglicht. um den Cursor neu zu positionieren und. Falls eine Zeile. anstatt die Funktion alloc_sqlda_noind zu verwenden. Falls keine Indikatorvariable vorhanden ist. Dies schließt nicht die Zeile ein. die vor dem Fehler gelesen wurden. indem der entsprechende Indikatorwert gesetzt wird. die abgerufen wurden. err: db_fini( &sqlca ). ♦ ♦ ♦ 222 . Die Werte aller bis zu diesem Zeitpunkt abgearbeiteten Zeilen werden zurückgegeben (einschließlich der Zeile.Daten abrufen if( fetch_width < 2 ) { fetch_width = 2. EXEC SQL DISCONNECT. die aktualisiert wurde. } Hinweise zur Verwendung von mehrzeiligen Abrufen (wide fetches) ♦ Die Funktion PrepareSQLDA weist den SQLDA-Bereich mit Hilfe der Funktion alloc_sqlda einem Speicherbereich zu.

Dynamische SQL-Anweisungen In C werden Zeichenfolgen in Zeichen-Arrays gespeichert. wie in "Hostvariable benutzen" auf Seite 200 beschrieben. 223 .Kapitel 6 Programmieren mit Embedded SQL Statische und dynamische SQL Es gibt zwei Möglichkeiten. SQL-Anweisungen in ein C-Programm einzubetten: ♦ ♦ Statische Anweisungen Dynamische Anweisungen Bis hier haben wir statische SQL erklärt. solange das C-Programm ausgeführt wird. Diese Anweisungen werden als statische Anweisungen bezeichnet. Sie können nicht verwendet werden. Statische Anweisungen können Referenzen auf Hostvariable enthalten. für diese Vorgänge sind dynamische Anweisungen erforderlich. Dieser Abschnitt vergleicht statische und dynamische SQL. Hostvariable können nur an Stelle von Zeichenfolgen. Statische SQL-Anweisungen Alle Standard-SQL-Anweisungen zur Datenmanipulation und Datendefinition können in ein C-Programm eingebettet werden.) abschliesst. denn auf C-Variable kann nicht über den Namen zugegriffen werden.oder Tabellennamen zu ersetzen. Solche SQL-Anweisungen können Hostvariable nicht in der gleichen Weise ansprechen wie statische Anweisungen. Dynamische Anweisungen werden in C-Zeichenfolgen konstruiert. Alle Beispiele bis hier haben statische Embedded SQL-Anweisungen benutzt. um Spalten.und numerischen Konstanten benutzt werden. indem man sie mit dem Präfix EXEC SQL versieht und das Kommando mit einem Semikolon (. Diese dynamischen Anweisungen können dann mit der PREPARE-Anweisung und der EXECUTE-Anweisung ausgeführt werden.

SQLDA) verwendet. . Normalerweise ist das nicht der Fall. nur als Platzhalter für eine Referenz auf den SQLDeskriptorbereich. Dies erleichtert es dem C-Programm. :empnum. Beispiel Zum Beispiel: EXEC SQL BEGIN DECLARE SECTION. Die Anweisung DESCRIBE BIND VARIABLES gibt die Namen der Hostvariablen zu den Bindevariablen zurück. Um diese Methode zu benutzen. zugeordnet über die Position. Diese Struktur wird vom SQL-Präprozessor erzeugt. :city:cityind. Eine Hostvariable. . wo auf Hostvariable zugegriffen wird. EXEC SQL PREPARE S1 FROM :comm. Im letzteren Fall dient der Name der Hostvariable. EXEC SQL END DECLARE SECTION. char address[30]. der im Text der Anweisung benutzt wird. wird eine Bindevariable genannt. "update %s set address = :?. EXEC SQL EXECUTE S1 USING :address.Statische und dynamische SQL Um Informationen zwischen dynamischen SQL-Anweisungen und CVariablen auszutauschen. mit der Informationen an die Datenbank übergeben werden. char city[20]. die Hostvariablen zu verwalten. tablename ). Im Folgenden finden Sie die allgemeine Methode: 224 . Daher können Sie Ihre eigene SQLDA-Struktur aufsetzen und diesen SQLDA-Bereich in der USING-Klausel des EXECUTE-Befehls angeben. sprintf( comm. short int cityind. die in einem PreparedStatement gefunden wurden. long empnum. Ein Platzhalter wird in die Anweisung eingefügt. wird eine Datenstruktur namens SQLDeskriptorbereich (SQL Descriptor Area . wie viele Hostvariable in der Anweisung vorkommen. Jeder Variablen entspricht jeweils ein Platzhalter in der vorbereiteten Anweisung. $ Informationen zum SQLDA-Bereich finden Sie unter "Der SQLDeskriptor-Bereich (SQLDA)" auf Seite 228. Ein Platzhalter ist entweder ein Fragezeichen (?) oder eine Referenz auf eine Hostvariable wie in statischen Anweisungen (ein Hostvariablen-Name mit einem vorangestellten Doppelpunkt). . muss der Programmierer wissen. um anzuzeigen. wenn Sie beim EXECUTEBefehl in der USING-Klausel eine Liste von Hostvariablen spezifizieren. char comm[200]. city = :?" " where employee_number = :?".

"update %s set address = :address. EXEC SQL END DECLARE SECTION. . EXEC SQL EXECUTE S1 USING DESCRIPTOR sqlda. falls Sie keine Grenze festlegen können */ sqlda = alloc_sqlda( 10 ). . falls type eine Zeichenfolge ist Gesamtstellen und Dezimalstellen. . die auf den name-Feldern in sqlda basieren. free_sqlda( sqlda ). Die Indikatorvariable wird mit einem positiven Wert besetzt. sprintf( comm. wenn nicht genug Platz zur Verfügung stand. wie viele Hostvariable gefunden wurden. Die Indikatorvariable wird auch vom Datenbankserver verwendet. um einen NULL-Wert an die Datenbank zu übergeben. um anzuzeigen. 225 . tablename ). char comm[200]. . */ /* SQLDA_VARIABLE-Felder mit Werten belegen. Siehe nächstes Beispiel. . SQLDA-Inhalt Der SQLDA-Bereich besteht aus einem Array von Variablendeskriptoren. oder um einen NULL-Wert von der Datenbank abzurufen. $ Weitere Hinweise finden Sie unter "Indikatorvariable" auf Seite 204. um einen Wert von der Datenbank zu erhalten. /* Nehmen Sie an. EXEC SQL PREPARE S1 FROM :comm.Kapitel 6 Programmieren mit Embedded SQL EXEC SQL BEGIN DECLARE SECTION. oder die Stelle. an der die Datenbank Daten speichert oder von der sie Daten abruft: ♦ ♦ ♦ ♦ ♦ den Datentyp die Länge. /* sqlda->sqld sagt Ihnen. EXEC SQL DESCRIBE BIND VARIABLES FOR S1 USING DESCRIPTOR sqlda. unter welchen Bedingungen Werte während einer Datenbankoperation gekürzt wurden. falls type ein nummerischer Datentyp ist Speicheradresse Indikatorvariable $ Eine vollständige Beschreibung der SQLDA-Struktur finden Sie unter "Der SQL-Deskriptor-Bereich (SQLDA)" auf Seite 228 Indikatorvariable und NULL Die Indikatorvariable wird verwendet. . Jeder Deskriptor beschreibt die Attribute der entsprechenden Variablen des C-Programms. city = :city" " where employee_number = :empnum". dass es nicht mehr als 10 Hostvariable gibt.

/* Daten verarbeiten */ 226 . EXEC SQL WHENEVER NOTFOUND {break}. oder in einen SQLDA-Bereich. EXEC SQL END DECLARE SECTION. ){ EXEC SQL FETCH C1 USING DESCRIPTOR sqlda. werden dagegen mit Hilfe von dynamischen Cursorn verwaltet. . if( sqlda->sqld > sqlda->sqln ){ actual_size = sqlda->sqld. gefolgt von einer EXECUTE-Anweisung mit einer INTO-Klausel. Da die Anzahl der Elemente in der Auswahlliste dem C-Programmierer normalerweise unbekannt ist. for( . SQLDA * sqlda. indem sqlda neu zugewiesen und DESCRIBE erneut ausgeführt wird. die nur eine einzige Zeile zurückgibt. . Falls es falsch ist. die Information wird mit der Anweisung FETCH USING DESCRIPTOR abgerufen.Statische und dynamische SQL Die dynamische SELECT-Anweisung Eine SELECT-Anweisung. "select * from %s". wird in der Regel der SQLDA-Bereich benutzt. EXEC SQL DESCRIBE SELECT LIST FOR S1 USING DESCRIPTOR sqlda.. free_sqlda( sqlda ). int actual_size. char comm[200]. } fill_sqlda( sqlda ). . Der Platzbedarf für die Werte wird dann mit der Funktion fill_sqlda() zugewiesen. SELECTAnweisungen. table_name ). die mehrere Zeilen zurückgeben. wird es gleich nach dem ersten DESCRIBE korrigiert. EXEC SQL DESCRIBE SELECT LIST FOR S1 USING DESCRIPTOR sqlda. Die Anweisung DESCRIBE SELECT LIST richtet einen SQLDA-Bereich ein mit Typen für die Elemente der Auswahlliste. Ein typisches Szenario sieht wie folgt aus: EXEC SQL BEGIN DECLARE SECTION. Mit dynamischen Cursorn werden Ergebnisse in eine Hostvariablen-Liste geschrieben. EXEC SQL PREPARE S1 FROM :comm. EXEC SQL OPEN C1. um das einzeilige Ergebnis abzurufen. kann dynamisch vorbereitet werden. EXEC SQL DECLARE C1 CURSOR FOR S1. /* Anfaengliche Schaetzung von 10 Spalten im Ergebnis. sprintf( comm. sqlda = alloc_sqlda( actual_size ). der mit der FETCH-Anweisung angegeben wird (FETCH INTO und FETCH USING DESCRIPTOR). */ sqlda = alloc_sqlda( 10 ).

dass Anweisungen beendet werden. Beenden Sie Anweisungen (drop). wenn sie nicht mehr gebraucht werden. damit nicht unnötigerweise Ressourcen gebunden bleiben. So stellen Sie sicher. $ Detaillierte Informationen zu den oben erwähnten Funktionen finden Sie unter "Referenz der Bibliotheksfunktion" auf Seite 253. $ Ein vollständiges Beispiel für den Gebrauch von Cursorn für eine dynamische Anweisung finden Sie unter "Beispiel für dynamischen Cursor" auf Seite 193.Kapitel 6 Programmieren mit Embedded SQL } EXEC SQL CLOSE C1. 227 . EXEC SQL DROP STATEMENT S1.

/* Länge der Char-Daten */ char data[ SQL_MAX_NAME_LEN ]. die für dynamische SQL-Anweisungen verwendet wird. ist tatsächlich dieser SQLDABereich.Der SQL-Deskriptor-Bereich (SQLDA) Der SQL-Deskriptor-Bereich (SQLDA) Der SQLDA-Bereich (SQL Descriptor Area) ist eine Schnittstellenstruktur. Wenn Hostvariable mit statischen SQL-Anweisungen verwendet werden. erzeugt der Präprozessor einen SQDLA-Bereich für diese Hostvariable. die Sie zur Verwaltung der SQLDA-Bereiche verwenden können. Der SQLDA-Bereich ist in der Header-Datei sqlda. /* Adresse der Variablen */ short int _sqldafar *sqlind. Was dann mit der Datenbank ausgetauscht wird. $ In der Datenbank-Schnittstellenbibliothek oder DLL gibt es Funktionen. /* Indikatorvariablen-Zeiger */ struct sqlname sqlname. 228 . struct sqlname { short int length. /* Typ der Hostvariablen */ short int sqllen. Die SQLDA-Header-Datei Der Inhalt von sqlda. /* Länge der Hostvariablen */ void _sqldafar *sqldata. }. /* Daten */ }. Die Beschreibung dieser Funktionen finden Sie unter "Referenz der Bibliotheksfunktion" auf Seite 253.h definiert.h" #endif #define SQL_MAX_NAME_LEN #define _sqldafar 30 _sqlfar typedef short int a_SQL_type. Die Struktur tauscht Informationen über Hostvariable und Ergebnisse der SELECT-Anweisung mit der Datenbank aus.h ist der folgende: #ifndef _SQLDA_H_INCLUDED #define _SQLDA_H_INCLUDED #define II_SQLDA #include "sqlca.h" #if defined( _SQL_PACK_STRUCTURES ) #include "pshpk1. struct sqlvar { /* Array der Deskriptoren der Variablen */ short int sqltype.

/* Eye-catcher "SQLDA"*/ a_SQL_int32 sqldabc. /* Länge der sqlda-Struktur*/ short int sqln. von denen jeder eine Hostvariable beschreibt sqldabc sqln sqld sqlvar 229 . Dieses Feld wird in der Regel von der DESCRIBE-Anweisung gesetzt. /* Array der Variablendeskriptoren */ }. Ein Array. SQLDA_NAME. wenn Sie Speicherinhalte untersuchen.Kapitel 6 Programmieren mit Embedded SQL struct sqlda{ unsigned char sqldaid[8]. Dieses Feld unterstützt die Fehlersuche. Eine Ganzzahl (long integer). SQLDA_VARIABLE. /* Anzahl der von DESCRIBE gefundenen Variablen*/ struct sqlvar sqlvar[1]. ( sizeof( struct sqlda ) + \ (n-1) * sizeof( struct sqlvar) ) SQLDA-Felder Die SQLDA-Felder haben folgende Bedeutung: Feld sqldaid Beschreibung Ein 8-Byte-Zeichenfeld. die die Länge der SQLDA-Struktur enthält Die Anzahl der Variablendeskriptoren im Array sqlvar Die Anzahl der gültigen Variablendeskriptoren (die eine Hostvariable beschreiben).precision.h" #endif #endif SQLDA. SQLNAME. /* Deskriptorgröße in Anzahl der Einträge */ short int sqld. das die Zeichenfolge SQLDA zur Identifizierung der SQLDA-Struktur enthält. bestehend aus Deskriptoren vom Typ struct sqlvar. wenn Daten an den Datenbankserver geliefert werden. SQLVAR. #define SCALE(sqllen) ((sqllen)/256) #define PRECISION(sqllen) ((sqllen)&0xff) #define SET_PRECISION_SCALE(sqllen. manchmal auch vom Programmierer.scale) \ sqllen = (scale)*256 + (precision) #define DECIMALSTORAGE(sqllen) (PRECISION(sqllen)/2 + 1) typedef struct sqlda typedef struct sqlvar typedef struct sqlname #ifndef SQLDASIZE #define SQLDASIZE(n) #endif #if defined( _SQL_PACK_STRUCTURES ) #include "poppk.

230 . Gültige Typen. In anderen Worten. Bei LONG VARCHAR. falls der sqldata-Zeiger ein Null-Zeiger ist. $ Informationen über Speicherformate finden Sie unter "Datentypen in Embedded SQL" auf Seite 196. Dieses Feld wird von der DESCRIBE-Anweisung belegt. Sie können dieses Feld mit jedem Typ belegen. hängt von den Informationen zum Typ ab und davon. die von diesem Deskriptor beschrieben wird (siehe "Datentypen in Embedded SQL" auf Seite 196) Das "low order Bit" zeigt an.und LONG BINARY-Datentypen wird das array_len-Feld der DT_LONGBINARY. Für DECIMAL-Typen wird dieses Feld in zwei je 1 Byte lange Felder aufgeteilt. Die Gesamtstellen sind die Gesamtzahl der Ziffern. Das "high byte" repräsentiert die Anzahl der Gesamtstellen und das "low byte" die Anzahl der Dezimalstellen. wie der SQLDA-Bereich verwendet wird. Was der Wert dieser Variable tatsächlich bedeutet. wenn Sie Daten an den Datenbankserver liefern oder Daten vom Datenbankserver abrufen. ♦ sqllen Länge der Variable. ♦ sqldata Ein 4-Byte-Zeiger auf den Speicher. Die Felder der sqlvar-Struktur haben folgende Bedeutung: ♦ sqltype Der Typ der Variable. der von der Variable belegt wird. ob NULL-Werte erlaubt sind. Die Dezimalstellen sind die Anzahl der Ziffern nach dem Dezimalzeichen. die vom Zeiger sqldata zurückgegebene Spalte ist eine entbundene Spalte. Erforderliche Typkonvertierungen erfolgen automatisch. Beim UPDATE. falls der sqldata-Zeiger ein Null-Zeiger ist.Der SQL-Deskriptor-Bereich (SQLDA) SQLDA-Hostvariablen-Beschreibungen Jede sqlvar-Struktur im SQLDA-Bereich beschreibt eine Hostvariable.und Konstantendefinitionen befinden sich in der Header-Datei sqldef. Dieser Speicherinhalt muss den Feldern sqltype und sqllen entsprechen.h. Bei FETCH werden keine Daten zurückgegeben.und DT_LONGVARCHARDatentypstruktur anstelle des sqllen-Felds verwendet. $ Weitere Informationen über das Längenfeld finden Sie unter "SQLDA sqllen-Feldwerte" auf Seite 232.und INSERT-Befehl spielt diese Variable keine Rolle für den Vorgang.

Ein positiver Indikatorwert bedeutet. Ein negativer Indikatorwert zeigt einen NULLWert an.und einen Zeichenpuffer enthält.h. Ein Indikatorwert ist eine Ganzzahl (short int). Handelt es sich um einen DESCRIBE SELECT LIST-Befehl. dann enthält dieses Feld den Langnamen des benutzerdefinierten Datentyps an Stelle der Spalte. dass diese Variable von einer FETCH-Anweisung gekürzt wurde. Sie ist mit einer DESCRIBE-Anweisung belegt und wird nur dafür benutzt. ♦ sqlname Eine VARCHAR-Struktur. Dieses Feld hat verschiedene Bedeutungen für zwei Formate der DESCRIBE-Anweisung: ♦ ♦ Auswahlliste (SELECT LIST) Der Namenpuffer ist belegt mit dem Spaltentitel des entsprechenden Elements in der ausgewählten Liste. wird das Feld auf DT_HAS_USERTYPE_INFO gesetzt. dann enthält dieses Feld den Langnamen des benutzerdefinierten Datentyps statt der Spalte. um Parametertypen anzuzeigen. Weitere Informationen über diese Markierung finden Sie in der Header-Datei sqldef. 231 . In diesem Fall sollten Sie DESCRIBE USER TYPES ausführen. um Informationen über den benutzerdefinierten Datentyp zu erhalten. sind alle vorhandenen Indikatorvariablen mit einer Markierung (flag) belegt. Falls die DESCRIBE-Anweisung darüber hinaus eine DESCRIBE USER TYPES-Anweisung ist. ist das Feld leer. wenn die Datenbankoption CONVERSION_ERROR auf OFF gesetzt ist. ♦ sqlind Ein Zeiger auf den Indikatorwert. $ Weitere Hinweise finden Sie unter "Indikatorvariable" auf Seite 204. Ist der Datentyp benutzerdefiniert. Ist der sqlind-Zeiger ein Null-Zeiger. Bindevariable Der Namenpuffer ist belegt mit dem Namen der Hostvariable. oder mit "?" falls eine namenlose Parametermarkierung verwendet wurde. Ist der Typ ein ein vordefinierter Datentyp. die einen Längen.Kapitel 6 Programmieren mit Embedded SQL Falls die DESCRIBE-Anweisung LONG NAMES benutzt. bevor sie gekürzt wurden. Ist der Typ ein ein vordefinierter Datentyp. ist das Feld leer. Ein Wert von –2 zeigt einen Konvertierungsfehler an. ob das Listenelement aktualisierbar ist. enthält dieses Feld den Langnamen der Ergebnismengen-Spalte. gehört keine Indikatorvariable zu dieser Hostvariable. Das sqlind-Feld wird auch in der DESCRIBE-Anweisung verwendet. die anzeigt. Handelt es sich um eine DESCRIBE USER TYPES-Anweisung. Der Indikatorwert enthält die Länge der Daten. die als Bindevariable benutzt wurde.

oder über Hostvariable. er wird allerdings vom SQL-Präprozessor erzeugt und vollständig belegt. $ Hinweise über sqltype-Feldwerte finden Sie unter "Datentypen in Embedded SQL" auf Seite 196. Im Fall eines benutzerdefinierten Datenbank-Datentyps wird der zu Grunde liegende Datentyp beschrieben. Werte senden Informationen an die Datenbank senden. die zum Speichern von Daten erforderlich sind. Diese Tabellen enthalten die Schnittstellen-Konstantentypen (DT_-Typen). $ Siehe "Werte beschreiben" auf Seite 232.h zu finden sind. Der Datenbankserver wird jede erforderliche Typkonvertierung durchführen. oder es kann andere Typen benutzen. ♦ Werte beschreiben Mit der DESCRIBE-Anweisung erhalten Sie Informationen über die Hostvariablen. die von der Datenbank abgerufen wurden. Werte beschreiben Die folgende Tabelle zeigt die Werte der Strukturelemente sqllen und sqltype. Es sind die Konstanten. Auch in statischem SQL wird ein SQLDA-Bereich verwendet. $ Siehe "Werte abrufen" auf Seite 235. 232 . die DESCRIBE zurückgibt. die der DESCRIBE-Befehl für verschiedene Datenbanktypen zurückgibt (sowohl SELECT LIST als auch BIND VARIABLE DESCRIBEAnweisungen). die das SQLDA-Feld sqltype belegen können. In diesem Fall zeigen die Tabellen die Entsprechungen zwischen den statischen CHostvariablentypen und den Schnittstellenkonstanten. die zum Übergeben von Daten an die Datenbank erforderlich sind. die in der Header-Datei sqldef.Der SQL-Deskriptor-Bereich (SQLDA) SQLDA sqllen-Feldwerte Die Feldlänge sqllen der sqlvar-Struktur in einem SQLDA-Bereich wird in drei verschiedenen Arten von Interaktionen mit dem Datenbankserver verwendet. Diese Interaktionen werden in diesem Abschnitt behandelt. Der Speicherbereich. muss den Feldern sqltype und sqllen entsprechen. Die folgenden Tabellen beschreiben detailliert jede dieser Interaktionen. Ihr Programm kann entweder die Typen und Längen benutzen. $ Siehe "Werte senden" auf Seite 234. ♦ ♦ Werte abrufen Werte von der Datenbank abrufen. auf den das Feld sqldata zeigt.

das low byte auf s 8 4 4 32767 32767 4 2 die Länge der längsten formatierten Zeichenfolge die Länge der längsten formatierten Zeichenfolge 1 8 4 2 n BIGINT BINARY(n) BIT CHAR(n) DATE DECIMAL(p. Datenbank-Feldtyp zurückgegebener Embedded SQL-Typ DT_BIGINT DT_BINARY DT_BIT DT_FIXCHAR DT_DATE von describe zurückgegebene Länge 8 n 1 n die Länge der längsten formatierten Zeichenfolge das high byte des Längenfelds im SQLDA-Bereich auf p setzen.Kapitel 6 Programmieren mit Embedded SQL $ Weitere Hinweise zu Embedded SQL-Datentypen finden Sie unter "Datentypen in Embedded SQL" auf Seite 196.s) DT_DECIMAL DOUBLE FLOAT INT LONG BINARY LONG VARCHAR REAL SMALLINT TIME DT_DOUBLE DT_FLOAT DT_INT DT_LONGBINARY DT_LONGVARCHAR DT_FLOAT DT_SMALLINT DT_TIME TIMESTAMP DT_TIMESTAMP TINYINT UNSIGNED BIGINT UNSIGNED INT UNSIGNED SMALLINT VARCHAR(n) DT_TINYINT DT_UNSBIGINT DT_UNSINT DT_UNSSMALLINT DT_VARCHAR 233 .

Der SQL-Deskriptor-Bereich (SQLDA) Werte senden Die folgende Tabelle zeigt.s) DT_DOUBLE DT_FIXCHAR(n) DT_FLOAT DT_INT DT_LONGBINARY DT_LONGVARCHAR DT_SMALLINT DT_STRING DT_TIME DT_TIMESTAMP DT_TIMESTAMP_STRUCT Programmaktion zur Einstellung der Länge keine Aktion erforderlich die Länge wird einem Feld in der Struktur BINARY entnommen keine Aktion erforderlich Länge durch das abschließende \0 bestimmt das high byte des Längenfelds im SQLDABereich auf p setzen. DT_TIME und DT_TIMESTAMP werden genau so behandelt wie DT_STRING. wie Sie die Länge eines Werts spezifizieren. wenn Informationen an die Datenbank geliefert werden. Siehe "LONG-Daten senden" auf Seite 240 keine Aktion erforderlich Länge durch das abschließende \0 bestimmt Länge durch das abschließende \0 bestimmt Länge durch das abschließende \0 bestimmt keine Aktion erforderlich 234 . das low byte auf s keine Aktion erforderlich das Längenfeld im SQLDA-Bereich bestimmt die Länge der Zeichenfolge keine Aktion erforderlich keine Aktion erforderlich Längenfeld ignoriert. Die Datentypen DT_DATE. In diesem Fall sind nur die in der Tabelle gezeigten Datentypen erlaubt. Der Wert muss eine mit Nullwert abgeschlossene Zeichenfolge in einem passenden Datumsformat sein. wenn Sie im SQLDA-Bereich Daten an den Datenbankserver liefern. Siehe "LONG-Daten senden" auf Seite 240 Längenfeld ignoriert. Embedded SQL-Datentyp DT_BIGINT DT_BINARY(n) DT_BIT DT_DATE DT_DECIMAL(p.

Der Wert wird als Zeichenfolge im aktuellen Datumsformat formatiert. nachdem ein Wert abgerufen wurde? keine Aktion erforderlich das Feld len der Struktur BINARY ist auf die tatsächliche Länge gesetzt keine Aktion erforderlich \0 am Ende der Zeichenfolge keine Aktion erforderlich DT_BIGINT DT_BINARY(n) DT_BIT DT_DATE DT_DECIMAL(p. Embedded SQLDatentyp Auf welchen Wert muss das Programm das Längenfeld setzen. DT_TIME und DT_TIMESTAMP werden genau so behandelt wie DT_STRING. wenn Informationen von der Datenbank abgerufen werden. In diesem Fall sind nur die in der Tabelle gezeigten Datentypen erlaubt.s) DT_DOUBLE DT_FIXCHAR(n) DT_FLOAT keine Aktion erforderlich bis zur Länge des Puffers aufgefüllt mit Leerzeichen keine Aktion erforderlich 235 .Kapitel 6 Programmieren mit Embedded SQL Embedded SQL-Datentyp DT_UNSBIGINT DT_UNSINT DT_UNSSMALLINT DT_VARCHAR(n) DT_VARIABLE Programmaktion zur Einstellung der Länge keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich die Länge wird einem Feld in der Struktur VARCHAR entnommen Länge durch das abschließende \0 bestimmt Werte abrufen Die folgende Tabelle zeigt die Werte des Längenfelds. Das Feld sqllen wird beim Abrufen von Daten nie geändert. wenn Sie Daten von der Datenbank abrufen und den SQLDA-Bereich verwenden. wenn es Daten von der Datenbank abruft? keine Aktion erforderlich Maximale Länge der Struktur BINARY (n+2) keine Aktion erforderlich Länge des Puffers Das "high byte" auf p setzen und das "low byte" auf s keine Aktion erforderlich Länge des Puffers keine Aktion erforderlich Wie gibt die Datenbank Längeninformationen zurück. Die Datentypen DT_DATE.

Siehe "LONG-Daten abrufen" auf Seite 238 Länge-Feld ignoriert. Siehe "LONG-Daten abrufen" auf Seite 238 keine Aktion erforderlich Länge des Puffers Länge des Puffers Länge des Puffers keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich Maximale Länge der Struktur VARCHAR (n+2) Wie gibt die Datenbank Längeninformationen zurück. Siehe "LONG-Daten abrufen" auf Seite 238 keine Aktion erforderlich \0 am Ende der Zeichenfolge \0 am Ende der Zeichenfolge \0 am Ende der Zeichenfolge keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich das Feld len der Struktur VARCHAR ist auf die tatsächliche Länge gesetzt DT_INT DT_LONGBINARY DT_LONGVARCHAR DT_SMALLINT DT_STRING DT_TIME DT_TIMESTAMP DT_TIMESTAMP_ STRUCT DT_UNSBIGINT DT_UNSINT DT_UNSSMALLINT DT_VARCHAR(n) 236 . wenn es Daten von der Datenbank abruft? keine Aktion erforderlich Länge-Feld ignoriert.Der SQL-Deskriptor-Bereich (SQLDA) Embedded SQLDatentyp Auf welchen Wert muss das Programm das Längenfeld setzen. Siehe "LONG-Daten abrufen" auf Seite 238 Länge-Feld ignoriert. nachdem ein Wert abgerufen wurde? keine Aktion erforderlich Länge-Feld ignoriert.

\ a_sql_uint32 untrunc_len.h folgendermaßen definiert: #define DECL_LONGVARCHAR( size ) \ struct { a_sql_uint32 array_len. $ Hinweise über das Abrufen und Senden von Werten finden Sie unter "LONG-Daten abrufen" auf Seite 238 und "LONG-Daten senden" auf Seite 240. char array[size]. Sie können auch die Standard-SQLDA-Felder verwenden. 16-BitWerte sind.Kapitel 6 Programmieren mit Embedded SQL Lange Werte senden und abfragen Die Methode zum Senden und Abrufen von LONG VARCHAR. sqllen. die die Informationen enthalten (sqldata. Verwendung von statischem SQL Es werden separate Struktuten verwendet. gespeicherten und ungekürzten Längen von LONG BINARY. a_sql_uint32 untrunc_len. \ a_sql_uint32 stored_len. } \ \ \ \ \ Verwendung von dynamischem SQL Bei dynamischem SQL ist das Einstellen des sqltype-Felds auf DT_LONGVARCHAR oder DT_LONGBINARY ausreichend.und LONGVARCHAR-Sturkturen sehen folgendermaßen aus: 237 .und LONG BINARY-Werten ist dieselbe wie bei anderen Datentypen. Eine Änderung dieser Werte auf 32-Bit-Werte würde vorhandene Anwendungen zerstören. \ char array[size+1]. Die Methode zur Beschreibung von LONG VARCHAR. um die zugeordneten.\ } #define DECL_LONGBINARY( size ) struct { a_sql_uint32 array_len. sqlind).und LONG BINARY-Werten in Embedded SQL-Anwendungen ist anders als bei den übrigen Datentypen. Die statischen SQL-Datentypen werden in sqlca.und LONG VARCHAR-Datentypen aufzunehmen. allerdings sind diese auf 32-Kbyte-Daten beschränkt. Die zugeordneten LONGBINARY. da die Felder. a_sql_uint32 stored_len.

Lange Werte senden und abfragen typedef struct LONGVARCHAR { a_sql_uint32 array_len. ob Sie statisches oder dynamisches SQL verwenden. Hintergrundinformationen finden Sie unter "Lange Werte senden und abfragen" auf Seite 237. beziehungsweise die positive ungekürzte Länge in Byte bis zu einem Höchstwert von 32767. $ Hinweise darüber. v So rufen Sie einen LONG VARCHAR. LONG-Daten abrufen Dieser Abschnitt beschreibt. Adaptive Server Anywhere stellt die folgenden Informationen ein: ♦ Indikatorvariable Die Indikatorvariable ist negativ. Die Prozeduren unterscheiden sich abhängig davon. wie Sie LONG-Werte aus der Datenbank abrufen.oder DECL_LONGBINARY-Feld enthält die Anzahl von Byte. /* Anzahl der Byte in nicht-gekürztem * Ausdruck(kann höher sein als array_len) */ char array[1]. /* die Daten */ } LONGVARCHAR. /* Anzahl der im Array gespeicherten Byte * (nie höher als array_len) */ a_sql_uint32 untrunc_len. ♦ stored_len Dieses DECL_LONGVARCHAR. Der Wert ist niemals größer als array_len.oder LONG BINARY-Wert ab (statisches SQL): 1 2 Deklarieren Sie eine Hostvariable vom Typ DECL_LONGVARCHAR oder DECL_LONGBINARY. wie Sie diese Funktion in Ihren Anwendungen implementieren. wie erforderlich. finden Sie unter "LONG-Daten abrufen" auf Seite 238 und "LONG-Daten senden" auf Seite 240. GET DATA oder EXECUTE INTO ab. oder 0. $ Weitere Hinweise finden Sie unter "Indikatorvariable" auf Seite 204. die in das Array abgerufen werden. Rufen Sie die Daten mit FETCH. 238 . /* Anzahl der zugeordneten Byte im Array */ a_sql_uint32 stored_len. LONGBINARY. wenn es keine Kürzung gibt. wenn der Wert NULL ist.

Kapitel 6 Programmieren mit Embedded SQL ♦ untrunc_len Dieses DECL_LONGVARCHAR. Er dient nur zur Illustration und ist nicht für eine tatsächliche Verwendung bestimmt. der zum Abrufen von LONG VARCHAR-Daten mittels dynamischem Embedded SQL verwendet wird. ♦ untrunc_len Dieses LONGVARCHAR. die dem ArrayFeld zugeordnet sind. wenn der Datenwert ungekürzt ist. Der folgende Codeabschnitt illustriert den Mechanismus.oder DECL_LONGBINARY-Feld enthält die Anzahl von Byte. Stellen Sie das sqldata-Feld so ein. wenn der Datenwert ungekürzt ist. um n-Byte von Daten im Array-Feld aufzunehmen. dass es auf die LONGVARCHARoder LONGBINARY-Struktur zeigt. Der Wert ist niemals größer als array_len. die vom Datenbankserver gehalten werden.oder LONGBINARY-Struktur auf die Anzahl der Bytes ein. beziehungsweise die positive ungekürzte Länge in Byte bis zu einem Höchstwert von 32767. GET DATA oder EXECUTE INTO ab. wenn der Wert NULL ist. Adaptive Server Anywhere stellt die folgenden Informationen ein: ♦ * sqlind Dieses sqlda-Feld ist negativ. Er wird auch gesetzt. Dieser Wert muss kleiner/gleich dem stored_len-Wert sein. Sie können das LONGVARCHARSIZE( n ). Er wird auch gesetzt.oder LONGBINARY-Struktur auf (dynamisches SQL): 1 2 Stellen Sie das sqltype-Feld auf DT_LONGVARCHAR oder DT_LONGBINARY ein.oder LONGBINARY-Feld enthält die Anzahl von Byte. um die Gesamtanzahl der Bytes zu bestimmen.oder LONGBINARY-Feld enthält die Anzahl von Byte. Dieser Wert muss kleiner/gleich dem stored_len-Wert sein. die in das Array abgerufen werden.oder LONGBINARYSIZE( n )-Makro verwenden. ♦ stored_len Dieses LONGVARCHAR. 4 oder 0. v So nehmen Sie einen Wert in eine LONGVARCHAR. wenn es keine Kürzung gibt. die vom Datenbankserver gehalten werden. die zugeordnet werden müssen. 239 . wie erforderlich. Rufen Sie die Daten mit FETCH. 3 Stellen Sie das array_len-Feld der LONGVARCHAR.

free_sqlda( sqlda ). EXEC SQL PREPARE select_stmt FROM 'SELECT test_var'. longptr->array[0]. 240 . longptr->array[DATA_LEN-1] ). longptr = (LONGVARCHAR *)malloc( LONGVARCHARSIZE( DATA_LEN ) ). if( sqlda == NULL || longptr == NULL ) { fatal_error( "Allocation failed" ). sqlvar->sqltype = DT_LONGVARCHAR. printf( "fetching test_var\n" ). EXEC SQL EXECUTE select_stmt INTO DESCRIPTOR sqlda. wie Sie LONG-Werte an die Datenbank von Embedded SQL-Anwendungen senden. sqlvar->sqldata = longptr. Die Prozeduren unterscheiden sich abhängig davon. ob Sie statisches oder dynamisches SQL verwenden. } LONG-Daten senden Dieser Abschnitt beschreibt.Lange Werte senden und abfragen #define DATA_LEN 128000 void get_test_var() /*****************/ { LONGVARCHAR *longptr. last char: %c\n". 1st char: %c. longptr->stored_len. Hintergrundinformationen finden Sie unter "Lange Werte senden und abfragen" auf Seite 237. // 1 sqlvar verwenden sqlvar = &sqlda->sqlvar[0]. SQLDA *sqlda. } // longptr für Datenaufnahme initialisieren longptr->array_len = DATA_LEN. SQLVAR *sqlvar. // _ // (sqllen wird nicht mit DT_LONG-Typen verwendet) sqlda->sqld = 1. free( longptr ). EXEC SQL DROP STATEMENT select_stmt. printf( "stored_len: %d. longptr->untrunc_len. sqlda = alloc_sqlda( 1 ). untrunc_len: %d.

indem Sie den Corsor öffnen oder die Anweisung ausführen. printf( "Setting test_var to %d a's\n". stellen Sie die Indikatorvariable auf einen negativen Wert ein.oder DECL_LONGBINARY-Struktur auf die Anzahl von Byte der Daten im Array-Feld ein.array.Kapitel 6 Programmieren mit Embedded SQL v So senden Sie einen LONG VARCHAR. DATA_LEN ). Stellen Sie das sqldata-Feld so ein. der zum Senden von LONG VARCHAR-Daten mittels statischem Embedded SQL verwendet wird.array_len DECL_LONGVARCHAR(128000) longdata. Senden Sie die Daten. #define DATA_LEN 12800 EXEC SQL BEGIN DECLARE SECTION.oder LONGBINARY-Struktur (dynamisches SQL): 1 2 3 Stellen Sie das sqltype-Feld auf DT_LONGVARCHAR oder DT_LONGBINARY ein. 3 Stellen Sie das stored_len-Feld der DECL_LONGVARCHAR. Wenn Sie NULL senden.stored_len = DATA_LEN. stellen Sie * sqlind auf einen negativen Wert ein. EXEC SQL END DECLARE SECTION. wie erforderlich.oder LONG BINARY-Wert (statisches SQL): 1 2 Deklarieren Sie eine Hostvariable vom Typ DECL_LONGVARCHAR oder DECL_LONGBINARY. 4 Der folgende Codeabschnitt illustriert den Mechanismus. Wenn Sie NULL senden und eine Indikatorvariable verwenden. // SQLPP initialisiert longdata. $ Weitere Hinweise finden Sie unter "Indikatorvariable" auf Seite 204. EXEC SQL SET test_var = :longdata. 241 . } v So senden Sie einen Wert mittels einer LONGVARCHAR. DATA_LEN ). void set_test_var() /*****************/ { // longdata für das Senden von Daten initialisieren memset( longdata. Er dient nur zur Illustration und ist nicht für eine tatsächliche Verwendung bestimmt. 'a'. dass es auf die LONGVARCHARoder LONGBINARY-Struktur zeigt. wie erforderlich. longdata.

Stellen Sie das stored_len-Feld der LONGVARCHAR. die zugeordnet werden müssen.Lange Werte senden und abfragen Sie können das LONGVARCHARSIZE( n ). um n-Byte von Daten im Array-Feld aufzunehmen. Dieser Wert darf nicht größer als array_len sein.oder LONGBINARYSIZE( n )-Makro verwenden. Senden Sie die Daten.oder LONGBINARY-Struktur auf die Anzahl an Byte der Daten im ArrayFeld ein. indem Sie den Cursor öffnen oder die Anweisung ausführen. 4 Stellen Sie das array_len-Feld der LONGVARCHAR. 5 6 242 . um die Gesamtanzahl an Byte zu bestimmen. die dem ArrayFeld zugeordnet sind.oder LONGBINARY-Struktur auf die Anzahl an Byte ein.

Wenn Sie Werte von Hostvariablen an eine gespeicherte Prozedur weitergeben oder die Ausgabevariable abrufen wollen. CREATE TABLE. END. Sowohl die USING als auch die INTO-Klausel werden in der EXECUTE-Anweisung benutzt. bereiten Sie eine CALL-Anweisung vor und führen Sie sie aus. Eine CREATE PROCEDURE-Anweisung kann wie jede andere Datendefinitions-Anweisung.72 ). double hv_expense. UPDATE account SET balance = balance + amount WHERE name = ’pettycash expense’. um eine gespeicherte Prozedur auszuführen.B. Sie können auch eine CALL-Anweisung einbetten. EXEC SQL BEGIN DECLARE SECTION. EXEC SQL END DECLARE SECTION.2) ) BEGIN UPDATE account SET balance = balance . EXEC SQL CALL pettycash( 10. Das folgende Code-Fragment veranschaulicht die Verwendung von Hostvariablen. Das folgende Code-Fragment veranschaulicht das Erstellen und Ausführen einer gespeicherten Prozedur in Embedded SQL EXEC SQL CREATE PROCEDURE pettycash( IN amount DECIMAL(10. Einfache gespeicherte Prozeduren verwenden Sie können gespeicherte Prozeduren in Embedded SQL erstellen und aufrufen. 243 . double hv_balance.amount WHERE name = ’bank’. z. eingebettet werden.Kapitel 6 Programmieren mit Embedded SQL Gespeicherte Prozeduren verwenden In diesem Abschnitt wird die Verwendung von SQL-Prozeduren in Embedded SQL beschrieben.

2) ) BEGIN UPDATE account SET balance = balance . $ Weitere Hinweise finden Sie unter "EXECUTE-Anweisung [ESQL]" auf Seite 449 der Dokumentation ASA SQL-Referenzhandbuch und "PREPARE-Anweisung [ESQL]" auf Seite 533 der Dokumentation ASA SQL-Referenzhandbuch. ? )’. char hv_name[100]. EXEC SQL PREPARE S1 FROM ’CALL female_employees()’. EXEC SQL PREPARE S1 FROM ’CALL pettycash( ?. END.expense WHERE name = ’bank’. for(. Gespeicherte Prozeduren mit Ergebnismengen Eine Datenbankprozedur kann auch eine SELECT-Anweisung enthalten. EXEC SQL OPEN C1. In einer Prozedur mit Ergebnismenge kann die CALL-Anweisung an Stelle der SELECT-Anweisung in der Cursordeklaration verwendet werden: EXEC SQL BEGIN DECLARE SECTION. Die Spalten einer Ergebnismenge unterscheiden sich von den Ausgabeparametern. Name und Typen der Spalten in der Ergebnismenge zu spezifizieren.2). EXEC SQL END DECLARE SECTION. UPDATE account SET balance = balance + expense WHERE name = ’pettycash expense’. um Anzahl. OUT endbalance DECIMAL(10.. EXEC SQL CREATE PROCEDURE female_employees() RESULT( name char(50) ) BEGIN SELECT emp_fname || emp_lname FROM employee WHERE sex = ’f’. SET endbalance = ( SELECT balance FROM account WHERE name = ’bank’ ). Die Prozedur wird mit einer RESULT-Klausel deklariert.Gespeicherte Prozeduren verwenden // hier Code schreiben EXEC SQL CREATE PROCEDURE pettycash( IN expense DECIMAL(10. EXEC SQL DECLARE C1 CURSOR FOR S1. END.) { 244 . EXEC SQL EXECUTE S1 USING :hv_expense INTO :hv_balance.

hv_name ). Sie können alle Arten des FETCH-Befehls verwenden (rückwärts und vorwärts scrollen) solange Sie sie benötigen. EXEC SQL OPEN C1.) { EXEC SQL FETCH C1 INTO :hv_name. SELECT fname || lname FROM customer. dass es noch einen weiteren Cursor gibt. Um Anweisungen nach dem SELECT auszuführen. Nach der OPEN-Anweisung wird die Prozedur ausgeführt.Kapitel 6 Programmieren mit Embedded SQL EXEC SQL FETCH C1 INTO :hv_name. In diesem Beispiel wurde die Prozedur mit einer OPEN-Anweisung statt einer EXECUTE-Anweisung aufgerufen. Das folgende Beispiel zeigt eine zweifache Auswahlprozedur: EXEC SQL CREATE PROCEDURE people() RESULT( name char(50) ) BEGIN SELECT emp_fname || emp_lname FROM employee. printf( "%s\\n". Die CLOSE-Anweisung beendet die Ausführung der Prozedur. Zu diesem Zeitpunkt ist C1 ein Cursor für die SELECT-Anweisung innerhalb der Datenbankprozedur. END. Der RESUME-Befehl gibt entweder die Warnung SQLE_PROCEDURE_COMPLETE zurück oder SQLE_NOERROR. while( SQLCODE == SQLE_NOERROR ) { for(. bis sie eine SELECT-Anweisung erreicht. Nach der SELECT-Anweisung wird in der Prozedur keine weitere Anweisung ausgeführt.. 245 . if( SQLCODE != SQLE_NOERROR ) break. benutzen Sie den Befehl RESUME Cursorname. printf( "%s\\n". EXEC SQL PREPARE S1 FROM ’CALL people()’. Dynamische Cursor können auch für die CALL-Anweisung verwendet werden. } EXEC SQL RESUME C1. Dynamische Cursor für CALLAnweisungen Diese Beispiele haben statische Cursor verwendet. } EXEC SQL CLOSE C1. hv_name ). $ Eine Beschreibung von dynamischen Cursorn finden Sie unter "Die dynamische SELECT-Anweisung" auf Seite 226. EXEC SQL DECLARE C1 CURSOR FOR S1. und zeigt damit an. if( SQLCODE != SQLE_NOERROR ) break. } EXEC SQL CLOSE C1.

oder OUT-Parameter der Prozedur. die mehrere Ergebnismengen zurückgibt.oder OUT-Parameter an. In RESULT-Spalten von Prozeduren sind beide Bits bereinigt. um zwischen Anweisungen zu unterscheiden. die keine Ergebnismengen haben (müssen EXECUTE benutzen). DESCRIBE OUTPUT erzeugt einen SQLDA-Bereich mit einer Beschreibung für jede Spalte der Ergebnismenge. falls sich die Form der Ergebnismengen ändert. DESCRIBE ALL benutzt die Indikatorvariablen im SQLDA-Bereich.oder INOUT-Parameter der Prozedur. müssen Sie sie nach jeder RESUME-Anweisung neu beschreiben.und RESULT-Parameter. die Ergebnismengen haben (müssen OPEN. 246 . und Anweisungen. CLOSE benutzen). nicht die Anweisung. DESCRIBE ALL DESCRIBE ALL beschreibt IN-. Hat die Prozedur keine Ergebnismenge. um zusätzliche Information zu liefern. INOUT-. Eine DESCRIBE INPUT-Anweisung erzeugt einen SQLDA-Bereich mit einer Beschreibung für jeden IN. um die aktuelle Position des Cursors neu zu beschreiben. wenn eine CALL-Anweisung beschrieben wird. Nach einem Beschreibungs-OUTPUT können diese Bits benutzt werden. OUT. RESUME. enthält der SQLDA-Bereich eine Beschreibung für jeden INOUT. DT_PROCEDURE_IN gibt einen IN.Gespeicherte Prozeduren verwenden Die DESCRIBE-Anweisung funktioniert ohne Einschränkung für Prozeduraufrufe. Mehrfache Ergebnismengen Haben Sie eine Prozedur. $ Eine vollständige Beschreibung finden Sie unter "DESCRIBEAnweisung [ESQL]" auf Seite 426 der Dokumentation ASA SQLReferenzhandbuch. Sie müssen den Cursor beschreiben. Die Bits für DT_PROCEDURE_IN und DT_PROCEDURE_OUT werden in den Indikatorvariablen gesetzt.oder INOUT-Parameter an. FETCH. und DT_PROCEDURE_OUT gibt einen INOUT.

Sie können eine Anwendung aktivieren.ab. während Interactive SQL auf eine Antwort der Datenbank wartet und inzwischen andere Aufgaben ausführt. um festzustellen. indem Sie eine Callback-Funktion zur Verfügung stellen. Zum Beispiel ist bei Interactive SQL das Betriebssystem weiterhin aktiv. Anforderungs-Management implementieren Das voreingestellte Verhalten der Schnittstellen-DLL für Anwendungen beinhaltet es. Sie brauchen nur dann ein Programm zu schreiben. zu warten. 247 . In dieser Callback-Funktion setzen Sie eine weitere Datenbankanforderung .Kapitel 6 Programmieren mit Embedded SQL Programmiertechniken für Embedded SQL ´Dieser Abschnitt enthält eine Reihe von Tipps für Entwickler von Programmen mit Embedded SQL. falls Ihre Sicherungsanforderungen die Leistung des Sicherungsdienstprogramms von Adaptive Server Anywhere übersteigen. Die Funktion db_register_a_callback wird verwendet. ♦ ♦ ♦ "db_register_a_callback-Funktion" auf Seite 261 "db_cancel_request-Funktion" auf Seite 257 "db_is_working-Funktion" auf Seite 260 Sicherungsfunktionen Die Funktion db_backup unterstützt online-Sicherungen in Anwendungen mit Embedded SQL. bis eine Anforderung an die Datenbank ausgeführt wurde und erst dann andere Funktionen auszuführen. Das Sicherungsdienstprogramm setzt diese Funktion ein. Dieses Verhalten können Sie mit Hilfe der Funktionen für die Anforderungsverwaltung ändern. während eine Anforderung an die Datenbank abgearbeitet wird. um die CallbackFunktionen Ihrer Anwendung zu registrieren: $ Weitere Hinweise finden Sie im Folgenden. Sie können die Funktion db_is_working in Ihren Message-Handlers verwenden. das diese Funktion verwendet. ob gerade eine Anforderung an die Datenbank abgearbeitet wird.keine db_cancel_request .

Weitere Hinweise über diese Funktion finden Sie im Abschnitt "DBBackup-Funktion" auf Seite 323. diese Aufgabe über die BACKUP-Anweisung zu auszuführen. einer Anwendung Sicherungsfunktionen hinzuzufügen.Programmiertechniken für Embedded SQL BACKUP-Anweisung wird empfohlen Obwohl diese Funktion ein Möglichkeit bietet. 248 . Weitere Hinweise finden Sie unter "BACKUP-Anweisung" auf Seite 268 der Dokumentation ASA SQL-Referenzhandbuch. $ Sie können mit der Funktion DBBackup der Datenbank-Tools auch direkt auf das Sicherungsdienstprogramm zugreifen. wird empfohlen. $ Weitere Hinweise finden Sie unter "db_backup-Funktion" auf Seite 254.

UltraLite-Projektname Stiller Modus: Keinen Vorspann ausgeben Wieder-eintretender Code Maximale Zeichenfolgenlänge für den Compiler Nicht-konforme SQL-Syntax als Warnung kennzeichnen Mehrbyte-SQL-Zeichenfolgen in Escapesequenzen umwandeln Sortierfolge angeben "Überblick" auf Seite 182 249 .. Syntax sqlpp [ Parameter ] SQL-Dateiname [ Ausgabedateiname ] Parameter –c "Schlüsselwort=Wert.." –d –e Ebene –f -g –h Zeilenbreite –k -m Version –n –o Betriebssys –p Projekt –q –r –s Zeichenfolgenlänge –w Ebene –x –z Sequenz Siehe auch: Beschreibung Referenzparameter für die Datenbankverbindung bereitstellen [UltraLite] Bevorzugte Datengröße Nicht-konforme SQL-Syntax als Fehler kennzeichnen Das Schlüsselwort "far" in erzeugte statische Daten schreiben UltraLite-Warnungen nicht anzeigen Maximale Zeilenlänge der Ausgabe begrenzen Benutzerdeklarationation von SQLCODE einfügen Versionsnamen für generierte Synchronisationsskripten angeben Zeilennummern Ziel-Betriebssystem. das Embedded SQL-Code enthält.Kapitel 6 Programmieren mit Embedded SQL SQL-Präprozessor Der SQL-Präprozessor bearbeitet ein C. bevor der Compiler gestartet wird..oder C++-Programm.

mit Optionen dem Präprozessor bearbeitet werden. erhält die Ausgabedatei standardmäßig die Erweiterung . der in Ausgabedatei gelegt wird. Dies erhöht die Code-Größe.oder C++-Programm. Die erzeugten Synchronisationsskripts können in einer MobiLinkkonsolidierten Datenbank für einfache Synchronisation verwendet werden. die Teil einer UltraLite-Anwendung sind. die nicht Einstiegsebene-SQL/92-Syntax ist i Kennzeichnet Syntax. SQLPP übersetzt die SQL-Anweisungen in Eingabedatei in Quellcode der Sprache C. Der voreingestellte Name für die Ausgabedatei ist der Name der SQL-Datei mit der Erweiterung . die nicht vollständige SQL/92-Syntax ist t Nicht-Standard-Hostvariablentypen markieren u Kennzeichnet Syntax. der die Größe des Datenbereichs reduziert.sqc. –k Teilt dem Präprozessor mit. die nicht von UltraLite unterstützt wird w Lässt die gesamte unterstützte Syntax zu -g Keine Warnungen im Hinblick auf die Erzeugung von UltraLite-Code –h Begrenzt die maximale Länge von Ausgabezeilen durch sqlpp auf Zeilenbreite.c hat. Die Verbindungszeichenfolge muss dem SQL-Präprozessor Zugriff zum Lesen und Ändern Ihrer Referenzdatenbank geben.cc. dass das zu kompilierende Programm eine Benutzerdeklaration von SQLCODE enthält -m Geben Sie den Versionsnamen für die erzeugten Synchronisationsskripts an. –d Code erzeugen. wenn Dateien. als Fehler. das Embedded SQL-Code enthält.SQL-Präprozessor Beschreibung Der SQL-Präprozessor bearbeitet ein C. Die zulässigen Werte von Ebene und ihre Bedeutung sind wie folgt: ♦ ♦ ♦ ♦ ♦ ♦ e Kennzeichnet Syntax.c. Das Fortsetzungszeichen ist ein Rückstrich (\) und der Mindestwert von Zeilenbreite ist zehn. Falls der Name der SQL-Datei bereits die Erweiterung . –e Diese Option kennzeichnet Embedded SQL-Code. die nicht Zwischenebene-SQL/92-Syntax ist f Kennzeichnet Syntax. –c Erforderlich. bevor der Compiler gestartet wird. Datenstrukturen werden vor der Verwendung zur Ausführungszeit wieder benutzt und initialisiert. Die normale Dateinamenerweiterung für Quelldateien mit Embedded SQL ist . 250 . der nicht Teil eines bestimmten Sets von SQL/92 ist.

Wenn Sie die falsche BetriebssystemSpezifikation oder die falsche Bibliothek verwenden. wenn Dateien verarbeitet werden. die der Präprozessor in die C-Datei ausgibt.’b’. lässt diese Option den Compiler Fehler in Zeilennummern in der SQC-Datei protokollieren (der Datei mit Embedded SQL). Diese Option kann nur verwendet werden. wird vom Linker ein Fehler erkannt. Folgende Betriebssysteme werden unterstützt: ♦ ♦ ♦ ♦ WINDOWS Windows 95/98/Me. –q Kein Banner drucken. dass diese Option mit dem Betriebssystem übereinstimmen muss. Mit dieser Option wird die obere Grenze festgesetzt. –w Diese Option kennzeichnet jeden Embedded SQL-Code als Warnung. –o Geben Sie das Ziel-Betriebssystem an. die nicht Einstiegsebene-SQL/92-Syntax ist 251 .Kapitel 6 Programmieren mit Embedded SQL –n Erzeugt Zeilennummerinformationen in der C-Datei. Die meisten CCompiler sind in der Größe der Zeichenfolgenliterale begrenzt. und zwar im Gegensatz zum Protokollieren von Fehlern in Zeilennummern in der C-Datei. zu dem die Embedded SQL-Dateien gehören. sodass Sie bei der Fehlersuche gleichzeitig die SQC-Quelldatei sehen können. die vom SQLPräprozessor erzeugt wird. die Sie handhaben können. werden mit Hilfe einer Liste von Zeichen initialisiert (’a’. –r Weitere Hinweise zum reentrant-Code finden Sie unter "SQLCA- Verwaltung für Code mit mehreren Threads oder "reentrant"-Code" auf Seite 211. Der Standardwert ist 500. Zeichenfolgen. Windows CE WINNT Microsoft Windows NT/2000/XP NETWARE Novell NetWare UNIX UNIX –p Kennzeichnet das UltraLite-Projekt. die Teil einer UltraLite-Anwendung sind. –s Setzt die maximale Größe für Zeichenfolgen fest. Diese umfassen #line-Direktiven an den betreffenden Stellen im erzeugten C-Code. In Ihrem Programm wird eine Referenz auf ein bestimmtes Symbol erzeugt. Ebenso werden die #line-Anweisungen indirekt vom Source Level Debugger verwendet. Die zulässigen Werte von Ebene und ihre Bedeutung sind wie folgt: ♦ e Kennzeichnet Syntax. die länger als dieser Wert sind. Beachten Sie.).’c’ usw. der nicht Teil eines bestimmten Sets von SQL/92 ist. Wenn der von Ihnen verwendete Compiler die Anweisung #line unterstützt. auf dem das Programm ausgeführt werden soll. Dieses Symbol ist in der Schnittstellenbibliothek definiert.

die im Quellcode oder Programm verwendet werden. sodass sie vom Compiler verarbeitet werden können. versucht der Präprozessor.SQL-Präprozessor ♦ ♦ ♦ ♦ ♦ i Kennzeichnet Syntax. die Zeichen zu verstehen. die nicht Zwischenebene-SQL/92-Syntax ist f Kennzeichnet Syntax. geben Sie dbinit –l an der Eingabeaufforderung ein.B. auf Grund des Betriebssystems und der Umgebungsvariablen SQLLOCALE eine geeignete Kollatierung zu ermitteln. Um eine Liste mit den empfohlenen Kollatierungssequenzen zu erhalten. Die Kollatierungssequenz hilft dem Präprozessor. z. –z Mit dieser Option wird die Kollatierungssequenz angegeben. die nicht von UltraLite unterstützt wird w Lässt die gesamte unterstützte Syntax zu –x Ändert Mehrbyte-Zeichenfolgen in Escape-Sequenzen. Wenn -z nicht angegeben wird. bei der Identifizierung von alphabetischen Zeichen. die für die Verwendung in Bezeichnern geeignet sind. 252 . die nicht vollständige SQL/92-Syntax ist t Nicht-Standard-Hostvariablentypen markieren u Kennzeichnet Syntax.

Zusätzlich zu den vom SQL-Präprozessor erzeugten Funktionsaufrufen wird dem Benutzer eine Gruppe von Bibliotheksfunktionen zur Verfügung gestellt. die Indikatorzeiger werden auf diesen Speicherplatz gesetzt und der Indikatorwert wird mit 0 (Null) initialisiert. Dieser Abschnitt enthält eine Referenzbeschreibung der verschiedenen Funktionen. falls kein Speicher zugewiesen werden konnte. Das Feld sqln des SQLDA-Bereichs wird mit der numvar initialisiert. alloc_sqlda_noind-Funktion Prototyp Beschreibung SQLDA *alloc_sqlda_noind( unsigned numvar ). Sie können die Eintrittspunkte auf portierbare Weise unter Verwendung von _esqlentry_ deklarieren. Den Indikatorvariablen wird Speicherplatz zugewiesen. dass Sie diese Funktion an Stelle der Funktion alloc_sqlda_noind verwenden. Diese Funktion weist einen SQLDA-Bereich mit Deskriptoren für die numvar zu. falls kein Speicher zugewiesen werden konnte. Prototypen dieser Funktionen werden durch den Befehl EXEC SQL INCLUDE SQLCA eingefügt. Das Feld sqln des SQLDA-Bereichs wird mit der numvar initialisiert. Diese Funktion weist einen SQLDA-Bereich mit Deskriptoren für die numvar zu.Kapitel 6 Programmieren mit Embedded SQL Referenz der Bibliotheksfunktion Der SQL-Präprozessor erzeugt Funktionsaufrufe in der Schnittstellenbibliothek oder DLL. Es wird in den Wert __stdcall aufgelöst: alloc_sqlda-Funktion Prototyp Beschreibung SQLDA *alloc_sqlda( unsigned numvar ). die Indikatorzeiger werden auf den Null-Zeiger gesetzt. was in sqlca. DLL-Eintrittspunkte Die DLL-Eintrittspunkte sind gleich. dass die Prototypen einen für DLLs passenden Zusatz haben. abgesehen davon. mit denen Datenbankvorgänge leichter ausgeführt werden können. 253 . geordnet nach Kategorien. Ein Null-Zeiger wird zurückgegeben. Den Indikatorvariablen wird kein Speicherplatz zugewiesen. Ein Null-Zeiger wird zurückgegeben.h definiert ist. Es wird empfohlen.

Andernfalls enthält SQLCOUNT die Anzahl der Seiten in der Datei. 254 . bevor eine Sicherung beginnen kann. bis die Sicherung vollständig ist (db_backup wird mit dem Wert op für DB_BACKUP_END aufgerufen). Gültige Dateinummern sind 0 (Null) bis DB_BACKUP_MAX_FILE für die Stamm-Datenbankdateien. ZugriffsBerechtigung Um die Sicherungsfunktionen benutzen zu können. BACKUP-Anweisung wird empfohlen Beschreibung Obwohl diese Funktion ein Möglichkeit bietet.Referenz der Bibliotheksfunktion db_backup-Funktion Prototyp void db_backup( SQLCA * sqlca. Datenbank-Checkpoints sind deaktiviert. SQLDA * sqlda). Zu einem Zeitpunkt kann immer nur eine Sicherung auf einem gegebenen Datenbankserver laufen. hängt vom Wert des Parameters op ab: ♦ DB_BACKUP_START Muß aufgerufen werden. sodass Seiten der angegebenen Datei mit DB_BACKUP_READ_PAGE gesichert werden können. int op. ♦ DB_BACKUP_OPEN_FILE Öffnet die mit file_num angegebene Datenbankdatei. unsigned long page_num. wird SQLCODE mit SQLE_NOTFOUND belegt. zu der die Datenbankdatei erstellt wurde. wird der SQLCODE mit SQLE_BACKUP_NOT_STARTED belegt. müssen Sie mit einer Benutzer-ID mit DBA-Berechtigung oder mit REMOTE DBA-Berechtigung (SQL Remote) verbunden sein. page_num und sqlda werden nicht beachtet. der die Zeit angibt. wird empfohlen. Falls die angegebene Datei nicht existiert. falls sie existiert. einer Anwendung Sicherungsfunktionen hinzuzufügen. Andernfalls wird das Feld SQLCOUNT des sqlca mit der Größe der Datenbankseiten belegt. int file_num. Welche Aktion ausgeführt wird. DB_BACKUP_TRANS_LOG_FILE für die Transaktionslogdatei und DB_BACKUP_WRITE_FILE für die Datenbank-Write-Datei. diese Aufgabe über die BACKUP-Anweisung zu auszuführen. (Sicherungen werden Seite für Seite durchgeführt.) Die Parameter file_num. SQLIOESTIMATE enthält einen 32-Bit-Wert (POSIX time_t). Kann die Sicherung nicht starten. Weitere Hinweise finden Sie unter "BACKUP-Anweisung" auf Seite 268 der Dokumentation ASA SQL-Referenzhandbuch. der Name der Betriebssystemdatei befindet sich im Feld sqlerrmc des SQLCABereichs.

page_num sollte einen Wert von 0 bis 1 weniger als die Seitenanzahl haben. 255 . Fahren Sie mit dem Lesen der Seiten fort.Kapitel 6 Programmieren mit Embedded SQL Die Parameter page_num und sqlda werden nicht beachtet. die auf einen Puffer zeigt. Die Fehlermeldung SQLE_BACKUP_CANNOT_RENAME_LOG_YET kann mehrere Male und für mehrere Seiten auftreten. das Log zu diesem Zeitpunkt umzubenennen (z.x oder älter unvollständige Transaktionen auftreten) tritt der Fehler SQLE_BACKUP_CANNOT_RENAME_LOG_YET auf. Die Daten in DT_BINARY enthalten eine 2 Byte lange Längenangabe. die mit file_num angegeben wird. wie sie im Feld SQLCOUNT beim Aufruf von db_backup mit dem Vorgang DB_BACKUP_START zurückgegeben werden. Andernfalls wird SQLCODE mit SQLE_NOTFOUND belegt. um Binärdaten in der Größe zu speichern. bis Sie den Zustand SQLE_NOTFOUND erhalten. Der Name der alten Transaktiondatei wird im Feld sqlerrmc des SQLCABereichs zurückgegeben. Erhalten Sie die Bedingung SQLE_NOTFOUND. wurde das Transaktionslog erfolgreich gesichert und die Datei umbenannt. der Datenbankserver das bestehende Transaktionslog umbenennt und ein ein neues startet Falls der Datenbankserver nicht in der Lage ist. In Ihrer Wiederholungsschleife sollten Sie eine Verzögerung einbauen. aber es bleibt der Anwendung überlassen. sondern erneuern Sie die Anforderung. bis Sie SQLE_NOERROR erhalten und schreiben Sie dann die Seite. Die Anwendung muss den Puffer speichern Dieser Aufruf erzeugt eine der angegebenen Datenbankseiten im Puffer. den Pufferinhalt auf einem Sicherungsdatenträger zu speichern. gefolgt von den eigentlichen Binärdaten. ♦ DB_BACKUP_READ_PAGE Eine Seite der Datenbankdatei lesen.B. sodass der Puffer mindestens 2 Byte länger sein muss als die Seitengröße. die von einem erfolgreichen Aufruf von db_backup mit dem Vorgang DB_BACKUP_OPEN_FILE in SQLCOUNT zurückgegeben wurde. um den Server nicht mit zu vielen Anforderungen zu verlangsamen. Der sqlda-Deskriptor sollte mit einer Variablen vom Typ DT_BINARY eingerichtet werden. In diesem Fall benutzen Sie nicht die zurückgegebene Seite. außer dass nach der letzten Seite das Transaktionslog zurückgegeben wurde. können in Datenbanken der Version 7. Der Puffer sollte groß genug sein. ♦ DB_BACKUP_READ_RENAME_LOG Die gleiche Aktion wie bei DB_BACKUP_READ_PAGE.

. file_num . page_num und sqlda werden nicht beachtet. aber der Wert von SQLCODE ist SQLE_NOERROR. Ist dieser Wert größer als 0 (Null).sqldata = allocated buffer for file_num = 0 to DB_BACKUP_MAX_FILE db_backup( . Die Parameter file_num.. Falls Sie das tun. file_num . bevor die letzte beendet wurde. DB_BACKUP_CLOSE_FILE. erhalten Sie eine zweite Kopie Ihrer gesicherten Logdatei und SQLE_NOTFOUND. ♦ DB_BACKUP_END Muß beim Beenden der Sicherung aufgerufen werden.1 db_backup( .Referenz der Bibliotheksfunktion Den Wert von sqlda->sqlvar[0]. DB_BACKUP_START .sqlind sollten Sie überprüfen. sqlda ) write page buffer out to backup file next page_num close backup file db_backup( . um die mit file_num angegebene Datenbankdatei zu schließen.. ♦ DB_BACKUP_CLOSE_FILE Muss aufgerufen werden. page_num.. dass es sich nicht um C-Code handelt. wenn die Bearbeitung einer Datei abgeschlossen ist. nachdem Sie db_backup aufgerufen haben. DB_BACKUP_OPEN_FILE. Checkpoints werden wieder aktiviert.sqlerrmc.. und dass keine Fehlerüberprüfung enthalten ist... ) if SQLCODE == SQLE_NO_ERROR /* Datei vorhanden */ num_pages = SQLCOUNT file_time = SQLE_IO_ESTIMATE open backup file with name from sqlca. file_num. außer Sie möchten Dateien schließen und die Sicherung beenden. Die Parameter page_num und sqlda werden nicht beachtet. ) allocate page buffer based on page size in SQLCODE sqlda = alloc_sqlda( 1 ) sqlda->sqld = 1. DB_BACKUP_READ_PAGE. sqlda->sqlvar[0].sqlerrmc for page_num = 0 to num_pages . db_backup( .. Beachten Sie.. Danach sollten Sie db_backup nicht nochmals aufrufen...sqltype = DT_BINARY sqlda->sqlvar[0]. Das Programm dbbackup verwendet folgenden Algorithmus. Der neue Name befindet sich nach wie vor in sqlca. Keine andere Sicherung kann beginnen... ) end if next file_num backup up file DB_BACKUP_WRITE_FILE as above backup up file DB_BACKUP_TRANS_LOG_FILE as above free page buffer 256 . wurde die letzte Logseite geschrieben und die Logdatei wurde umbenannt..

dass die Anforderung abgebrochen wurde. Wenn Sie eine Anforderung abbrechen. Sie überprüft. ZugriffsBerechtigung Um die Sicherungsfunktionen benutzen zu können. ) db_cancel_request-Funktion Prototyp Beschreibung int db_cancel_request( SQLCA *sqlca ). um das alte Transaktionslog zu löschen. char * filename ).. wurde die Abbruchsanforderung gesendet. weil sie einen SQLCA-Bereich benutzen. Beschreibung 257 . Die Funktion db_delete_file fordert vom Datenbankserver das Löschen der Datei namens filename an. die eine Cursoroperation durchführt. müssen Sie mit einer Benutzer-ID mit DBA-Berechtigung oder mit REMOTE DBA-Berechtigung (SQL Remote) verbunden sein. DB_BACKUP_END . obwohl die Funktion weiterhin TRUE zurückgibt.. In diesen Fällen findet einfach kein Abbruch statt.. db_delete_file-Funktion Prototyp void db_delete_file( SQLCA * sqlca. der schon von einer anderen Anforderung verwendet werden könnte. ist die Position des Cursors unbestimmt. Wenn die Funktion 1 zurückgibt. Diese Funktion kann nach dem Sichern und Umbenennen des Transaktionslogs verwendet werden (siehe oben. Sie müssen den Cursor entweder mit seiner absoluten Position festlegen oder ihn nach dem Abbrechen schließen. ob die Anforderung an den Datenbankserver aktiv ist.Kapitel 6 Programmieren mit Embedded SQL db_backup( . Die Funktion db_cancel_request kann asynchron aufgerufen werden. wurde keine Anforderung gesendet. Ein Rückgabewert ungleich 0 bedeutet nicht. wenn sich die Abbruchsanforderung und die Antwort von der Datenbank oder vom Server überschneiden. Diese und die Funktion db_is_working sind die einzigen Funktionen in der Schnittstellenbibliothek der Datenbank. Diese Funktion bricht die gerade aktive Anforderung an den Datenbankserver ab. DB_BACKUP_READ_RENAME_LOG in "db_backup-Funktion" auf Seite 254). die asynchron aufgerufen werden können. Sie müssen mit einer Benutzer-ID mit DBA-Berechtigung verbunden sein. Es gibt einige kritische zeitliche Überschneidungen. wenn sie 0 zurückgibt. bevor sie die Abbruchsanforderung sendet..

db_fini-Funktion Prototyp Beschreibung unsigned short db_fini( *sqlca ). Wenn während der Verarbeitung ein Fehler auftritt. a_db_property property. dass der angegebene Server gerade läuft.h definiert Konstanten für diese Informationen. wird der Fehlercode in SQLCA eingestellt und die Funktion gibt 0 zurück. ist der Rückgabewert 0 (Null). Ein Rückgabewert ungleich 0 bedeutet. char *name ). gibt die Funktion Information über die voreingestellte Datenbank zurück. Jedes Bit des Rückgabewert enthält eine spezifische Information. wird ein Nicht-Nullwert zurückgegeben. 258 . int value_buffer_size ). kann das den Datenbankserver und den NetWare-Dateiserver zum Absturz bringen. die von der Datenbankschnittstelle benutzt wurden. Nachdem Sie db_fini aufgerufen haben. Siehe auch: Hinweise über die Verwendung von db_fini in UltraLite-Anwendungen finden Sie unter "db_fini-Funktion" auf Seite 247 der Dokumentation UltraLite Benutzerhandbuch. char * value_buffer. die Statusinformationen über den Datenbankserver namens name anzeigt. Die Header-Datei sqldef. db_get_property-Funktion Prototyp unsigned int db_get_property( SQLCA * sqlca. Falls ein Null-Zeiger für name angegeben wird. Vorsicht Wird unter NetWare nicht db_fini für jedes db_init aufgerufen.Referenz der Bibliotheksfunktion db_find_engine-Funktion Prototyp unsigned short db_find_engine( SQLCA *sqlca. Beschreibung Diese Funktion gibt eine kurze Ganzzahl ohne Vorzeichen zurück. Diese Funktion gibt Ressourcen frei. Falls kein Server mit dem angegebenen Namen gefunden werden kann. Sie müssen db_fini einmal für jeden benutzten SQLCA-Bereich aufrufen. sind keine weiteren Bibliotheksaufrufe und keine weiteren Embedded SQL-Befehle erlaubt. Wenn es keine Fehler gegeben hat.

werden bei diesem Aufruf zugewiesen und initialisiert. Gemeinsamer Speicher und NamedPipes-Protokolle geben immer die leere Zeichenfolge für die Adresse zurück. einschließlich des abschließenden Nullzeichens. zu denen derzeit eine Verbindung besteht.und SPX-Protokolle geben nicht-leere Zeichenfolgeadressen zurück. Es gelten die folgenden Argumente: ♦ a_db_property Ein enum mit dem Wert DB_PROP_SERVER_ADDRESS. TCP/IP. werden sie im SQLCABereich zurückgegeben und der Rückgabewert ist 0 (Null). Diese Funktion initialisiert die Schnittstellenbibliothek der Datenbank. Diese Funktion muss aufgerufen werden. Falls während der Prozessverarbeitung Fehler auftreten. Sie wird vom Dienstprogramm dbping verwendet. Die Ressourcen. Datenbankeigenschaften können auch auf eine schnittstellenunabhängige Weise abgerufen werden. um die Serveradresse auszudrucken. ist der Rückgabewert ungleich 0 (Null) und Sie können beginnen. nämlich durch Ausführen einer SELECT-Anweisung. value_buffer_size Die maximale Länge der Zeichenfolge value_buffer. bevor ein anderer Bibliotheksaufruf erfolgen kann und bevor ein Embedded SQL-Befehl ausgeführt wird. value_buffer Dieses Argument wird mit dem Eigenschaftswert als ♦ ♦ Siehe auch: Zeichenfolge mit einer abschließenden Null gefüllt. "Eigenschaften von Datenbanken" auf Seite 690 der Dokumentation ASA Datenbankadministration db_init-Funktion Prototyp Beschreibung unsigned short db_init( SQLCA *sqlca ).Kapitel 6 Programmieren mit Embedded SQL Beschreibung Diese Funktion wird verwendet. Die Funktion kann auch benutzt werden. um die Adressen der Server zu erhalten. um den Wert der Datenbankeigenschaften zu erhalten. siehe "Eigenschaften von Datenbanken" auf Seite 690 der Dokumentation ASA Datenbankadministration. 259 . DB_PROP_SERVER_ADDRESS ruft die Servernetzwerkadresse der derzeitigen Verbindung als ausdruckbare Zeichenfolge zurück. Embedded SQL-Befehle und -Funktionen zu benutzen. Treten keine Fehler auf. Geben Sie mit db_fini am Ende Ihres Programms die Ressourcen frei. die die Schnittstellenbibliothek für Ihr Programm braucht.

SQL_CALLBACK_PARM callback_address. Die Callback-Funktion muss folgende Syntax haben: 260 . $ Weitere Hinweise finden Sie unter "SQLCA-Verwaltung für Code mit mehreren Threads oder "reentrant"-Code" auf Seite 211. die den angegebenen sqlca benutzt. Siehe auch: Hinweise über die Verwendung von db_init in UltraLite-Anwendungen finden Sie unter "db_init-Funktion" auf Seite 247 der Dokumentation UltraLite Benutzerhandbuch. void *callback_user_data ). db_locate_servers-Funktion Prototyp unsigned int db_locate_servers( SQLCA *sqlca. der schon von einer anderen Anforderung verwendet werden könnte. Diese Funktion kann asynchron aufgerufen werden. die in der Header-Datei sqlca. Diese Funktion gibt 1 zurück.Referenz der Bibliotheksfunktion In den meisten Fällen sollte diese Funktion nur einmal aufgerufen werden. falls eine Datenbankanforderung Ihrer Anwendung läuft. um die Adresse der globalen Variable sqlca weiterzugeben.h definiert ist. rufen Sie db_init einmal für jeden SQLCA-Bereich auf. Falls Sie mit Embedded SQL eine DLL oder eine Anwendung schreiben. Diese und die Funktion db_cancel_request sind die einzigen Funktionen in der Schnittstellenbibliothek der Datenbank. die asynchron aufgerufen werden können. Vorsicht Wenn Sie unter NetWare db_fini nicht für jedes db_init aufrufen. kann dies einen Absturz des Datenbankservers und des NetWare-Dateiservers verursachen. db_is_working-Funktion Prototyp Beschreibung unsigned db_is_working( SQLCA *sqlca ). Beschreibung Bietet Zugriff auf die vom Befehlszeilen-Dienstprogramm dblocate angezeigten Daten und listet alle Adaptive Server AnywhereDatenbankserver mit TCP/IP-Anschluss im lokalen Netzwerk auf. die mehrfache Threads hat. Sie gibt 0 (Null) zurück. falls keine Anwendung läuft. der benutzt wird. weil sie einen SQLCA-Bereich benutzen. die den angegebenen sqlca benutzt.

übergeben Sie einen Null-Zeiger als callback-Funktion. die der Server abhört name Zeigt auf einen Puffer. a_server_address wird mit folgender Definition in sqlca. Die Callback-Funktion wird für jeden gefundenen Server ausgeführt.h festgelegt: typedef struct a_server_address { a_SQL_uint32 port_type.Kapitel 6 Programmieren mit Embedded SQL int (*)( SQLCA *sqlca. } a_server_address. Ihre Anwendung ist blockiert. a_db_callback_index index. Um einen Callback zu löschen. a_server_address *server_addr. ♦ ♦ ♦ ♦ port_type Ist hier immer PORT_TYPE_TCP (laut Definition 6 in sqlca. stoppt db_locate_servers die Suche nach Servern.h) port_num Ist die TCP-Portnummer. char *name. der die IP-Adresse des Servers enthält $ Weitere Hinweise finden Sie unter "Das ServerpositionDienstprogramm" auf Seite 554 der Dokumentation ASA Datenbankadministration. 261 . Die an die Callback-Funktion übergebenen Parameter sqlca und callback_user_data sind dieselben Parameter. Der zweite Parameter ist ein Zeiger auf eine a_server_address-Struktur. db_register_a_callback-Funktion Prototyp void db_register_a_callback( SQLCA *sqlca. der den Servernamen enthält address Zeigt auf einen Puffer. ist die voreingestellte Reaktion. a_SQL_uint32 port_num. die an db_locate_servers übergeben werden. nichts zu tun. wartet auf die Antwort von der Datenbank und Windows zeigt den Cursor als Sanduhr an. void *callback_user_data ). char *address. Wenn die Callback-Funktion den Wert 0 zurückgibt. Beschreibung Diese Funktion registriert Callback-Funktionen: Falls Sie keine Callback-Funktion DB_CALLBACK_WAIT registrieren. ( SQL_CALLBACK_PARM ) callback ).

char *conn_name ). wenn der Datenbankserver im Begriff ist. Diese Funktion wird aufgerufen. Diese Funktion wird wiederholt von der Schnittstellenbibliothek aufgerufen. ♦ DB_CALLBACK_START Der Callback-Prototyp sieht wie folgt aus: void SQL_CALLBACK start_callback( SQLCA *sqlca ). Der Prototyp der Callback-Funktion lautet folgendermaßen: void SQL_CALLBACK debug_message_callback( SQLCA *sqlca. ♦ DB_CALLBACK_FINISH Der Callback-Prototyp sieht wie folgt aus: void SQL_CALLBACK finish_callback( SQLCA * sqlca ). ♦ DB_CALLBACK_WAIT Der Callback-Prototyp sieht wie folgt aus: void SQL_CALLBACK wait_callback( SQLCA *sqlca ). Die Zeichenfolge enthält gewöhnlich eine Zeilenendmarke (\n) unmittelbar vor dem beendenden Nullwertzeichen. nachdem die Antwort auf eine Datenbankanforderung von der Schnittstellen-DLL empfangen wurde. hat sie den Wert NULL. sodass Sie zwischen den Verbindungen unterscheiden können. Diese Funktion wird unmittelbar vor dem Absenden einer Datenbankanforderung an den Server aufgerufen. Ihr wird eine auf Null endende Zeichenfolge übergeben. So würden Sie diesen Callback registrieren: 262 . Wenn die Verbindung nicht benannt war. die den Text der Debug-Meldung enthält. von einer DROP CONNECTION-Anweisung oder weil der Server heruntergefahren wird. Der Verbindungsname conn_name wird übergeben. während der Datenbankserver oder die Clientbibliothek mit dem Abarbeiten Ihrer Datenbankanforderung beschäftigt sind. die Verbindung aufgrund einer Zeitüberschreitung zu verlieren. char * message_string ).Referenz der Bibliotheksfunktion Die folgenden Werte sind für den Parameter index erlaubt: ♦ DB_CALLBACK_DEBUG_MESSAGE Die bereitgestellte Funktion wird für jede Fehlersuchmeldung einmal aufgerufen. DB_CALLBACK_START wird nur unter Windows verwendet. DB_CALLBACK_FINISH wird nur unter Windows-Betriebssystemen verwendet. Diese Funktion wird aufgerufen. ♦ DB_CALLBACK_CONN_DROPPED Die Syntax sieht wie folgt aus: void SQL_CALLBACK conn_dropped_callback ( SQLCA *sqlca.

♦ DB_CALLBACK_MESSAGE Diese Funktion ermöglicht es der Anwendung.h definiert. an_SQL_code code.DBF=c:\\db\\MeineDatenbank. wie lang die Nachricht ist. Wenn eine Anwendung diese Callback-Funktion nicht registriert.Kapitel 6 Programmieren mit Embedded SQL db_register_a_callback( &sqlca. unsigned length. Das Längen-Feld gibt an. Das code-Feld ist ein Identifizierer. sqlca Ein Zeiger auf eine SQLCA-Struktur. unsigned short msg_type. wie wichtig die Nachricht ist und mehrere unterschiedliche Nachrichtentypen können unterschiedlich behandelt werden. und zwar in der Form STICHWORT=Wert. Die Meldung ist nicht mit Nullwert abgeschlossen. Zusätzlich werden Nachrichten vom Typ MESSAGE_TYPE_WARNING und MESSAGE_TYPE_ACTION betriebssystemabhängig auffälliger dargestellt. MESSAGE_TYPE_ACTION und MESSAGE_TYPE_STATUS. gibt es eine Standard-Callback-Funktion. Hinweise dazu finden Sie unter "SQL-Kommunikationsbereich (SQLCA)" auf Seite 208. Zum Beispiel: "UID=DBA. char * parms ). während sie eine Anforderung abarbeitet. char* msg ). Der msg_type-Parameter gibt an. Diese Konstanten sind in sqldef. die eine Semikolon-getrennte Liste mit Parametereinstellungen enhält. db_start_database-Funktion Prototyp Argumente unsigned int db_start_database( SQLCA * sqlca.PWD=SQL. Der Callback-Prototyp sieht wie folgt aus: void SQL_CALLBACK message_callback( SQLCA* sqlca. Zum Beispiel zeigt die Interactive SQL Callback-Funktion STATUSund INFO-Nachrichten in einem Nachrichtenfenster an. während Nachrichten vom Typ ACTION und WARNING in einem Dialogfenster erscheinen. Nachrichten vom Server zu verarbeiten. DBCALLBACK_WAIT. MESSAGE_TYPE_WARNING. parms Eine auf NULL endende Zeichenfolge. die alle Nachrichten in die Serverlogdatei schreibt (wenn der Debug-Modus eingestellt und eine Logdatei angegeben ist). (SQL_CALLBACK_PARM)&db_wait_request ). Die möglichen Nachrichtentypen sind MESSAGE_TYPE_INFO.db" 263 .

Beschreibung Mit dieser Funktion wird der Datenbankserver gestartet. db_start_engine-Funktion Prototyp Argumente unsigned int db_start_engine( SQLCA * sqlca. char * parms ).Referenz der Bibliotheksfunktion $ Eine Liste der Verbindungsparameter finden Sie unter "Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration. falls die Datenbank nicht bereits läuft. Der Rückgabewert ist wahr. Zum Beispiel: "UID=DBA. die diese Funktion ausführt. und zwar in der Form STICHWORT=Wert. Beschreibung Diese Funktion startet eine Datenbank auf einem vorhandenen Server. $ Die Berechtigung zum Starten und Stoppen einer Datenbank wird in der Serverbefehlszeile gesetzt. falls er nicht bereits läuft. Informationen über Fehler werden im SQLCABereich zurückgegeben.PWD=SQL. Falls eine Benutzer-ID und ein Kennwort in den Parametern übergeben wurden. sqlca Ein Zeiger auf eine SQLCA-Struktur. Hinweise dazu finden Sie unter "SQL-Kommunikationsbereich (SQLCA)" auf Seite 208. Die Schritte. sind dieselben. Weitere Hinweise finden Sie unter "Der Datenbankserver" auf Seite 134 der Dokumentation ASA Datenbankadministration. falls die Datenbank bereits lief oder erfolgreich gestartet werden konnte. parms Eine auf NULL endende Zeichenfolge. die zum Starten einer Datenbank ausgeführt werden. Der Rückgabewert ist gültig. Die Schritte. Informationen über Fehler werden im SQLCA-Bereich zurückgegeben. 264 . die eine durch Semikolons getrennte Liste mit Parametereinstellungen enhält. wie sie unter "Personal Server starten" auf Seite 88 der Dokumentation ASA Datenbankadministration beschrieben sind.DBF=c:\\db\\MeineDatenbank. sind unter "Personal Server starten" auf Seite 88 der Dokumentation ASA Datenbankadministration beschrieben.db" $ Eine Liste der Verbindungsparameter finden Sie unter "Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration. werden sie ignoriert. falls der Datenbankserver gefunden wurde oder falls er erfolgreich gestartet werden konnte.

Kapitel 6 Programmieren mit Embedded SQL
Der folgende Aufruf von db_start_engine startet den Datenbankserver und nennt ihn asademo, er lädt nicht die Datenbank, trotz des DBFVerbindungsparameters:
db_start_engine( &sqlca, "DBF=c:\\asa8\\asademo.db; Start=dbeng8" );

Falls Sie nach dem Server auch eine Datenbank starten wollen, fügen Sie die Datenbankdatei in den Verbindungsparameter START ein:
db_start_engine( &sqlca,"ENG=eng_name;START=dbeng8 c:\\asa\\asademo.db" );

Dieser Aufruf startet den Server, nennt ihn eng_name und startet die Datenbank asademo auf diesem Server. Die Funktion db_start_engine versucht, eine Verbindung zu einem Server herzustellen, bevor einer gestartet wird, um zu verhindern, dass ein Server gestartet wird, der bereits läuft. Der Verbindungsparameter FORCESTART wird nur von der Funktion db_start_engine verwendet. Wenn er auf YES gesetzt wird, wird nicht versucht, eine Verbindung zu einem Server herzustellen, bevor einer gestartet wird. Dadurch kann das folgende Befehlspaar wie erwartet arbeiten: 1 2 Starten eines Datenbankservers mit dem Namen server_1:
start dbeng8 -n server_1 asademo.db

Der Start eines neuen Servers wird erzwungen und es wird eine Verbindung zu ihm hergestellt:

db_start_engine( &sqlda, "START=dbeng8 -n server_2 asademo.db;ForceStart=YES" )

Wenn FORCESTART nicht oder ohne ENG-Parameter verwendet wurde, hätte der zweite Befehl versucht, eine Verbindung zu server_1 herzustellen. Der Servername wird von der Funktion db_start_engine nicht vom Parameter des START-Parameters ermittelt.

db_stop_database-Funktion
Prototyp Argumente unsigned int db_stop_database( SQLCA * sqlca, char * parms );

sqlca Ein Zeiger auf eine SQLCA-Struktur. Hinweise dazu finden Sie unter

"SQL-Kommunikationsbereich (SQLCA)" auf Seite 208.
parms Eine auf NULL endende Zeichenfolge, die eine durch Semikolons

getrennte Liste mit Parametereinstellungen enhält, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"

265

Referenz der Bibliotheksfunktion

$ Eine Liste der Verbindungsparameter finden Sie unter
"Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration.
Beschreibung

Diese Funktion beendet die Datenbank namens DatabaseName auf dem Server namens EngineName. Falls der EngineName nicht angegeben ist, bezieht sich die Funktion auf den voreingestellten Server. Als Voreinstellung beendet diese Funktion eine Datenbank nicht, solange noch eine Verbindung zu dieser Datenbank offen ist. Falls Unconditional mit yes belegt ist, wird die Datenbank beendet, auch wenn noch Verbindungen offen sind. Ist der Rückgabewert TRUE, sind keine Fehler aufgetreten.

$ Die Berechtigung zum Starten und Stoppen einer Datenbank wird in der
Serverbefehlszeile gesetzt. Weitere Hinweise finden Sie unter "Der Datenbankserver" auf Seite 134 der Dokumentation ASA Datenbankadministration.

db_stop_engine-Funktion
Prototyp Argumente unsigned int db_stop_engine( SQLCA * sqlca, char * parms );

sqlca Ein Zeiger auf eine SQLCA-Struktur. Hinweise dazu finden Sie unter

"SQL-Kommunikationsbereich (SQLCA)" auf Seite 208.
parms Eine auf NULL endende Zeichenfolge, die eine durch Semikolons

getrennte Liste mit Parametereinstellungen enhält, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"

$ Eine Liste der Verbindungsparameter finden Sie unter
"Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration.
Beschreibung

Diese Funktion fährt den Datenbankserver herunter. Folgende Schritte werden von dieser Funktion ausgeführt: ♦ Sie sucht den Datenbankserver, dessen Name dem Wert des Parameters EngineName entspricht. Falls EngineName nicht angegeben wurde, sucht sie nach dem voreingestellten lokalen Datenbankserver. Falls kein passender Server gefunden wird, schlägt die Funktion fehl. Die Funktion sendet eine Anforderung an den Server, alle Datenbanken zu finden und zu beenden. Sie entlädt den Datenbankserver.

♦ ♦ ♦ 266

Kapitel 6 Programmieren mit Embedded SQL
Als Voreinstellung beendet diese Funktion einen Datenbankserver nicht, solange noch eine Verbindung zu dieser Datenbank offen ist. Falls Unconditional mit yes belegt ist, wird der Datenbankserver beendet, auch wenn noch Verbindungen offen sind. Ein C-Programm kann diese Funktion nutzen anstatt DBSTOP aufzurufen. Ist der Rückgabewert TRUE, sind keine Fehler aufgetreten. Die Verwendung von db_stop_engine hängt von den Berechtigungen ab, die mit der Serveroption -gk festgelegt wurden.

$ Weitere Hinweise finden Sie unter "–gk-Serveroption" auf Seite 157
der Dokumentation ASA Datenbankadministration.

db_string_connect-Funktion
Prototyp Argumente unsigned int db_string_connect( SQLCA * sqlca, char * parms );

sqlca Ein Zeiger auf eine SQLCA-Struktur. Hinweise dazu finden Sie unter

"SQL-Kommunikationsbereich (SQLCA)" auf Seite 208.
parms Eine auf NULL endende Zeichenfolge, die eine durch Semikolons

getrennte Liste mit Parametereinstellungen enhält, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"

$ Eine Liste der Verbindungsparameter finden Sie unter
"Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration.
Beschreibung

Liefert zusätzliche Funktionalität über den Embedded SQL-Befehl CONNECT hinaus. Diese Funktion führt eine Verbindung aus, wobei der Algorithmus verwendet wird, der in "Fehlerbehandlung bei Verbindungen" auf Seite 82 der Dokumentation ASA Datenbankadministration beschrieben wird. Der Rückgabewert ist wahr (ungleich Null), falls eine Verbindung zustandekam, andernfalls ist er falsch (Null). Informationen über Fehler beim Starten des Servers, beim Starten der Datenbank oder beim Verbindungsaufbau werden im SQLCA-Bereich zurückgegeben.

db_string_disconnect-Funktion
Prototyp unsigned int db_string_disconnect( SQLCA * sqlca, char * parms );

267

Referenz der Bibliotheksfunktion

Argumente

sqlca Ein Zeiger auf eine SQLCA-Struktur. Hinweise dazu finden Sie unter

"SQL-Kommunikationsbereich (SQLCA)" auf Seite 208.
parms Eine auf NULL endende Zeichenfolge, die eine durch Semikolons

getrennte Liste mit Parametereinstellungen enhält, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"

$ Eine Liste der Verbindungsparameter finden Sie unter
"Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration.
Beschreibung

Diese Funktion trennt die Verbindung, die mit dem Parameter ConnectionName angegeben wurde. Alle anderen Parameter werden ignoriert. Falls der Parameter ConnectionName in der Zeichenfolge fehlt, wird die unbenannte Verbindung getrennt. Dies entspricht dem Embedded SQLBefehl DISCONNECT. Der Boolesche Rückgabewert ist wahr, falls eine Verbindung erfolgreich getrennt wurde. Informationen über Fehler werden im SQLCA-Bereich zurückgegeben. Diese Funktion fährt die Datenbank herunter, falls sie mit dem Parameter AutoStop=yes gestartet wurde, und falls keine anderen Verbindungen mit der Datenbank bestehen. Es beendet auch den Serverbetrieb, falls der Server mit dem Parameter AutoStop=yes gestartet wurde, und falls keine weitere Datenbank mehr auf dem Server läuft.

db_string_ping_server-Funktion
Prototyp unsigned int db_string_ping_server( SQLCA * sqlca, char * connect_string, unsigned int connect_to_db );

Beschreibung

connect_string ist eine normale Verbindungszeichenfolge, die eventuell Server- und Datenbankinformationen enthält. Wenn connect_to_db nicht gleich Null (d.h. wahr) ist, dann versucht die Funktion eine Verbindung zu einer Datenbank auf einem Server herzustellen. Es wird nur ein Wert ungleich Null (d.h. wahr) zurückgegeben, wenn die Verbindungszeichenfolge ausreicht, um eine Verbindung zu einer benannten Datenbank auf dem benannten Server herzustellen.

268

Kapitel 6 Programmieren mit Embedded SQL
Wenn connect_to_db gleich Null ist, versucht die Funktion lediglich, die Position eines Servers zu ermitteln. Es wird nur ein Wert ungleich Null zurückgegeben, wenn die Verbindungszeichenfolge ausreicht, um die Position eines Servers zu ermitteln. Es wird nicht versucht, eine Verbindung zur Datenbank herzustellen.

fill_s_sqlda-Funktion
Prototyp struct sqlda * fill_s_sqlda( struct sqlda * sqlda, unsigned int maxlen );

Beschreibung

Diese Funktion entspricht fill_sqlda,, abgesehen davon, dass sie alle Datentypen in sqlda in den Datentyp DT_STRING umwandelt. Es wird genügend Speicherplatz zugewiesen, um die eine Repräsentation des Datentyps als Zeichenfolge zu speichern, der ursprünglich im SQLDABereich angegeben wurde, und zwar bis zu maximal maxlen Byte. Die Längenfelder im SQLDA-Bereich (sqllen) werden dementsprechend geändert. Die Funktion gibt im Erfolgsfall sqlda zurück und den Null-Zeiger, falls nicht genügend Speicherplatz zur Verfügung stand.

fill_sqlda-Funktion
Prototyp Beschreibung struct sqlda * fill_sqlda( struct sqlda * sqlda );

Diese Funktion weist alle Variable, die in den Deskriptoren von sqlda beschrieben sind, Speicherplatz zu und ordnet die Speicheradressen dem Feld sqldata des entsprechenden Deskriptors zu. Es wird genügend Speicherplatz zugewiesen für den im Deskriptor angegebenen Datenbanktyp und die angegebene Länge. Die Funktion gibt im Erfolgsfall sqlda zurück und den Null-Zeiger, falls nicht genügend Speicherplatz zur Verfügung stand.

free_filled_sqlda-Funktion
Prototyp Beschreibung void free_filled_sqlda( struct sqlda * sqlda );

Diese Funktion gibt den Speicherplatz frei, der einem sqldata-Zeiger und dem SQLDA-Bereich selbst zugewiesen war. Null-Zeiger werden nicht freigegeben. Durch Aufrufen dieser Funktion wird automatisch auch free_sqlda aufgerufen und alle Deskriptoren, die durch alloc_sqlda zugewiesen waren, freigegeben. 269

Referenz der Bibliotheksfunktion

free_sqlda-Funktion
Prototyp Beschreibung void free_sqlda( struct sqlda *sqlda );

Diese Funktion gibt Speicherplatz, der diesem sqlda zugewiesen wurde, und den Speicherplatz der Indikatorvariablen, der in fill_sqlda zugewiesen wurde, frei. Sie sollten den von den sqldata -Zeigern referenzierten Speicherplatz nicht freigeben.

free_sqlda_noind-Funktion
Prototyp Beschreibung void free_sqlda_noind( struct sqlda * sqlda );

Diese Funktion gibt den Speicherplatz frei, der dem sqlda zugewiesen war. Sie sollten den von den sqldata -Zeigern referenzierten Speicherplatz nicht freigeben. Die Indikatorvariablen-Zeiger werden nicht beachtet. "Eigenschaften von Datenbanken" auf Seite 690 der Dokumentation ASA Datenbankadministration "Das Ping-Dienstprogramm" auf Seite 550 der Dokumentation ASA Datenbankadministration

sql_needs_quotes-Funktion
Prototyp Beschreibung unsigned int sql_needs_quotes( SQLCA *sqlca, char *str );

Diese Funktion gibt einen Booleschen Wert zurück, der anzeigt, ob eine Zeichenfolge mit Anführungszeichen eingeschlossen werden muss, wenn sie als SQL-Name (identifier) benutzt wird. Sie formuliert eine Anforderung an den Datenbankserver, um festzustellen, ob Anführungszeichen nötig sind. Die relevante Information wird im Feld sqlcode gespeichert. Wir unterscheiden drei unterschiedliche Kombinationen von Rückgabewert und Code: ♦ ♦ ♦
return = FALSE, sqlcode = 0 In diesem Fall braucht die Zeichenfolge

mit Sicherheit keine Anführungszeichen.
return = TRUE In diesem Fall ist sqlcode immer mit SQLE_WARNING

belegt und die Zeichenfolge braucht mit Sicherheit Anführungszeichen.
return = FALSE Falls sqlcode mit etwas anderem als

SQLE_WARNING belegt ist, ist das Testergebnis unklar.

270

Kapitel 6 Programmieren mit Embedded SQL

sqlda_storage-Funktion
Prototyp Beschreibung unsigned long sqlda_storage( struct sqlda *sqlda, int varno );

Die Funktion gibt die Speichergröße zurück, die erforderlich wäre, um jeden möglichen Wert der in sqlda->sqlvar[varno] beschriebenen Variable zu speichern.

sqlda_string_length-Funktion
Prototyp Beschreibung unsigned long sqlda_string_length( SQLDA *sqlda, int varno );

Diese Funktion gibt die Länge zurück, die eine C-Zeichenfolge (Typ DT_STRING) haben müsste, um die Variable sqlda->sqlvar[varno] aufzunehmen (unabhängig vom Datentyp).

sqlerror_message-Funktion
Prototyp Beschreibung char *sqlerror_message( SQLCA *sqlca, char * buffer, int max );

Diese Funktion gibt einen Zeiger auf eine Zeichenfolge zurück, die eine Fehlermeldung enthält. Die Fehlermeldung enthält den Text für den Fehlercode im SQLCA-Bereich. Wurde kein Fehler gemeldet, wird ein NullZeiger zurückgegeben. Die Fehlermeldung wird in dem gelieferten Puffer gespeichert, falls erforderlich, gekürzt auf die Länge max.

271

Befehlszusammenfassung für Embedded SQL

Befehlszusammenfassung für Embedded SQL
Alle Embedded SQL Anweisungen beginnen mit EXEC SQL und

enden mit einem Semikolon (;). Es gibt zwei Gruppen von Embedded SQL-Befehlen: Standard-SQL-Befehle werden benutzt, indem sie einfach in ein C-Programm geschrieben werden, eingeschlossen von EXEC SQL und einem Semikolon (;). CONNECT, DELETE, SELECT, SET und UPDATE haben zusätzliche Formate, die nur in Embedded SQL zur Verfügung stehen. Die zusätzlichen Formate gehören zur zweiten Gruppe der Embedded SQL-spezifischen Befehle.

$ Eine Beschreibung der Standard-SQL-Befehle finden Sie unter "SQLAnweisungen" auf Seite 217 der Dokumentation ASA SQLReferenzhandbuch. Mehrere SQL-Befehle sind spezifisch für Embedded SQL und können nur innerhalb eines C-Programms benutzt werden.

$ Weitere Hinweise über die Embedded SQL-Befehle finden Sie unter
"SQL-Sprachelemente" auf Seite 3 der Dokumentation ASA SQLReferenzhandbuch. Standardmäßige Datenbearbeitung und Datendefinitions-Anweisungen können von Embedded SQL-Anwendungen verwendet werden. Darüber hinaus gelten die folgenden Anweisungen speziell für die Programmierung von Embedded SQL: ♦
ALLOCATE DESCRIPTOR Speicher für einen Deskriptor zuweisen

$ Siehe "ALLOCATE DESCRIPTOR-Anweisung [ESQL]" auf
Seite 222 der Dokumentation ASA SQL-Referenzhandbuch ♦
CLOSE Einen Cursor schließen

$ Siehe "CLOSE-Anweisung [ESQL] [GP]" auf Seite 285 der
Dokumentation ASA SQL-Referenzhandbuch ♦
CONNECT Mit der Datenbank verbinden

$ Siehe "CONNECT-Anweisung [ESQL] [Interactive SQL]" auf
Seite 292 der Dokumentation ASA SQL-Referenzhandbuch ♦
DEALLOCATE DESCRIPTOR Speicher freigeben, der für einen

Deskriptor reserviert war

$ Siehe "DEALLOCATE DESCRIPTOR-Anweisung [ESQL]" auf
Seite 410 der Dokumentation ASA SQL-Referenzhandbuch

272

Kapitel 6 Programmieren mit Embedded SQL

Deklarationsabschnitt Hostvariable für die Kommunikation mit der

Datenbank deklarieren

$ Siehe "Deklarationsabschnitt [ESQL]" auf Seite 421 der
Dokumentation ASA SQL-Referenzhandbuch ♦
DECLARE CURSOR Einen Cursor deklarieren

$ Siehe "DECLARE CURSOR-Anweisung [ESQL] [GP]" auf
Seite 412 der Dokumentation ASA SQL-Referenzhandbuch ♦
DELETE (positioniert) Die Zeilen an der aktuellen Cursorposition

löschen

$ Siehe "DELETE-Anweisung (positionsbasiert) [ESQL] [GP]" auf
Seite 424 der Dokumentation ASA SQL-Referenzhandbuch ♦
DESCRIBE Die Hostvariable für eine bestimmte SQL-Anweisung

deklarieren

$ Siehe "DESCRIBE-Anweisung [ESQL]" auf Seite 426 der
Dokumentation ASA SQL-Referenzhandbuch ♦
DISCONNECT Die Verbindung mit dem Datenbankserver lösen

$ Siehe "DISCONNECT-Anweisung [ESQL] [Interactive SQL]" auf
Seite 430 der Dokumentation ASA SQL-Referenzhandbuch ♦
DROP STATEMENT Ressourcen freigeben, die von einem Prepared-

Statement benutzt werden

$ Siehe "DROP STATEMENT-Anweisung [ESQL]" auf Seite 439
der Dokumentation ASA SQL-Referenzhandbuch ♦
EXECUTE Eine bestimmte SQL-Anweisung ausführen

$ Siehe "EXECUTE-Anweisung [ESQL]" auf Seite 449 der
Dokumentation ASA SQL-Referenzhandbuch ♦
EXPLAIN Die Strategie zur Optimierung eines bestimmten Cursors

erklären

$ Siehe "EXPLAIN-Anweisung [ESQL]" auf Seite 456 der
Dokumentation ASA SQL-Referenzhandbuch ♦
FETCH Eine Zeile aus einem Cursor abrufen

$ Siehe "FETCH-Anweisung [ESQL] [GP]" auf Seite 458 der
Dokumentation ASA SQL-Referenzhandbuch ♦
GET DATA Lange Werte aus einem Cursor abrufen

$ Siehe "GET DATA-Anweisung [ESQL]" auf Seite 471 der
Dokumentation ASA SQL-Referenzhandbuch 273

Befehlszusammenfassung für Embedded SQL

GET DESCRIPTOR Angaben zu einer Variablen in einen SQLDA-

Bereich abrufen.

$ Siehe "GET DESCRIPTOR-Anweisung [ESQL]" auf Seite 473 der
Dokumentation ASA SQL-Referenzhandbuch ♦
GET OPTION Die Einstellung einer bestimmten Datenbankoption

abholen

$ Siehe "GET OPTION-Anweisung [ESQL]" auf Seite 475 der
Dokumentation ASA SQL-Referenzhandbuch ♦
INCLUDE Eine Datei ins SQL-Preprocessing einschließen

$ Siehe "INCLUDE-Anweisung [ESQL]" auf Seite 495 der
Dokumentation ASA SQL-Referenzhandbuch ♦
OPEN Einen Cursor öffnen

$ Siehe "OPEN-Anweisung [ESQL] [GP]" auf Seite 523 der
Dokumentation ASA SQL-Referenzhandbuch ♦
PREPARE Eine bestimmte SQL-Anweisung vorbereiten

$ Siehe "PREPARE-Anweisung [ESQL]" auf Seite 533 der
Dokumentation ASA SQL-Referenzhandbuch ♦
PUT Eine Zeile in einen Cursor einfügen

$ Siehe "PUT-Anweisung [ESQL]" auf Seite 538 der Dokumentation
ASA SQL-Referenzhandbuch ♦
SET CONNECTION Die aktive Verbindung ändern

$ Siehe "SET CONNECTION-Anweisung [Interactive SQL]" auf
Seite 578 der Dokumentation ASA SQL-Referenzhandbuch ♦
SET DESCRIPTOR Die Variablen in einem SQLDA-Bereich

beschreiben und Daten im SQLDA-Bereich ablegen

$ Siehe "SET DESCRIPTOR-Anweisung [ESQL]" auf Seite 579 der
Dokumentation ASA SQL-Referenzhandbuch ♦
SET SQLCA Einen anderen als den global voreingestellten SQLCA-

Bereich benutzen

$ Siehe "SET SQLCA-Anweisung [ESQL]" auf Seite 588 der
Dokumentation ASA SQL-Referenzhandbuch ♦
UPDATE (positioniert) Die Zeile an der aktuellen Cursorposition

aktualisieren

$ Siehe "UPDATE-Anweisung (positionsbasiert) [ESQL] [GP]" auf
Seite 626 der Dokumentation ASA SQL-Referenzhandbuch 274

welche Aktionen bei Fehlern in SQLAnweisungen erfolgen sollen $ Siehe "WHENEVER-Anweisung [ESQL]" auf Seite 636 der Dokumentation ASA SQL-Referenzhandbuch 275 .Kapitel 6 Programmieren mit Embedded SQL ♦ WHENEVER Angeben.

Befehlszusammenfassung für Embedded SQL 276 .

die als Teil des Microsoft Data Access Components (MDAC) SDK verfügbar ist. Einige Tools zur Entwicklung von Anwendungen.K A P I T E L 7 ODBC-Programmierung Über dieses Kapitel In diesem Kapitel finden Sie Hinweise zum Entwickeln von Anwendungen. Dieses Kapitel richtet sich nicht an die Benutzer dieser Tools. Dieses Kapitel enthält einführende Unterlagen sowie eine Beschreibung der spezifischen Funktionen für Adaptive Server Anywhere. die die ODBCSchnittstelle verbirgt. Sie ist jedoch keine umfassende Anleitung für die Entwicklung von ODBC-Anwendungen. haben eine eigene Programmierschnittstelle. die die ODBC-Programmierschnittstelle direkt aufrufen. Die primäre Dokumentation für die Entwicklung von ODBC-Anwendungen ist die Microsoft ODBC SDK Documentation. die bereits ODBC unterstützen. Inhalt Thema Einführung in ODBC ODBC-Anwendungen erstellen ODBC-Beispiele ODBC-Handles Verbindung mit einer Datenquelle herstellen SQL-Anweisungen ausführen Mit Ergebnismengen arbeiten Gespeicherte Prozeduren aufrufen Umgang mit Fehlern Seite 278 280 285 287 290 294 299 304 306 277 .

ODBC-Übereinstimmung Adaptive Server Anywhere bietet Unterstützung für ODBC 3.asp?url=/library/enus/odbc/htm/odbcabout_this_manual. Unterstützte Plattformen Adaptive Server Anywhere unterstützt die ODBC API außer unter Windows auch unter UNIX und Windows CE. brauchen Sie: ♦ ♦ ♦ Adaptive Server Anywhere.Einführung in ODBC Einführung in ODBC Open Database Connectivity (ODBC) ist eine Programmierschnittstelle. von der Microsoft Website unter http://msdn. Eine Funktion ist entweder Kern. mit dem Sie Programme in Ihrer Betriebssystemumgebung erstellen können Das Microsoft ODBC Software Development Kit. $ Weitere Informationen zur Auflistung von ODBC-Treibern in verteilten Transaktionen finden Sie unter "Dreischichtige Datenverarbeitung und verteilte Transaktionen" auf Seite 399. Es umfasst Dokumentation und Tools.asp bezogen werden kann.microsoft. ODBC ist eine aufrufbasierte Schnittstelle. Diese Funktionen sind aufgeführt in der Dokumentation ODBC Programmer’s Reference.52 Spezifikation. Einen C-Compiler. Stufe 1. ♦ Kernübereinstimmung Der Adaptive Server Anywhere unterstützt alle Von Adaptive Server Anywhere unterstützte Funktionen Kernfunktionen. um ODBC-Anwendungen zu testen. Sie finden es im Microsoft Developer Network. Stufen der ODBCUnterstützung ODBC-Funktionen werden nach Kompatibilitätsstufen eingeordnet. Der Adaptive Server Anywhere unterstützt die ODBC 3. oder Stufe 2. Um ODBC-Anwendungen für Adaptive Server Anywhere zu entwickeln.52. wobei Stufe 2 den Standard am besten unterstützt. die von der Microsoft Corporation als Standardschnittstelle für DatenbankManagementsysteme in Windows-Betriebssystemen definiert wurde. 278 . Die plattformunabhängige ODBCUnterstützung erleichtert die Entwicklung portabler Datenbankanwendungen.com/library/default. die von der Microsoft Corporation als Teil des ODBC Software Development Kits bzw.

ODBC-Treiber-Manager Version 3 hat eine neue Schnittstelle für die Konfiguration von ODBC-Datenquellen. sind weiter kompatibel mit Adaptive Server Anywhere und dem neueren ODBC-Treiber-Manager. Asynchrone Ausführung von ODBC-Funktionen für bestimmte einzelne Anweisungen Die Fähigkeit. Login-Anforderungen und SQL-Anforderungen nach einer gegebenen Zeit abzubrechen (time out) Anwendungen. ♦ Übereinstimmung mit Stufe 2 Adaptive Server Anywhere unterstützt alle Funktionen der Stufe 2.Kapitel 7 ODBC-Programmierung ♦ Übereinstimmung mit Stufe 1 Adaptive Server Anywhere unterstützt alle Funktionen der Stufe 1. Die neuen ODBC Funktionen stehen in den älteren Anwendungen nicht zur Verfügung. abgesehen von der asynchronen Ausführung von ODBC-Funktionen. Die Anforderungen von verschiedenen Threads werden von Adaptive Server Anywhere serialisiert. Dies ist auf Adaptive Server Anywhere nicht anwendbar. Der ODBC-Treiber-Manager gehört zu der mit Adaptive Server Anywhere ausgelieferten ODBC-Software. Adaptive Server Anywhere unterstützt die gemeinsame Nutzung einer Verbindung durch mehrfache Threads. Der ODBC-TreiberManager 279 . die mit älteren Versionen von ODBC entwickelt wurden. mit Ausnahme der folgenden: ♦ ♦ ♦ ODBC-RückwärtsKompatibilität Dreiteilige Namen von Tabellen und Ansichten.

Weitere Hinweise finden Sie unter "ODBC-Anwendungen unter Windows CE verknüpfen" auf Seite 281. müssen Sie diese mit der geeigneten Importbibliothekdatei verbinden. die alle Funktionen. die erforderlich sind. das die Header-Datei enthält. 280 . die die betreffende plattformspezifische Header-Datei referenziert. ODBC-Anwendungen unter Windows verknüpfen Dieser Abschnitt betrifft nicht Windows CE.ODBC-Anwendungen erstellen ODBC-Anwendungen erstellen In diesem Abschnitt wird beschrieben.h ein.dll definiert. Jede plattformspezifische Header-Datei schließt die wichtigste ODBC-HeaderDatei odbc. ODBC-Header-Datei einbeziehen Jede C-Quelldatei. Der Treiber-Manager seinerseits lädt den Adaptive Server Anywhere-ODBC-Treiber dbodbc8.h" #include "ntodbc. die ODBC-Funktionen aufruft. Damit ist der Zugriff auf die ODBCFunktionen gewährleistet: Mit der Importbibliothek werden Eintrittspunkte für den ODBC Driver Manager odbc32.h" #include "unixodbc.dll. Wenn Sie Ihre Anwendung linken.h werden im Unterverzeichnis h Ihres SQL Anywhere-Verzeichnisses installiert. wie einfache ODBC-Anwendungen kompiliert und gelinkt werden. Datentypen und Konstanten definiert. Die plattformspezifischen Header-Dateien und odbc. Folgende Zeilen müssen benutzt werden: Betriebssystem Windows UNIX Windows CE Include-Zeile #include "ntodbc. v So wird die ODBC-Header-Datei in eine C-Quelldatei einbezogen: 1 Fügen Sie eine Include-Zeile hinzu. um ein ODBC-Programm zu schreiben. muss eine plattformspezifische ODBC-Header-Datei einbeziehen.h" 2 Fügen Sie das Verzeichnis. dem IncludePfad Ihres Compilers hinzu.

Zum Beispiel befindet sich der ODBC-Treiber für Windows CE mit dem SH3-Chip an folgendem Speicherort: C:\Programme\Sybase\SQL Anywhere 8\ce\SH3 $ Eine Liste der unterstützten Versionen von Windows CE finden Sie unter "Erforderliche Systemausstattung für Adaptive Server Anywhere" auf Seite 31 der Dokumentation ASA Erste Schritte. Für die verschiedenen Chips. Mit der Importbibliothek (dbodbc8. auf denen Windows CE verfügbar ist.und BorlandCompiler angeboten. 281 .lib) werden die Eintrittspunkte direkt in den Adaptive Server Anywhere-ODBC-Treiber dbodbc8.Kapitel 7 ODBC-Programmierung Separate Importbibliotheken werden für Microsoft-. Die Dateien befinden sich in betriebssystemspezifischen Unterverzeichnissen des Verzeichnisses ce in Ihrem SQL Anywhere-Verzeichnis. Die Importbibliotheken werden im Unterverzeichnis lib des Verzeichnisses mit den ausführbaren Dateien von Adaptive Server Anywhere gespeichert und tragen die folgenden Bezeichnungen: Betriebssystem Windows 95/98 und Windows NT Windows 95/98 und Windows NT Windows 95/98 und Windows NT Windows CE Compiler Microsoft Watcom C/C++ Borland Microsoft Importbibliothek odbc32. werden separate Versionen dieser DLL zur Verfügung gestellt. v So wird eine ODBC-Anwendung verknüpft (Windows): ♦ Fügen Sie das Verzeichnis mit der plattformspezifischen Importbibliothek der Liste der Bibliothekenverzeichnisse hinzu. v So wird eine ODBC-Anwendung gelinkt (Windows CE): 1 Fügen Sie das Verzeichnis mit der plattformspezifischen Importbibliothek der Liste der Bibliothekenverzeichnisse hinzu.lib bodbc32. Watcom.lib ODBC-Anwendungen unter Windows CE verknüpfen In Windows CE-Betriebssystemen gibt es keinen ODBC-Treiber-Manager.lib dbodbc8.dll definiert.lib wodbc32.

0 Sample. Sie aber die ASCII ODBCFunktionen nutzen möchten. Windows CE und Unicode Adaptive Server Anywhere verwendet die Codierung UTF-8 ist. hierbei handelt es sich um eine Mehrbyte-Zeichenkodierung.ODBC-Anwendungen erstellen Die Importbibliothek trägt den Namen dbodbc8. In diesem Abschnitt wird beschrieben. Das UNICODE-Makro steuert. wie ODBC-Anwendungen aufgebaut werden.c veranschaulicht. Der Adaptive Server Anywhere ODBC-Treiber unterstützt entweder ASCII (8-Bit)-Zeichenfolgen oder Unicode (Wide Character)-Zeichenfolgen. ob ODBC-Funktionen ASCII.lib und ist an einem betriebssystemabhängigen Ort im Verzeichnis ce in Ihrem SQL Anywhere-Verzeichnis gespeichert. 282 .dbf=c:\asademo.dsn. szConnStrIn = "driver=BSSuchpfad\dbodbc8.c) verwendet eine Dateidatenquelle (FileDSNVerbindungsparameter) mit dem Namen ASA 8. Die Beispieldatei Samples\ASA\C\odbc. wie Sie die Unicode ODBC-Funktionen anwenden.db" wobei BSSuchpfad der vollständige Suchpfad bis zum Chip-spezifischen Unterverzeichnis Ihres SQL Anywhere-Verzeichnisses auf dem Windows CE-Gerät ist. die für die Codierung von Unicode verwendet werden kann. Zum Beispiel befindet sich die Importbibliothek für Windows CE mit dem SH3-Chip an folgendem Speicherort: C:\Programme\Sybase\SQL Anywhere 8\ce\SH3\lib 2 Belegen Sie den Parameter DRIVER= in der VerbindungsZeichenfolge. die den ODBCTreiber-Manager nicht verwenden. müssen Sie ebenfalls das SQL_NOUNICODEMAP-Makro definieren.oder UnicodeZeichenfolgen erwarten. es gibt jedoch Treiber-Manager von Drittherstellern. ODBC-Anwendungen auf UNIX verknüpfen Adaptive Server Anywhere umfasst keinen ODBC-Treiber-Manager. die an die Funktion SQLDriverConnect weitergegeben wird. Sie können Dateidatenquellen auf Ihrem Desktopsystem aus dem ODBC-TreiberManager erstellen und sie dann auf Ihr Windows CE-Gerät kopieren. Wenn Ihre Anwendung mit dem definierten UNICODE-Makro erstellt werden muss.dll. Zum Beispiel: \Programme\Sybase\SQL Anywhere 8\ce\SH3\lib Das Beispielprogramm (odbc.

so (libodbc.so.so (dbodbc_r. Die ODBC-Treiber sind folgende Dateien: Betriebssystem Solaris/Sparc Solaris/Sparc Tread-Modell Ein Thread Mehrere Threads ODBC-Treiber dbodbc8.1) libodbcinst. erstellen Sie symbolische Verknüpfungen für die gemeinsam genutzten Bibliotheken libodbc und libodbcinst zum Adaptive Server AnywhereODBC-Treiber.so.1) dbodbc_r.1) Solaris/Sparc libodbc. verwendet er die Datei ~/. und Sie keinen Treiber-Manager eines Drittanbieters benutzen.1) Die Bibliotheken sind mit einer Versionsnummer (in Klammern) als symbolische Verknüpfungen mit der gemeinsam benutzten Bibliothek installiert. Datenquelleninformation Wenn Adaptive Server Anywhere keinen ODBC-Treiber-Manager findet.so. Separate Versionen der Adaptive Server AnywhereODBC-Treiber werden für Anwendungen mit einfachem sowie mit mehreren Threads angeboten. 283 . die einen ODBC-Treiber-Manager erfordert.Kapitel 7 ODBC-Programmierung ODBC-Treiber Der ODBC-Treiber ist ein gemeinsam genutztes Objekt oder eine gemeinsam genutzte Bibliothek. ODBC-Treiber-Manager unter UNIX ODBC-Treiber-Manager für UNIX werden von Drittherstellern angeboten.so. Ein ODBC-Treiber-Manager beinhaltet die folgenden Dateien: Betriebssystem Solaris/Sparc Dateien libodbc.1) Wenn Sie eine Anwendung bereitstellen. Wenn Sie Ihre Anwendung bereitstellen.so.1) libodbcinst.so (libodbcinst. v So wird eine ODBC-Anwendung gelinkt (UNIX): 1 2 Linken Sie Ihre Anwendung direkt mit dem geeigneten ODBC-Treiber.so.ini als Datenquelleninformation.so (libodbc.odbc.so (libodbcinst. dass der geeignete ODBC-Treiber im Bibliotheks-Suchpfad des Benutzersystems enthalten ist.so (dbodbc8. achten Sie darauf.

und Windows CE-Betriebssystemen bezieht Adaptive Server Anywhere keinen ODBC-Treiber-Manager ein. Statt dessen gehen ODBC-Funktionsaufrufe über den ODBC-Treiber-Manager.ini nach Datenquelleninformationen ab Standard-ODBC-Anwendungen werden im Allgemeinen nicht direkt an den ODBC-Treiber gelinkt. jedoch können Sie dann nur auf Adaptive Server Anywhere-Datenquellen zugreifen. Sie können weiterhin ODBC-Anwendungen erstellen. Bei UNIX. indem Sie sie direkt an den Adaptive Server Anywhere-ODBC-Treiber linken.odbc. 284 .ODBC-Anwendungen erstellen Wenn ein ODBC-Treiber-Manager vorhanden ist. fragt der Adaptive Server Anywhere diesen und nicht ~/.

ODBC-Beispielprogramm erstellen Das ODBC-Beispielprogramm in Samples\ASA\C umfasst eine Stapelverarbeitungsdatei (Shell-Skript für UNIX). Das Programm führt dieselben Aktionen aus wie das Beispielprogramm für einen dynamischen Cursor in Embedded SQL. damit das ODBC-Beispiel kompiliert wird und nicht eine Embedded SQL-Version der Anwendung. mit dem das Programm kompiliert werden soll. Compiler Geben Sie den Compiler an. das sich im gleichen Verzeichnis befindet. die eingesetzt werden kann.c. v So wird das ODBC-Beispielprogramm erstellt 1 2 Öffnen Sie eine Befehlszeile und wechseln Sie in das Unterverzeichnis Samples\ASA\C Ihres SQL Anywhere-Verzeichnisses. Die Beispiele finden Sie im Unterverzeichnis Samples\ASA Ihres SQL Anywhere-Verzeichnisses.Microsoft Visual C++ 285 . die mit ODBC beginnen.Kapitel 7 ODBC-Programmierung ODBC-Beispiele Mit Adaptive Server Anywhere werden mehrere Beispiele geliefert. Folgende Compiler sind möglich: ♦ ♦ WC . veranschaulichen separate und einfache ODBC-Aufgaben. Führen Sie die Stapeldatei makeall oder das Shell-Skript aus. Plattform Geben Sie WINNT an wenn Sie für WindowsBetriebssystem kompilieren wollen. wie etwa eine Verbindung mit einer Datenbank herstellen und Anweisungen ausführen. $ Eine Beschreibung des entsprechenden Embedded SQL-Programms finden Sie unter "Beispielprogramme mit Embedded SQL" auf Seite 190. Ein vollständiges ODBCBeispielprogramm finden Sie unter Samples\ASA\C\odbc. um die Beispielanwendung zu kompilieren und zu linken. Standardmäßig ist dies C:\Programme\Sybase\SQL Anywhere 8\Samples\ASA Die Beispiele in Verzeichnissen.Watcom C/C++ MC . Die Syntax des Befehls ist wie folgt: makeall API Plattform Compiler Die Parameter sind wie folgt: ♦ ♦ ♦ API Geben Sie odbc an.

schreibt das Programm eine Seite in die Ereignisanzeige und hält an. Der Code ermöglicht es. um den Dienst zu starten. Klicken Sie auf "Dienst hinzufügen".c und die Header-Datei ntsvc. 2 Wählen Sie eine Tabelle: ♦ Wählen Sie eine der Tabellen in der Beispieldatenbank. die den Beispielcode für Windows-Dienste enthalten. Rechtsklicken Sie auf das Dienstsymbol und klicken Sie auf "Start". v So wird das ODBC-Beispiel ausgeführt: 1 Starten Sie das Programm: ♦ Führen Sie die Datei Samples\ASA\C\odbcwnt. zeigt es. Falls die Benutzeroberfläche nicht gestartet werden kann. die Dienste unterstützen.h. Wird das Programm als Dienst ausgeführt. Customer oder Employee eingeben. um das Beispielprogramm den NT-Diensten hinzuzufügen. die normale Benutzeroberfläche. Es schreibt die Ausgabe in die Ereignisanzeige unter der Rubrik "Anwendungen".B. Sie können z.exe aus.ODBC-Beispiele ♦ BC . das damit gelinkte ausführbare Programm entweder als normales Programm oder als Windows-Dienst auszuführen. Die beiden Dateien. falls dies möglich ist. 286 . gehen Sie wie folgt vor: 1 2 3 Starten Sie Sybase Central und öffnen Sie den Ordner "Dienste". wenn es für WindowsVersionen kompiliert wurde.c kann als Dienst laufen. Folgen Sie den Anweisungen. v Um das ODBC-Beispiel als Windows-Dienst auszuführen. sind die Quelldatei ntsvc.Borland C++ Builder ODBC-Beispielprogramm ausführen Das Beispielprogramm odbc.

SQLRETURN rc. ♦ Umgebung Das Umgebungs-Handle liefert einen globalen Kontext. SQLRETURN rc. dbc. &dbc ). SQLRETURN rc. INSERT. um grundlegende Funktionen wie Datenbankverbindungen und SQLAnweisungen zu definieren. Der folgende Code veranschaulicht. Der folgende Code veranschaulicht. Ein Verbindungs-Handle muss zunächst zugewiesen und dann verwendet werden. ♦ Anweisung Ein Anweisungs-Handle bietet Zugriff auf eine SQL- Anweisung und damit verbundene Daten. Die folgenden Handles werden in nahezu allen ODBC-Anwendungen eingesetzt. env. wie ein Verbindungs-Handle zugewiesen wird: SQLHDBC dbc.B. rc = SQLAllocHandle( SQL_HANDLE_ENV. in dem auf Daten zugegriffen wird. rc = SQLAllocHandle( SQL_HANDLE_STMT. Jede ODBC-Anwendung muss beim Start genau einen Umgebungs-Handle zuweisen und es bei Beendigung wieder freigeben. rc = SQLAllocHandle( SQL_HANDLE_DBC. SQL _NULL_HANDLE. wie ein Anweisungs-Handle zugewiesen wird: SQLHSTMT stmt. Jede Verbindung kann mehrere Anweisungen haben. ihrer Umgebung zugeordnete Verbindungen verfügen. Der folgende Code veranschaulicht. &env ). 287 . Ein Handle ist ein 32-Bit-Wert. wenn die Verbindung hergestellt ist. UPDATE und DELETE). &stmt ). eine Verbindung herzustellen. ♦ Verbindung Ein Verbindungs-Handle wird von einem ODBC-Treiber und einer Datenquelle angegeben. Eine Anwendung kann über mehrere. wie etwa Ergebnisgruppen und Parameter. Ein VerbindungsHandle zuzuweisen heißt nicht. wie ein Umgebungs-Handle zugewiesen wird: SQLHENV env.Kapitel 7 ODBC-Programmierung ODBC-Handles ODBC-Anwendungen verwenden eine kleine Anzahl von Handles. Anweisungen werden sowohl für Cursorvorgänge (Daten abrufen) als auch für die Ausführung einfacher Anweisungen benutzt (z.

Das Objekt mit SQLFreeHandle freisetzen. retcode = SQLAllocHandle( SQL_HANDLE_ENV. env ).ODBC-Handles ODBC-Handles zuweisen Die für ODBC-Programme erforderlichen Handle-Typen sind: Element Umgebung Verbindung Anweisung Deskriptor Handle-Typ SQLHENV SQLHDBC SQLHSTMT SQLHDESC v So wird ein ODBC-Handle verwendet: 1 Funktion SQLAllocHandle aufrufen. if( retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO ) { // Erfolg: Hier den Anwendungscode } SQLFreeHandle( SQL_HANDLE_ENV. 288 . SQLAllocHandle nimmt die folgenden Parameter an: ♦ ♦ ♦ Einen Bezeichner für den Typ des zuzuweisenden Elements Das Handle des übergeordneten Elements Einen Zeiger auf den Ort. SQLFreeHandle nimmt die folgenden Parameter an: ♦ ♦ Einen Bezeichner für den Typ des freizusetzenden Elements Das Handle des freizusetzenden Elements $ Eine vollständige Beschreibung finden Sie unter SQLFreeHandle in der Microsoft-Dokumentation ODBC Programmer's Reference. an dem das Handle zugewiesen wird $ Eine vollständige Beschreibung finden Sie unter SQLAllocHandle in der Microsoft-Dokumentation ODBC Programmer’s Reference. 2 3 Das Handle in nachfolgenden Funktionsaufrufen verwenden. Beispiel Mit dem folgenden Codefragment wird ein Umgebungs-Handle zugewiesen und freigesetzt: SQLHENV env. SQLRETURN retcode. $ Weitere Hinweise zu Rückgabecodes und Fehlerbehandlung finden Sie unter "Umgang mit Fehlern" auf Seite 306. SQL_NULL_HANDLE. &env ).

/* Umgebungsattribut ODBC-Version setzen */ retcode = SQLSetEnvAttr( env. 0). (SQLCHAR*) "ASA 8. if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "env allocated\n" ). if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "dbc allocated\n" ).h> #include "ntodbc. &dbc ). dbc ). SQL_NTS. char* argv[]) { SQLHENV env. } SQLFreeHandle( SQL_HANDLE_ENV.Kapitel 7 ODBC-Programmierung Ein erstes ODBC-Beispiel Es folgt ein einfaches ODBC-Programm. } 289 .cpp in Ihrem SQL Anywhere- Verzeichnis. retcode = SQLAllocHandle( SQL_HANDLE_DBC. $ Dieses Beispiel finden Sie als Samples\ASA\ODBCConnect\odbcconnect. SQLRETURN retcode. SQL_NTS. (SQLCHAR*) "SQL". SQL_NULL_HANDLE. SQLHDBC dbc. env. dass eine Verbindung mit der Adaptive Server Anywhere-Beispieldatenbank herstellt und diese sofort wieder trennt. return 0. SQL_NTS ). if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "Successfully connected\n" ). env ). (void*)SQL_OV_ODBC3. (SQLCHAR* ) "DBA".h" int main(int argc. retcode = SQLConnect( dbc. retcode = SQLAllocHandle( SQL_HANDLE_ENV. } SQLFreeHandle( SQL_HANDLE_DBC. SQL_ATTR_ODBC_VERSION.0 Sample". &env ). } SQLDisconnect( dbc ). #include <stdio.

die von einem bestimmten Treiber verwendet werden (in diesem Fall der Adaptive Server Anywhere-Treiber). $ Weitere Hinweise finden Sie unter SQLBrowseConnect in der Microsoft Dokumentation ODBC Programmer’s Reference. Mit SQLDriverConnect kann die Anwendung Adaptive Server Anywhere-spezifische Verbindungsdaten verwenden. 290 .Verbindung mit einer Datenquelle herstellen Verbindung mit einer Datenquelle herstellen In diesem Abschnitt wird beschrieben. die zur Eingabe von Verbindungsdaten auffordern und nach Datenquellen suchen. um eine Verbindung herzustellen. Eine ODBC-Verbindungsfunktion wählen ODBC bietet eine Reihe von Verbindungsfunktionen. Verwenden Sie SQLConnect. um anzufordern. dass der Adaptive Server Anywhere-Treiber zur Eingabe von Verbindungsdaten auffordert. SQLDriverConnect kann auch benutzt werden. wie ODBC-Funktionen zum Herstellen einer Verbindung mit einer Adaptive Server AnywhereDatenbank eingesetzt werden. $ Weitere Hinweise finden Sie unter SQLDriverConnect in der Microsoft Dokumentation ODBC Programmer’s Reference. ♦ SQLDriverConnect Stellt mit Hilfe einer Verbindungszeichenfolge eine Verbindung zu einer Datenquelle her. $ Weitere Hinweise finden Sie unter SQLConnect in der Microsoft Dokumentation ODBC Programmer’s Reference. wenn Sie einen Datenquellennamen in Ihrer Anwendung hartcodieren. ohne dass eine Datenquelle angegeben wird. SQLConnect nimmt einen Datenquellennamen und eine fakultative Benutzer-ID und ein fakultatives Benutzkennkennwort an. hängt davon ab. Mit SQLBrowseConnect kann Ihre Anwendung eigene Dialogfelder aufbauen. ♦ SQLBrowseConnect Stellt wie SQLDriverConnect mit Hilfe einer Verbindungszeichenfolge eine Verbindung zu einer Datenquelle her. wie Ihre Anwendung bereitgestellt und benutzt werden soll: ♦ SQLConnect Die einfachste Verbindungsfunktion. Darüber hinaus können Sie SQLDriverConnect benutzen. Welche Sie verwenden. die unabhängig von der Datenquelle sind.

werden SLQSTATE-Werte und einige andere versionsabhängige Funktionen auf das entsprechende Verhalten eingestellt. &dbc ). 3 Falls erforderlich. finden Sie unter "Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration. 4 Ein ODBC-Verbindungselement zuweisen. SQLRETURN retcode. retcode = SQLAllocHandle( SQL_HANDLE_ENV. env. Je nach Ihrer Anweisung können Sie eine Datenquelle oder Verbindungszeichenfolge hartcodieren oder sie für erhöhte Flexibilität extern speichern. SQL_NULL_HANDLE. Zum Beispiel: retcode = SQLSetEnvAttr( env. 291 . &env ). dass die Anwendung ODBC Version 3 befolgen soll. SQL_ATTR_ODBC_VERSION. $ Eine vollständige Liste der Verbindungsparameter. v So wird eine ODBC-Verbindung hergestellt: 1 ODBC-Umgebung zuweisen. Wenn Sie deklarieren. 0). 2 ODBC-Version deklarieren. bevor sie Datenbankvorgänge ausführen kann. (void*)SQL_OV_ODBC3.Kapitel 7 ODBC-Programmierung In den Beispielen in diesem Kapitel wird hauptsächlich SQLDriverConnect verwendet. die Datenquelle oder Verbindungszeichenfolge zusammenstellen. die vor dem Verbinden eingerichtet sein müssen. 5 Diejenigen Verbindungsattribute festlegen. Zum Beispiel: SQLHENV env. Eine Verbindung herstellen Ihre Anwendung muss eine Verbindung herstellen. Zum Beispiel: retcode = SQLAllocHandle( SQL_HANDLE_DBC. die in Verbindungszeichenfolgen eingesetzt werden können.

$ Weitere Hinweise finden Sie unter "Verbindungsattribute festlegen" auf Seite 292. Zum Beispiel deaktiviert die folgende Anweisung das ODBCAutocommit-Verhalten. SQL_NTS. retcode = SQLConnect( dbc. Zum Beispiel: if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "dbc allocated\n" ). um anzuzeigen.Verbindung mit einer Datenquelle herstellen Einige Verbindungsattribute müssen festgelegt werden. hat eine entsprechende Länge. SQL_AUTOCOMMIT. bevor eine Verbindung hergestellt wird. die an ODBC übergeben wird. indem SQL_AUTOCOMMIT auf "false" gesetzt wird. SQL_AUTOCOMMIT. Dieser Modus wird abgeschaltet. if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){ // Verbindung erfolgreich hergestellt. Verbindungsattribute festlegen Die Funktion SQLSetConnectAttr wird eingesetzt. (SQLPOINTER)SQL_AUTOCOMMIT_OFF. (SQLCHAR*) "ASA 8. retcode = SQLSetConnectAttr( dbc. $ Ein vollständiges Beispiel finden Sie in Samples\ASA\ODBCConnect\odbcconnect. um Verbindungsdetails zu steuern. SQL_NTS ). SQL_NTS. 0 ). (SQLCHAR*) "SQL". während andere vorher oder nachher eingerichtet werden können. Zum Beispiel: retcode = SQLSetConnectAttr( dbc.0 Sample". Hinweise ♦ SQL_NTS Jede Zeichenfolge. $ Weitere Hinweise finden Sie unter "Verbindungsattribute festlegen" auf Seite 292. 6 ODBC-Verbindungsfunktion aufrufen. dass es sich um einen Null Terminated String handelt. Ist die Länge unbekannt. 0 ).cpp in Ihrem SQL Anywhere- Verzeichnis. (SQLCHAR* ) "DBA". können Sie SQL_NTS als Argument verwenden. dessen Ende durch das Nullzeichen gekennzeichnet ist (\0). 292 . (SQLPOINTER)SQL_AUTOCOMMIT_OFF. SQLSetConnectAttr Voreingestellt arbeitet ODBC im Autocommit- ♦ Modus.

Es wird empfohlen. bis die Anforderung abgeschlossen ist. Hinweise finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration. Sie können für mehrfache Threads eine einfache Verbindung benutzen. 293 . dass Sie für jeden Thread eine eigene Verbindung benutzen. die lange braucht. müssen alle anderen Threads warten. Threads und Verbindungen in ODBC-Anwendungen Sie können ODBC-Anwendungen mit mehreren Threads für Adaptive Server Anywhere entwickeln. Der Datenbankserver erlaubt allerdings nicht mehr als eine aktive Anforderung für eine Verbindung zur gleichen Zeit.Kapitel 7 ODBC-Programmierung $ Weitere Hinweise sowie eine Liste der Verbindungsattribute finden Sie unter SQLSetConnectAttr in der Microsoft Dokumentation ODBC Programmer’s Reference . Falls ein Thread eine Anweisung ausführt. Viele Aspekte der Verbindung können über die Verbindungsparameter gesteuert werden.

bei einer Verbindung mit dem Handle dbc ein Handle vom Typ SQL_HANDLE_STMT mit dem Namen stmt zugewiesen: SQLAllocHandle( SQL_HANDLE_STMT. die wiederholt ausgeführt werden sollen wird damit vermieden. falls ein Zeichenfolgeindikator mit Nullabschlusszeichen erforderlich ist. 2 Funktion SQLExecDirect aufrufen und die Anweisung ausführen: 294 . v So wird eine SQL-Anweisung in einer ODBC-Anwendung ausgeführt: 1 Der Anweisung mit SQLAllocHandle ein Handle zuweisen. Das syntaktische Analysieren und das Vorbereiten des Zugriffsplans wird Vorbereitung der Anweisung genannt.SQL-Anweisungen ausführen SQL-Anweisungen ausführen ODBC umfasst mehrere Funktionen zum Ausführen von SQL-Anweisungen: ♦ Direkte Ausführung Adaptive Server Anywhere führt eine syntaktische Analyse der SQL-Anweisung durch.B. Damit wird die Performance verbessert. aber unflexibel. $ Siehe "Vorbereitete Anweisungen ausführen" auf Seite 297. bereitet einen Zugriffsplan vor und führt die Anweisung aus. Die Anweisung kann auch Parameter enthalten. Bei Anweisungen. eine SQL-Zeichenfolge und eine Länge bzw. Vorbereitete Ausführung Die Vorbereitung der Anweisung erfolgt ♦ getrennt von der Ausführung. Anweisungen direkt ausführen Mit der Funktion SQLExecDirect wird eine SQL-Anweisung vorbereitet und ausgeführt. &stmt ). Mit der folgenden Anweisung wird z. dbc. Die Funktion SQLExecDirect nimmt ein Anweisungs-Handle. Das folgende Codefragment veranschaulicht. ein Abschlusszeichen an. Die Anweisung kann keine Benutzereingabe zur Änderung der Anweisung annehmen. wie eine Anweisung ohne Parameter ausgeführt wird. Flexiblere Methoden zum Aufbau von Anweisungen finden Sie unter "Anweisungen mit gebundenen Parametern ausführen" auf Seite 295. Das in diesem Abschnitt beschriebene Verfahren ist zwar einfach. dass wiederholt vorbereitet werden muss.

SQL_NTS) . v So wird eine SQL-Anweisung mit gebundenen Parametern in einer ODBC-Anwendung ausgeführt: 1 Der Anweisung mit SQLAllocHandle ein Handle zuweisen. deletestmt. Mit der folgenden Anweisung wird z.B. Als Nächstes werden Parameter an den ersten.cpp. bei der zum Festlegen der Werte von Anweisungsparametern gebundene Parameter eingesetzt werden. eine Anweisung deklariert und ausgeführt. Zum Beispiel werden mit den folgenden Zeilen Variable deklariert. dbc.Kapitel 7 ODBC-Programmierung Mit den folgenden Zeilen wird z. die Werte für Abteilungs-ID. Abteilungsname und Manager-ID. Die Deklaration von deletestmt würde normalerweise am Anfang der Funktion auftreten: SQLCHAR deletestmt[ STMT_LEN ] = "DELETE FROM department WHERE dept_id = 201". $ Weitere Hinweise zu SQLExecDirect finden Sie unter SQLExecDirect in der Microsoft-Dokumentation ODBC Programmer’s Reference. bei einer Verbindung mit dem Handle dbc ein Handle vom Typ SQL_HANDLE_STMT mit dem Namen stmt zugewiesen: SQLAllocHandle( SQL_HANDLE_STMT. die mit dem Anweisungs-Handle stmt ausgeführt wird. 295 .B. SQLExecDirect( stmt. 2 Anweisungsparameter mit SQLBindParameter binden. sowie die Anweisungszeichenfolge selbst enthalten sollen. $ Ein vollständiges Beispiel mit Fehlerprüfung finden Sie unter Samples\ASA\ODBCExecute\odbcexecute. wie eine SQL-Anweisung aufgebaut und ausgeführt wird. zweiten und dritten Parameter einer Anweisung gebunden. &stmt ). Anweisungen mit gebundenen Parametern ausführen In diesem Abschnitt wird beschrieben.

"Sales East" ). SQL_C_SSHORT. insertstmt. &deptID. 0. 4 Führen Sie die Anweisung mit SQLExecDirect aus. SQLBindParameter( stmt. um die Performance von Anweisungen zu steigern. SQL_PARAM_INPUT. ?. dept_name. SQLExecDirect( stmt. cbManagerID = 0. 0. deptname. eine Anweisungszeichenfolge ausgeführt. Ein vollständiges Beispiel mit Fehlerprüfung finden Sie unter Samples\ASA\ODBCExecute\odbcexecute. SQL_PARAM_INPUT. 0. 3 Den Parametern Werte zuweisen. die sich in insertstmt im Anweisungs-Handle stmt befindet. SQL_PARAM_INPUT. dept_head_id )" "VALUES (?.&cbDeptName). cbDeptName = SQL_NTS. SQL_C_SSHORT. managerID. 0. ?.B. Mit der folgenden Zeile wird z. &managerID. SQL_CHAR. 0. managerID = 902. 0. 0. &cbManagerID). DEPT_NAME_LEN.B. $ Weitere Hinweise zu SQLExecDirect finden Sie unter SQLExecDirect in der Microsoft-Dokumentation ODBC Programmer’s Reference. SQL_INTEGER. 2. SQL_NTS) . Mit den folgenden Zeilen werden z. SQLCHAR insertstmt[ STMT_LEN ] = "INSERT INTO department " "( dept_id.SQL-Anweisungen ausführen #defined DEPT_NAME_LEN 20 SQLINTEGER cbDeptID = 0. 1. SQLBindParameter( stmt. Im Allgemeinen werden diese Variablen als Reaktion auf eine Benutzerhandlung festgelegt. deptID = 201. die mehr als einmal ausgeführt werden sollen. SQL_C_CHAR. SQLCHAR deptname[ DEPT_NAME_LEN ].)".cpp. strcpy( (char * ) deptname. Gebundene Parameter werden auch mit vorbereiteten Anweisungen verwendet. Weitere Hinweise finden Sie unter "Vorbereitete Anweisungen ausführen" auf Seite 297. SQLSMALLINT deptID. 3. 296 . &cbDeptID). SQLBindParameter( stmt. 0. SQL_INTEGER. den Parametern im Fragment von Schritt 2 Werte zugewiesen. $ Die obigen Codefragmente enthalten keine Fehlerprüfung.

dept_name. ?. &cbDeptID). SQL_INTEGER. ? Die Fragezeichen sind Platzhalter für Anweisungsparameter.Kapitel 7 ODBC-Programmierung Vorbereitete Anweisungen ausführen Vorbereitete Anweisungen bieten Performance-Vorteile bei häufig benutzten Anweisungen. Das folgende Codefragment veranschaulicht z. dept_head_id ) VALUES (?. sodass sie später referenziert werden kann. SQLHSTMT stmt. Mit SQLBindParameter Anweisungsparameter mit Werten belegen.. "INSERT INTO department ( dept_id. 0. In diesem Beispiel gilt: ♦ stmt ist das Anweisungs-Handle 297 . SQL_C_SSHORT. wie eine INSERTAnweisung vorbereitet wird: SQLRETURN retcode. Der folgende Funktionsaufruf zum Beispiel belegt den Wert der Variablen dept_id: SQLBindParameter( stmt. $ Eine Einführung in vorbereitete Anweisungen finden Sie unter "Anweisungen vorbereiten" auf Seite 12. 0. 1. retcode = SQLPrepare( stmt. der auf Erfolg oder Fehlschlag des Vorgangs überprüft werden sollte stmt Liefert ein Handle zu der Anweisung. &sDeptID. ?.)". v So wird eine vorbereitete Anweisung ausgeführt: 1 Die Anweisung mit SQLPrepare vorbereiten. In diesem Beispiel gilt: ♦ ♦ ♦ 2 retcode Enthält einen Rückgabecode. SQL_PARAM_INPUT. SQL_NTS). 0. ODBC bietet eine vollständige Menge von Funktionen für vorbereitete Anweisungen.B.

Die beiden anderen Parameter binden und sDeptId Werte zuordnen.cpp. $ Ein vollständiges Beispiel mit Fehlerprüfung finden Sie unter Samples\ASA\ODBCPrepare\odbcprepare. SQL_C_SHORT zeigt den C-Datentyp an. &cbDeptID ist ein Zeiger auf einen Puffer für die Länge des ♦ ♦ ♦ 3 4 Parameterwerts. der in der Anwendung verwendet wird. dass der Parameter eine Eingabeanweisung ist. SQL_INTEGER zeigt den SQL-Datentyp an. Schritte 2 bis 4 können mehrfach ausgeführt werden. Das Löschen der Anweisung setzt die der Anweisung zugewiesenen Ressourcen frei. Die Anweisung ausführen: retcode = SQLExecute( stmt). 5 Anweisung löschen. 0 gibt die Länge des Puffers in Byte an. $ Weitere Hinweise zu SQLPrepare finden Sie unter SQLPrepare in der Microsoft-Dokumentation ODBC Programmer’s Reference. SQL_PARAM_INPUT zeigt an.SQL-Anweisungen ausführen ♦ ♦ ♦ ♦ ♦ 1 zeigt an. Die nächsten beiden Parameter zeigen die Spaltengröße und die Anzahl der Dezimalstellen an: beide sind mit 0 (Null) für Ganzzahlen belegt. dass dieser Aufruf den ersten Platzhalter mit einem Wert belegt. 298 . &sDeptID ist ein Zeiger auf einen Puffer für den Parameterwert. der in der Datenbank verwendet wird. Anweisungen werden mit SQLFreeHandle gelöscht.

verwenden für diese Aufgaben Cursor. Adaptive Server Anywhere bietet umfassende Unterstützung für verschiedene Arten von Cursorn und Cursorvorgängen. damit Sie das gewünschte Verhalten in Ihre Anwendung einbauen können. der nur vorwärts liest und Adaptive Server Anywhere liefert einen Cursor. bevor Sie eine Anweisung ausführen. die mit den abrollenden ODBCCursortypen übereinstimmen. die von einer anderen Anwendung aktualisiert wurde? ODBC definiert eine Reihe von abrollenden Cursorn. die eine Ergebnismenge erzeugt. ist das Cursor-Verhalten komplexer. $ Eine Einführung zu Cursorn finden Sie unter "Mit Cursorn arbeiten" auf Seite 20. Sie müssen SQLSetStmtAttr aufrufen. die die Anweisungsattribute definiert. wenn sie eine Funktion SQLExecute oder SQLExecDirect ausführen. Die erforderlichen Cursor-Merkmale werden mit der Funktion SQLSetStmtAttr gesetzt. Standardmäßig erwarten ODBC-Anwendungen dieses Verhalten. Anwendungen öffnen implizit einen Cursor. Bei Anwendungen. Adaptive Server Anywhere liefert eine vollständige Gruppe von Cursorn. ODBC definiert einen Nur-Lesen-Cursor. die Anweisungen ausführen und Ergebnismengen verarbeiten.Kapitel 7 ODBC-Programmierung Mit Ergebnismengen arbeiten ODBC-Anwendungen verwenden Cursor zum Bearbeiten und Aktualisieren von Ergebnismengen. wenn sie eine Zeile zurückgibt. Bei Anwendungen. $ Ein einfaches Beispiel für einen nur vorwärts lesenden Cursor finden Sie unter "Daten abrufen" auf Seite 300. der für diesen Fall auf Performance optimiert ist. wie etwa Anwendungen mit grafischer Benutzeroberfläche. Viele Cursor-Merkmale können mit SQLSetStmtAttr festgelegt werden. Folgende Merkmale bestimmen den von Adaptive Server Anywhere gelieferten Cursortyp: 299 . Cursor-Eigenschaften wählen ODBC-Funktionen. die sich nur vorwärts durch eine Ergebnismenge bewegen und sie nicht aktualisieren. die sowohl vorwärts als auch rückwärts durch die Ergebnismenge blättern müssen. Wie reagiert die Anwendung. ist das Cursor-Verhalten recht einfach.

Mit Ergebnismengen arbeiten ♦ SQL_ATTR_CURSOR_SCROLLABLE Für einen abrollenden Cursor auf SQL_SCROLLABLE setzen und auf SQL_NONSCROLLABLE für Vorwärts-Cursor. &stmt ). ♦ SQL_ATTR_CONCURRENCY Auf einen der folgenden Werte setzen: ♦ ♦ ♦ SQL_CONCUR_READ_ONLY Aktualisierungen deaktivieren. damit über den Cursor Zeilen abgerufen werden. SQLBase ROWID oder Sybase TIMESTAMP. SQL_NONSCROLLABLE ist der Standardwert. 300 . um eine Zeile zu aktualisieren. müssen Sie sie für jede Spalte nach jedem Abruf (fetch) aufrufen. wird der Cursor geschlossen. führen Sie mit SQLExecute oder SQLExecDirect eine SELECT-Anweisung aus. wie z. SQL_CONCUR_READ_ONLY ist der Standardwert. Falls Sie SQLBindCol benutzen. $ Weitere Hinweise finden Sie unter SQLSetStmtAttr in der MicrosoftDokumentation ODBC Programmer’s Reference. bei der Zeilenversionen verglichen werden. SQL_SCROLLABLE. Falls Sie SQLGetData benutzen.B. SQL_ATTR_CURSOR_SCROLLABLE. die ausreicht. werden die Werte mit jedem Abruf (fetch) abgeholt. Beispiel Für das folgende Fragment ist ein abrollender Nur-Lesen-Cursor erforderlich: SQLAllocHandle( SQL_HANDLE_STMT. SQLSetStmtAttr( stmt. Als Nächstes verwenden Sie SQLFetch oder SQLExtendedFetch. SQL_CONCUR_ROWVER Verwenden Sie optimistische Parallelitätssteuerung. Der Standardwert für SQL_ATTR_MAX_LENGTH ist 256 KByte. Alternativ können Sie das SQL_MAX_LENGTH-Anweisungsattribut auf einen Wert setzen. ♦ SQL_CONCUR_VALUES Verwenden Sie optimistische Parallelitätssteuerung. bei der Werte verglichen werden. um den Wert für die gesamte Spalte aufzunehmen. SQL_CONCUR_LOCK Verwenden Sie die niedrigste Sperrstufe. dbc. Damit wird ein Cursor für die Anweisung geöffnet. Wenn eine Anwendung die Anweisung mit Hilfe von SQLFreeHandle freigibt. der groß genug ist. um Werte in Teilen für Spalten wie LONG VARCHAR oder LONG BINARY einzulesen. Daten abrufen Um Zeilen aus einer Datenbank abzurufen. kann die Anwendung entweder SQLBindCol oder SQLGetData verwenden. Um Werte von einem Cursor abzurufen. 0 ). SQLGetData wird benutzt.

wird durch die Größe einer Ganzzahl bestimmt. Auf eine Fehlerüberprüfung wurde verzichtet. SQLHSTMT stmt. SQLBindCol( stmt. cbManagerID = 0. deptID. &env ). SQL_C_SSHORT. SQLSMALLINT deptID. &cbDeptName). SQLFreeHandle( SQL_HANDLE_DBC. dbc ). &stmt ). plus 1 ausführen. SQLRETURN retcode. stmt ). Das Fragment stammt aus dem vollständigen Beispiel Samples\ASA\ODBCSelect\odbcselect. die Sie mit einem Fetch-Vorgang abrufen können. SQL_C_CHAR. 301 . SQLBindCol( stmt. SQL_NTS. SQLAllocHandle( SQL_HANDLE_ENV. deptname. dept_name. (SQLCHAR * ) "SELECT dept_id. 0. SQL_ATTR_ODBC_VERSION.cpp. deptname. SQL_NULL_HANDLE. Die Anzahl der Zeilenpositionen. SQLCHAR deptname[ DEPT_NAME_LEN ]. managerID. (SQLCHAR*) "SQL".0 Sample". 0. while( ( retcode = SQLFetch( stmt ) ) != SQL_NO_DATA ){ printf( "%d %20s %d\n". SQLBindCol( stmt. dept_head_id FROM DEPARTMENT " "ORDER BY dept_id". env ). env. &managerID. (SQLCHAR*) "ASA 8. SQLConnect( dbc. SQLINTEGER cbDeptID = 0. der in einer Ganzzahl möglich ist. cbDeptName = SQL_NTS. SQL_C_SSHORT. SQLAllocHandle( SQL_HANDLE_STMT. SQLDisconnect( dbc ). wobei es sich um die größtmögliche Ganzzahl minus 1 handelt. 1. SQLFreeHandle( SQL_HANDLE_ENV. (SQLCHAR*) "DBA". SQL_NTS ). SQLAllocHandle( SQL_HANDLE_DBC. SQLHDBC dbc. 0). SQL_NTS. &dbc ). } SQLFreeHandle( SQL_HANDLE_STMT. dbc. Wenn Sie negative Werte verwenden (Zeilen in Bezug auf das Ende). SQLSetEnvAttr( env.Kapitel 7 ODBC-Programmierung Mit dem folgenden Codefragment wird ein Cursor für eine Abfrage geöffnet und Daten über den Cursor abgerufen. sizeof(deptname). (void*)SQL_OV_ODBC3. Mit einem FetchVorgang können Sie Zeilen bis zu Nummer 2147483646 abrufen. &cbManagerID). &deptID. 2. SQL_NTS ). SQLExecDirect( stmt. um das Beispiel leichter lesbar zu halten. SQLHENV env. 3. &cbDeptID). managerID ). können Sie FetchVorgänge nach unten bis zum niedrigsten negativen Wert.

Diese Methode darf nicht bei Adaptive Server Anywhere angewendet werden. Diese Methode muss bei Adaptive Server Anywhere angewendet werden.Mit Ergebnismengen arbeiten Zeilen über einen Cursor aktualisieren und löschen Im Dokument "Microsoft ODBC Programmer’s Reference" wird empfohlen. dass eine Datenänderungsanweisung für die Spalten im Ergebnis sinnvoll ist.und DELETEANWEISUNGEN senden. dass Sie SELECT . SQL_REFRESH. kann also die Datenänderungsanweisung im Cursor ausgeführt werden... Wenn Sie einen Nur-Lese-Cursor verwenden. SQL_DELETE) legt SQLSetPos die Cursorposition fest und ermöglicht es der Anwendung. ♦ Der Cursortyp unterstützt Aktualisierungen. sofern die folgenden Bedingungen erfüllt sind: ♦ Die zu Grunde liegende Abfrage unterstützt Aktualisierungen. In Adaptive Server Anywhere brauchen Sie die Klausel FOR UPDATE nicht zu benutzen: SELECT-Anweisungen können automatisch aktualisiert werden. können Sie die Ergebnismenge nicht aktualisieren. Unter der Voraussetzung. um anzuzeigen. ♦ Mit Hilfe von SQLExecute positionsbasierte UPDATE. SQL_UPDATE. dass eine Abfrage mit positionierten Vorgängen aktualisierbar ist. die Darstellung der Daten in der Ergebnismenge oder die Daten selbst zu aktualisieren oder die Daten zu löschen. Abhängig von den angegebenen Parametern (SQL_POSITION. Die Datenbankoption ANSI_UPDATE_CONSTRAINTS schränkt den Typ aktualisierbarer Abfragen ein. FOR UPDATE benutzen. 302 . um positionsbasierte Updates und positionsbasiertes Löschen durchzuführen. $ Weitere Hinweise finden Sie unter "ANSI_UPDATE_CONSTRAINTS" auf Seite 615 der Dokumentation ASA Datenbankadministration. ♦ Die Funktion SQLSetPos. Es gibt in ODBC zwei Alternativen.

dass er Bookmarks unterstützt. welche Typen von Cursor-Bookmarks unterstützt werden. Für ODBC 2-Anwendungen gibt Adaptive Server Anywhere nur zurück.Kapitel 7 ODBC-Programmierung Bookmarks verwenden ODBC bietet Bookmarks.0 konnte eine Datenbank nur angeben. ODBC wird Sie also nicht an dem Versuch hindern. Der Datenbankserver hatte keine Möglichkeit. Vor der ODBC-Version 3. Textmarken) für alle Arten von Cursorn. mit Ausnahme von dynamischen Cursorn. anzugeben. die benutzt werden. Bookmarks mit dynamischen Cursorn zu benutzen. um Zeilen in einem Cursor zu identifizieren. Adaptive Server Anywhere unterstützt Lesezeichen (Bookmarks. Sie sollten diese Kombination allerdings vermeiden. 303 . ob sie Bookmarks unterstützt oder nicht: Es gab keine Schnittstelle. die diese Informationen für jeden Cursortyp bereitstellte.

SQLExecDirect( stmt. &stmt ). 304 . OUTPUT oder INOUT. $ Eine vollständige Beschreibung von gespeicherten Prozeduren und Triggern finden Sie unter "Prozeduren. "CREATE PROCEDURE Increment( INOUT a INT )" \ " BEGIN" \ " SET a = a + 1" \ " END". die keine zurückgeben. um jeder Parametermarkierung einen Speicherbereich zuzuweisen: INPUT. wie bei jedem anderen Cursor. können Sie die Werte mit SQLFetch oder SQLExtendedFetch abrufen. SWORD num_col. können Sie im Ergebnismengencursor Ihrer Prozedur einen Spaltenalias verwenden.Gespeicherte Prozeduren aufrufen Gespeicherte Prozeduren aufrufen In diesem Abschnitt wird beschrieben. falls die Prozedur keine Ergebnismenge zurückgibt. Um mehrfache Ergebnismengen verarbeiten zu können. Verwenden Sie SQLBindParameter. wie gespeicherte Prozeduren aufgerufen und die Ergebnisse in einer ODBC-Anwendung bearbeitet werden. Beispiel Mit diesem Beispiel wird eine Prozedur erstellt und aufgerufen. denn die Prozedur gibt keine Ergebnismenge zurück. Sie können SQLNumResultCols verwenden. muss ODBC den aktuell ausgeführten Cursor beschreiben. Prozeduren und Ergebnismengen Es gibt zwei Arten von Prozeduren: Prozeduren. HDBC dbc. wie sie in der RESULT-Klausel der gespeicherten Prozedur definiert sind. und nicht die von der Prozedur definierte Ergebnismenge. Auf eine Fehlerüberprüfung wurde verzichtet. Um dieses Problem zu vermeiden. Parameter müssen an Prozeduren mit Parametermarkierungen (Fragezeichen) übergeben werden. Falls eine Ergebnismenge zurückgegeben wird. Trigger und Anweisungsfolgen verwenden" auf Seite 565 der Dokumentation ASA SQL-Benutzerhandbuch. die keine Ergebnismenge zurückgibt. /* Prozedur erstellen */ SQLAllocStmt( dbc. um das Beispiel leichter lesbar zu halten. Deshalb bezeichnet ODBC die Spaltennamen nicht immer so. die Ergebnismengen zurückgeben und solche. Im Beispiel wird die Variable num_col den Wert 0 (Null) haben. Die Prozedur übernimmt einen INOUTParameter und erhöht seinen Wert. um den Unterschied festzustellen: die Anzahl der Ergebnisspalten ist 0 (Null). SQL_NTS ). long i. HSTMT stmt.

die eine Ergebnismenge zurückgibt. SQL_C_LONG. NULL ). if( retcode == SQL_NO_DATA_FOUND ) { retcode = SQLMoreResults( stmt ). SQLBindCol( stmt. NULL ). char emp_id[ 10 ]. SWORD num_col. if( retcode == SQL_NO_DATA_FOUND ) break.. /* Prozedur aufrufen . "CREATE PROCEDURE employees()" \ " RESULT( emp_id CHAR(10). char emp_lame[ 20 ]. NULL ). RETCODE retcode. 1.Ergebnisse ausgeben */ SQLExecDirect( stmt. &num_col ). Auf eine Fehlerüberprüfung wurde auch hier verzichtet. emp_lname ). SQLBindParameter( stmt. emp_lame FROM employee" \ " END". } } 305 . Im Beispiel hat die Variable num_col den Wert 2. 1. SQL_NTS ). SQLExecDirect( stmt. sizeof(emp_id). "CALL employees()". sizeof(emp_lname). SQL_INTEGER. SQLNumResultCols( stmt. ) { retcode = SQLFetch( stmt ). SQL_C_CHAR. } else { do_something( emp_id. /* Prozedur erstellen */ SQLExecDirect( stmt. do_something( i ). um das Beispiel leichter lesbar zu halten. denn die Prozedur gibt eine Ergebnismenge mit zwei Spalten zurück. &emp_lname. Beispiel Mit dem folgenden Beispiel wird eine Prozedur aufgerufen. HDBC dbc. emp_lname CHAR(20))"\ " BEGIN" \ " SELECT emp_id. 0. &num_col ). SQLNumResultCols( stmt. "CALL Increment( ? )". 0. SQL_NTS ). HSTMT stmt. &i. &emp_id. SQL_NTS ). 2. SQL_C_CHAR. for( . SQLBindCol( stmt.Kapitel 7 ODBC-Programmierung /* Prozedur zur Erhöhung von 'i' aufrufen */ i = 1.

keine weiteren Zeilen mehr in dem Cursor waren. dass beim Abrufen von einem Cursor . der einen der folgenden Statuscodes annehmen kann: Statuscode SQL_SUCCESS SQL_SUCCESS_WITH_INFO Beschreibung Kein Fehler. Der häufigste Grund für diesen Staus ist. die in der Hilfedatei unter SQLParamData und SQLPutData beschrieben wird. Sie können SQLError ausführen.Umgang mit Fehlern Umgang mit Fehlern Fehler in ODBC werden mit dem Rückgabewert jedes einzelnen ODBCFunktionsaufrufs und entweder mit der Funktion SQLError oder der Funktion SQLGetDiagRec gemeldet. Verbindungs. Ab Version 3 wird die Funktion SQLError nicht mehr weiter entwickelt und durch die Funktion SQLGetDiagRec ersetzt. SQL_INVALID_HANDLE 306 . SQL_NEED_DATA Für einen Parameter werden Daten benötigt. SQL_ERROR Die Funktion wurde wegen eines Fehlers nicht vollständig ausgeführt. Dies passiert häufig. dass ein Wert zurückgegeben wurde. der für den von der Anwendung zur Verfügung gestellten Puffer zu lang ist. SQL_NO_DATA_FOUND Keine Hinweise verfügbar. Der häufigste Grund für diesen Status ist. um mehr Informationen über das Problem zu erhalten. Dies ist eine erweiterte Funktion. nachdem es freigegeben wurde.oder Statement-Handle wurden als Argument übergeben. Die Funktion wurde vollständig ausgeführt. Ein ungültiger Umgebungs-. wenn ein Handle benutzt wird. Jede ODBC-Funktion gibt einen SQLRETURN zurück. Die Funktion SQLError wurde in ODBC-Versionen bis Version 3 (ausschließlich Version 3) verwendet. aber ein Aufruf von SQLError zeigt eine Warnung an. oder falls das Handle ein Null-Zeiger ist.

Verbindung und Anweisung übergeben. der das gleiche Handle als Parameter übergibt. Der erste Aufruf benutzt SQL_HANDLE_DBC. falls ein Fehler zu melden ist (nicht SQL_ERROR). Der zweite Aufruf benutzt SQL_HANDLE_STMT. Falls Sie SQLError oder SQLGetDiagRec nicht aufrufen. falls keine weiteren Fehler zu melden sind. Verbindungs. um den mit einer Verbindung zusammenhängenden Fehler zurückzugeben. jeder Verbindung und jedem Statement-Handle können ein oder mehrere Fehler oder Warnungen verbunden sein. um alle Fehlermeldungen zu entfernen. um den mit einer Verbindung zusammenhängenden Fehler zu erhalten. Jeder Aufruf von SQLGetDiagRec kann entweder ein Umgebungs-. Jeder Aufruf von SQLError oder SQLGetDiagRec gibt Hinweise für einen Fehler zurück und entfernt die Hinweise über diesen Fehler. und SQL_NO_DATA_FOUND. SQLError und SQLGetDiagRec geben SQL_SUCCESS zurück. Beispiel 1 Das folgende Programmfragment benutzt SQLError und gibt Rückgabecodes zurück: 307 . Der erste Aufruf benutzt SQL_NULL_HSTMT. um den mit der soeben ausgeführten Anweisung zusammenhängenden Fehler zurückzugeben.oder Anweisungshandle übergeben. Auf die gleiche Weise gibt ein Aufruf mit SQL_NULL_DBC und SQL_NULL_HSTMT alle mit dem Umgebungshandle zusammenhängenden Fehler zurück.Kapitel 7 ODBC-Programmierung Mit jeder Umgebung. werden die Fehlermeldungen beim nächsten Funktionsaufruf entfernt. Jeder Aufruf von SQLError kann drei Handles für Umgebung.

if( retcode == SQL_ERROR ){ SQLGetDiagRec(SQL_HANDLE_DBC. errmsg ). errmsg. errmsg ). SQL_NTS ). dbc. if( retcode == SQL_ERROR ){ SQLError( env. SQLRETURN retcode. stmt. Die Beispiele übergeben den Null-Zeiger für einige der Parameter von SQLError. /* Hier wurde Code ausgelassen */ retcode = SQLAllocHandle(SQL_HANDLE_STMT. NULL. SQL_NULL_HSTMT. &errmsglen). 1. dbc. sizeof(errmsg). &errnative. print_error( "Elemente konnten nicht gelöscht werden". NULL. SQLINTEGER errnative. NULL ). UCHAR errstate[5]. errstate. /* Annahme: print_error ist definiert. UCHAR errmsg[100]. &stmt ). &stmt ). errmsg. errmsg ). NULL ). SQLSMALLINT errmsglen. /* Annahme: print_error ist definiert */ print_error( "Allocation failed". errmsg. SQLRETURN retcode. dbc. errstate. return. sizeof(errmsg). "delete from sales_order_items where id=2015". dbc. Beispiel 2 Der folgende Auszug aus einem Beispielcode benutzt SQLGetDiagRec und Rückgabecodes: /* Erforderliche Variablen deklarieren */ SQLHDBC dbc. return. sizeof(errmsg). NULL. } /* Artikel für Auftrag 2015 löschen */ retcode = SQLExecDirect( stmt. /* Annahme: print_error ist definiert. SQLHSTMT stmt. 308 . SQLHSTMT stmt. NULL. if( retcode == SQL_ERROR ) { SQLError( env. Die ODBC-Dokumentation enthält eine vollständige Beschreibung von SQLError und all seinen Parametern. /* Hier wurde Code weggelassen */ retcode = SQLAllocHandle(SQL_HANDLE_STMT. return.Umgang mit Fehlern /* Erforderliche Variable deklarieren */ SQLHDBC dbc. dbc. print_error( "Failed SQLAllocStmt". errnative. UCHAR errmsg[255].

errmsg. return. SQL_NTS ). /* Annahme: print_error ist definiert*/ print_error("Failed to delete items". "delete from sales_order_items where id=2015". &errnative. errnative. recnum. stmt. errstate. &errmsglen). errstate. sizeof(errmsg). errmsg ). if( retcode == SQL_ERROR ) { SQLGetDiagRec(SQL_HANDLE_STMT. } 309 .Kapitel 7 ODBC-Programmierung } /* Artikel für Auftrag 2015 löschen */ retcode = SQLExecDirect( stmt.

Umgang mit Fehlern 310 .

wie die DBTools-Bibliothek benutzt wird. Thema Einführung in die DBTools-Schnittstelle DBTools-Schnittstelle verwenden DBTools-Funktionen DBTools-Strukturen DBTools-Aufzählungstypen Seite 312 314 323 335 367 Inhalt 311 . die zum Lieferumfang von Adaptive Server Anywhere gehört und Coder C++-Anwendungen zusätzlich mit Funktionen der Datenbankverwaltung ausstattet.K A P I T E L 8 Die DBTools-Schnittstelle Über dieses Kapitel In diesem Kapitel wird beschrieben.

dllapi. Die Header-Datei dbtools. die DBTools-Bibliothek. Außerdem müssen Funktionen vor dem Aufruf anderer DBTools-Funktionen. Windows CE Die Bibliothek dbtool8. sowie im Anschluss an die Verwendung anderer DBTools-Funktionen aufgerufen werden. vorgesehen.dll wird für Windows CE geliefert.dll. Unterstützte Plattformen Alle Dienstprogramme für die Datenbankverwaltung benutzen eine gemeinsame Bibliothek.Einführung in die DBTools-Schnittstelle Einführung in die DBTools-Schnittstelle Mit dem Sybase Adaptive Server Anywhere wird Sybase Central und eine Serie von Dienstprogrammen mitgeliefert. Die DBTools-Bibliothek hat Funktionen oder Eintrittspunkte für jedes einzelne Dienstprogramm zur Datenbankverwaltung. Wenn Sie dieses Kapitel lesen. In der Datei dbtools. Andere Tools werden für Windows CE nicht bereitgestellt. sollten Sie mit der Methode vertraut sein. Sie können Ihre eigenen Dienstprogramme für die Datenbankverwaltung entwickeln oder Funktionen der Datenbankverwaltung in Ihre Anwendungen einbauen.H enthält zwei andere Dateien: ♦ ♦ sqlca. die benutzt werden. Sie wird für die Betriebssysteme Windows Windows 95/98 und Windows NT mitgeliefert. Die dbtools. indem Sie die DBTools-Bibliothek aufrufen. mit der die von Ihnen benutzte Entwicklungsumgebung DLLs aufruft. nicht für SQLCA selbst. die für die Verwaltung von Datenbanken verwendet werden können.h wird im Unterverzeichnis h im Installationsverzeichnis eingerichtet. Diese Dienstprogramme für die Datenbankverwaltung übernehmen bestimmte Aufgaben. Die Datei dbtools. enthält eine Liste der Eintrittspunkte zur DBToolsBibliothek und liefert die Strukturen. Die DBTools-Header-Datei. DBRemoteSQL und DBSynchronizeLog. usw.h finden Sie die neuesten Informationen über die Eintrittspunkte und die Strukturbestandteile. DBToolsFini.h Diese Datei ist für die Auflösung diverser Makros. In diesem Kapitel wird die Schnittstelle zur DBTools-Bibliothek beschrieben.hHeader-Datei 312 . die Übersetzung von Transaktionslogs in SQL. Der Name der Bibliothek lautet dbtool8. die mit dem Adaptive Server Anywhere mitgeliefert wird. enthält aber nur Programmeinstiegspunkte für DBToolsInit. um Daten an die Bibliothek zu übergeben und von ihr zu beziehen.h Diese Datei definiert Präprozessor-Makros für betriebssystemabhängige und sprachenabhängige Makros. wie etwa das Sichern und Erstellen von Datenbanken.

h enthält außerdem Fehler-Rückgabewerte.Kapitel 8 Die DBTools-Schnittstelle Die Header-Datei sqldef. 313 .

Achten Sie daher immer darauf. müssen Sie Ihre Anwendung mit einer DBTools Importbibliothek verknüpfen. Wenn Sie die DBTools DLL nicht mehr verwenden. 314 . sodass diese DLL nicht entladen wird.lib win32\dbtlstM. der DBTools-DLL das Laden der Adaptive Server Anywhere Sprachen-DLL zu ermöglichen.DBTools-Schnittstelle verwenden DBTools-Schnittstelle verwenden Dieser Abschnitt enthält einen Überblick über die Entwicklung von Anwendungen. Importbibliotheken verwenden Damit die DBTools-Funktionen verwendet werden können. Folgende DBTools-Importbibliotheken werden geliefert: Compiler Watcom Microsoft Borland Bibliothek win32\dbtlstw. die DBTools intern verwendet. Die Sprachen-DLL enthält lokalisierte Versionen aller Fehlermeldungen und Bedieneraufforderungen.lib win32\dbtlstB. dass zu jedem Aufruf von DBToolsInit als Gegenstück DBToolsFini aufgerufen wird. kann die Referenznummer der Sprachen-DLL nicht heruntergezählt werden. Unterstützte Plattformen Importbibliotheken sind Compiler-spezifisch und werden für WindowsBetriebssysteme mit Ausnahme von Windows CE geliefert. Wenn DBToolsFini nicht aufgerufen wird. müssen Sie DBToolsInit aufrufen. Die Funktionen DBToolsInit und DBToolsFini bezwecken hauptsächlich.lib DBTools-Bibliothek starten und beenden Bevor Sie andere DBTools-Funktionen verwenden. die die erforderlichen Funktionsdefinitionen enthält. müssen Sie DBToolsFini aufrufen. Importbibliotheken für die DBTools-Schnittstelle werden mit dem Adaptive Server Anywhere mitgeliefert und können im Unterverzeichnis lib des jeweiligen Betriebssystemverzeichnisses im Installationsverzeichnis gefunden werden. die die DBTools-Schnittstelle für die Verwaltung der Datenbanken verwenden.

DBTools-Funktionen aufrufen Alle Tools werden aufgerufen. 315 .version = DB_TOOLS_VERSION_NUMBER.msgrtn = (MSG_CALLBACK) MessageRtn . memset( &backup_info. backup_info. … // DBTools dll bereinigen DBToolsFini( &info ).statusrtn = (MSG_CALLBACK) StatusRtn . backup_info.EXE". backup_info. wie DBTools aufgerufen und wieder bereinigt werden: // Deklarationen a_dbtools_info info. if( ret != EXIT_OKAY ) { // DLL-Initialisierung fehlgeschlagen … } // einige DBTools-Routinen aufrufen. Im folgenden Beispiel wird gezeigt. // Struktur ausfüllen backup_info. . wie die DBBackup-Funktion unter einem Windows-Betriebssystem verwendet wird. backup_info.connectparms ="uid=DBA. info. 0. 0. indem erst eine Struktur ausgefüllt und dann eine Funktion (oder ein Eintrittspunkt) in der DBTools-DLL aufgerufen wird.backup_database = TRUE. backup_info.errorrtn = (MSG_CALLBACK) ErrorRtn . sizeof( backup_info ) ).pwd=SQL.dbf=asademo. // Initialisierung von DBTools ret = DBToolsInit( &info ).Kapitel 8 Die DBTools-Schnittstelle Im folgenden Programmcodebeispiel wird gezeigt.errorrtn = (MSG_CALLBACK)MyErrorRtn. // Sicherung starten DBBackup( &backup_info ).output_dir = "C:\BACKUP". short ret.startline = "dbeng8. //Initialisierung der a_dbtools_info-Struktur memset( &info. Jeder Eintrittspunkt nimmt einen Zeiger zu einer bestimmten Struktur als Argument.confirmrtn = (MSG_CALLBACK) ConfirmRtn . sizeof( a_dbtools_info) ).db". // Initialisierung der Struktur a_backup_db backup_info. . backup_info. backup_info. backup_info.

Nutzung der CallbackFunktionen Mit Callback-Funktionen können DBTools-Funktionen die Kontrolle der Verarbeitung an die aufrufende Anwendung des Benutzers zurückgeben. Es handelt sich dabei um Zeiger auf CallbackFunktionen. Rückgabecodes der Softwarekomponenten Alle Datenbanktools werden als Eintrittspunkt in einer DLL geliefert. die von den DBTools-Funktionen an den Benutzer gesandt werden. kann nicht geöffnet werden Kein Speicher mehr Beendet vom Benutzer Fehlgeschlagene Kommunikationen Erforderlicher Datenbankname fehlt Falsches Client/Server-Protokoll Keine Verbindung mit dem Datenbankserver möglich Datenbankserver läuft nicht Datenbankserver nicht gefunden Stoppzeit erreicht Ungültige Parameter in der Befehlszeile Callback-Funktionen verwenden Einige Elemente in der DBTools-Struktur sind vom Typ MSG_CALLBACK. für vier Zwecke: 316 . Diese Eintrittspunkte verwenden die folgenden Rückgabecodes: Program mcode 0 1 2 3 4 5 6 7 8 9 10 11 254 255 Erklärung Erfolg Allgemeiner Ausfall Ungültiges Dateiformat Datei nicht gefunden.DBTools-Schnittstelle verwenden $ Hinweise zu den Bestandteilen der DBTools-Strukturen finden Sie unter "DBTools-Strukturen" auf Seite 335. Die DBTools-Bibliothek benutzt Callback-Funktionen zur Verarbeitung von Nachrichten.

wie zum Beispiel eine Nachricht mit den Namen der Tabelle. } 317 . Beispiel für eine Callback-Funktion mit Bestätigung Im folgenden Beispiel fragt eine Routine den Benutzer nach einer Bestätigung mit YES oder NO und gibt die Antwort des Benutzers zurück: extern short _callback ConfirmRtn( char far * question ) { int ret. if( question != NULL ) { ret = MessageBox( HwndParent. MB_ICONSTOP|MB_OK ). die Standardausgabe eines zeichenbasierten Systems oder andere Benutzeroberflächen. question. ♦ Fehlermeldung Wird aufgerufen.h definiert. Falls zum Beispiel das Sicherungsverzeichnis nicht vorhanden ist.errorrtn = (MSG_CALLBACK) MyFunction MSG_CALLBACK ist in der Header-Datei dllapi. zum Beispiel. "Backup Error". wie viel Prozent einer Tabelle entladen sind Callback-Funktion einer Struktur zuordnen Sie können der Struktur direkt eine Callback-Routine zuordnen.Kapitel 8 Die DBTools-Schnittstelle ♦ Bestätigung Wird aufgerufen. Tools-Routinen können Nachrichten in die aufrufende Anwendung übergeben. Die folgende Anweisung ist ein Beispiel für die Verwendung einer Sicherungsstruktur: backup_info. fragt die Tools-DLL. errorstr. "Confirm". ob es erzeugt werden soll. MB_ICONEXCLAMTION|MB_YESNO ). das kann eine Fensterumgebung sein. um den Status eines Vorgangs anzuzeigen. extern short _callback ErrorRtn( char far * errorstr ) { if( errorstr != NULL ) { ret = MessageBox( HwndParent. wenn ein Fehler auftritt. wie zum Beispiel. die dann in der passenden Benutzeroberfläche dargestellt werden sollten. um eine Nachricht zu bearbeiten. wenn eine Aktion vom Benutzer bestätigt werden muss. die gerade gesichert wird ♦ Statusinformation Wird aufgerufen. die im Adaptive Server Anywhere enthalten ist. } Beispiel für eine Callback-Funktion mit Fehlermeldung Im folgenden Beispiel zeigt eine Routine zur Behandlung einer Fehlermeldung die Fehlermeldung in einer Meldungsbox an. um den Benutzer zu informieren. wenn ein Vorgang nicht genügend Speicherplatz hat ♦ Informationsnachricht Wird aufgerufen. } return( 0 ).

wenn die Tools den Status eines Vorgangs anzeigen müssen (zum Beispiel wie viel Prozent einer Tabelle entladen sind). } Beispiel für eine Callback-Funktion mit Statusmeldung Eine Status-Callback-Routine wird aufgerufen. return TRUE. um die Version der DBToolsBibliothek zu speichern. gehen Sie wie folgt vor: ♦ Ordnen Sie die Versionskonstante dem Versionselement der Struktur zu. } return( 0 ). Die folgende Zeile ordnet die aktuelle Version einer Sicherungsstruktur zu: backup_info. } Versionsnummern und Kompatibilität Jede Struktur enthält ein Element. für die Ihre Anwendung entwickelt wurde. } Beispiel für eine Callback-Funktion mit Nachricht Eine typische Implementierung einer Callback-Funktion. Die aktuelle Version der DBTools-Bibliothek ist als Konstante in der HeaderDatei dbtools. bevor Sie die DBTools-Funktion aufrufen. } OutputMessageToWindow( statustr ). das die Versionsnummer angibt. v Um einer Struktur die aktuelle Versionsnummer zuzuordnen.version = DB_TOOLS_VERSION_NUMBER. 318 .h enthalten. die eine Nachricht am Bildschirm ausgibt: extern short _callback MessageRtn( char far * errorstr ) { if( messagestr != NULL ) { OutputMessageToWindow( messagestr ).DBTools-Schnittstelle verwenden return( 0 ). Sie sollten dieses Versionselement benutzen. Im folgenden Beispiel sehen Sie eine typische Implementierung. die lediglich die Nachricht am Bildschirm ausgibt: extern short _callback StatusRtn( char far * statusstr ) { if( statusstr == NULL ) { return FALSE.

1. um Boolesche Informationen kompakt zu speichern. Jedes Bit-Feld ist ein Bit lang.h a_bit_field zugeordnet wurde. auch in Zukunft mit neueren Versionen der DBTools-Bibliothek weiterzuarbeiten. angezeigt durch eine 1 rechts neben dem Doppelpunkt in der Strukturdeklaration. # define WINNT 319 . die von Ihrer Anwendung zur Verfügung gestellt werden.Kapitel 8 Die DBTools-Schnittstelle Kompatibilität Die Versionsnummer ermöglicht es der Anwendung. 1.c. um einen Booleschen Wert an die Struktur zu übergeben. dass Ihre Anwendung auch dann weiterarbeiten kann. rename_local_log: 1. Die DBToolsFunktionen sorgen mit Hilfe der Versionsnummern. dafür. Die Sicherungsstruktur zum Beispiel hat folgende Bit-Felder: a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field backup_database : backup_logfile : backup_writefile: no_confirm : 1. und ist abhängig vom Betriebssystem. 1. der am Anfang von dbtools. Sie ordnen dem Bit-Feld einen Wert von 0 (Null) oder 1 zu. rename_log : 1. Bit-Felder benutzen Viele DBTools-Strukturen benutzen Bit-Felder. Das Beispielprogramm selbst ist Samples\ASA\DBTools\main. Ein Beispiel für DBTools Dieses Beispiel sowie Hinweise zum Kompilieren finden Sie im Unterverzeichnis Samples\ASA\DBTools Ihres SQL AnywhereVerzeichnisses. Anwendungen arbeiten nicht mit älteren Versionen der DBTools-Bibliothek zusammen. quiet : 1. Der hier verwendete Datentyp hängt vom Wert ab. truncate_log : 1. wie die DBTools-Bibliothek zum Sichern der Datenbank eingesetzt werden kann. Das Beispiel veranschaulicht. wenn neue Elemente zur DBTools-Struktur hinzugefügt wurden.

str. char dir_name[ _MAX_PATH + 1]. "Backup".h> "windows. fflush( stdout ). "\n" ). str ). } return 0. FARPROC dbtoolsfini. "%s". } return 0. } return 0. fprintf( stdout. "%s".h" extern short _callback ConfirmCallBack(char far * str){ if( MessageBox( NULL. "%s". fprintf( stdout. "\n" ). fprintf( stdout. } return 0. "\n" ). MB_YESNO|MB_ICONQUESTION ) == IDYES ) { return 1. str ). FARPROC dbtoolsinit.h" "string. str ). } extern short _callback StatusCallBack( char far * str ){ if( str != NULL ) { fprintf( stdout. } extern short _callback ErrorCallBack( char far * str ){ if( str != NULL ) { fprintf( stdout. fflush( stdout ). HINSTANCE hinst.DBTools-Schnittstelle verwenden #include #include #include #include <stdio. a_dbtools_info dbtinfo. fflush( stdout ). int main( int argc. } // Haupteintrittspunkt in das Programm. } extern short _callback MessageCallBack( char far * str){ if( str != NULL ) { fprintf( stdout.h" "dbtools. char connect[ 256 ]. 320 . char * argv[] ){ a_backup_db backup_info. FARPROC dbbackup.

255 ). backup_info.msgrtn = (MSG_CALLBACK)MessageCallBack. backup_info.0 Sample" ).no_confirm = 0. sodass neue Versionen // der Struktur kompatibel sind.statusrtn = (MSG_CALLBACK)StatusCallBack.rename_log = 0. backup_info. strcpy( connect. if( argc > 1 ) { strncpy( dir_name. backup_info.backup_writefile = 1. backup_info. _MAX_PATH ). backup_info.Kapitel 8 Die DBTools-Schnittstelle // Immer mit 0 initialisieren.backup_logfile = 1. backup_info. backup_info. backup_info. if( argc > 2 ) { strncpy( connect. } backup_info. } else { // Annahme: die Engine läuft bereits.confirmrtn = (MSG_CALLBACK)ConfirmCallBack. argv[1]. backup_info. hinst = LoadLibrary( "dbtool8.no_confirm = 0.dll" ). backup_info. if( hinst == NULL ) { // Fehlgeschlagen return 0. "DSN=ASA 8. backup_info. } else { // DBTools erwartet nicht den // nachgestellten Schraegstrich strcpy( dir_name.output_dir = dir_name.truncate_log = 0. argv[2].backup_database = 1. } 321 .connectparms = connect.version = DB_TOOLS_VERSION_8_0_00. backup_info. 0.startline = "". sizeof( a_backup_db ) ). backup_info. } backup_info. memset( &backup_info.quiet = 0.errorrtn = (MSG_CALLBACK)ErrorCallBack. backup_info.quiet = 0. "c:\\temp" ).

"_DBToolsFini@4" ). (*dbbackup)( &backup_info ). "_DBBackup@4" ). dbtoolsfini = GetProcAddress( (HMODULE)hinst. FreeLibrary( hinst ). dbbackup = GetProcAddress( (HMODULE)hinst. return 0. (*dbtoolsfini)( &dbtinfo ).DBTools-Schnittstelle verwenden dbtinfo. dbtoolsinit = GetProcAddress( (HMODULE)hinst. "_DBToolsInit@4" ). (*dbtoolsinit)( &dbtinfo ).errorrtn = (MSG_CALLBACK)ErrorCallBack. } 322 .

Diese Funktion wird von dem BefehlszeilenDienstprogramm dbbackup benutzt. DBChangeLogName liefert eine Programmierschnittstelle zu dieser Funktion. 323 .Kapitel 8 Die DBTools-Schnittstelle DBTools-Funktionen Dieser Abschnitt beschreibt die Funktionen in der DBTools-Bibliothek. Die Option -t des Dienstprogramms dblog ändert den Namen des Transaktionslogs. Siehe auch "a_backup_db-Struktur" auf Seite 335 DBChangeLogName-Funktion Funktion Prototyp Parameter Ändert den Namen der Transaktionslogdatei. short DBChangeLogName ( const a_change_log * Änderungslog ). DBBackup-Funktion Funktion Prototyp Parameter Datenbanksicherungs-Funktion. $ Die Beschreibung dieser Aufgaben finden Sie unter "Das Sicherungsdienstprogramm" auf Seite 484 der Dokumentation ASA Datenbankadministration. Die Funktion DBBackup verwaltet alle Datenbanksicherungs-Aufgaben. Die Funktionen sind alphabetisch aufgelistet. Diese Funktion wird von dem Befehlszeilen-Dienstprogramm dblog benutzt. short DBBackup ( const a_backup_db * Sicherungsdatenbank ). Parameter Änderungslog Beschreibung Zeiger auf eine "a_change_log-Struktur" auf Seite 337 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Parameter Sicherungsdatenbank Beschreibung Zeiger auf eine "a_backup_db-Struktur" auf Seite 335 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

Parameter DB-Kollatierung Beschreibung Zeiger auf eine "a_db_collation-Struktur" auf Seite 344 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. short DBChangeWriteFile ( const a_writefile * Write-Datei ). Parameter Write-Datei Beschreibung Zeiger auf eine "a_writefile-Struktur" auf Seite 364 Prototyp Parameter Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. short DBCollate ( const a_db_collation * DB-Kollatierung ). sodass sie auf eine andere Datenbankdatei zugreift. wenn die Option -d angewendet wird.DBTools-Funktionen $ Eine Beschreibung des Dienstprogramms dblog finden Sie unter "Das Transaktionslog-Dienstprogramm" auf Seite 564 der Dokumentation ASA Datenbankadministration. $ Informationen über das Write-Datei-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Write-Datei-Dienstprogramm" auf Seite 592 der Dokumentation ASA Datenbankadministration. Siehe auch "a_change_log-Struktur" auf Seite 337 DBChangeWriteFile-Funktion Funktion Ändert eine Write-Datei. Diese Funktion wird von dem Dienstprogramm dbwrite benutzt. Siehe auch "DBCreateWriteFile-Funktion" auf Seite 326 "DBStatusWriteFile-Funktion" auf Seite 329 "a_writefile-Struktur" auf Seite 364 DBCollate-Funktion Funktion Prototyp Parameter Extrahiert eine Kollatierungssequenz aus einer Datenbank. $ Informationen über das Kollatierungs-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Kollatierungs-Dienstprogramm" auf Seite 489 der Dokumentation ASA Datenbankadministration 324 .

Parameter Erstellte_DB Beschreibung Zeiger auf eine "a_create_db-Struktur" auf Seite 341 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Diese Funktion wird von dem Dienstprogramm dbshrink benutzt.Kapitel 8 Die DBTools-Schnittstelle Siehe auch "a_db_collation-Struktur" auf Seite 344 DBCompress-Funktion Funktion Prototyp Parameter Komprimiert eine Datenbankdatei. Diese Funktion wird von dem Dienstprogramm dbinit benutzt. Parameter Komprimierte_DB Beschreibung Zeiger auf eine "a_compress_db-Struktur" auf Seite 339 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Siehe auch "a_compress_db-Struktur" auf Seite 339 DBCreate-Funktion Funktion Prototyp Parameter Erstellt eine Datenbank. $ Informationen über das Komprimierungs-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Komprimierungs-Dienstprogramm" auf Seite 495 der Dokumentation ASA Datenbankadministration. short DBCreate ( const a_create_db * Erstellte_DB ). $ Informationen über das Initialisierungsdienstprogramm finden Sie unter "Das Initialisierungs-Dienstprogramm" auf Seite 515 der Dokumentation ASA Datenbankadministration. short DBCompress ( const a_compress_db * Komprimierte_DB ). Siehe auch "a_create_db-Struktur" auf Seite 341 325 .

Siehe auch "DBChangeWriteFile-Funktion" auf Seite 324 "DBStatusWriteFile-Funktion" auf Seite 329 "a_writefile-Struktur" auf Seite 364 DBCrypt-Funktion Funktion Prototyp Parameter Dient zum Verschlüsseln einer Datenbankdatei. Parameter Write-Datei Beschreibung Zeiger auf eine "a_writefile-Struktur" auf Seite 364 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Siehe auch "a_crypt_db-Struktur" auf Seite 343 326 . short DBCrypt ( const a_crypt_db * Verschlüsselte_DB ). wenn die Option -c angewendet wird. Diese Funktion wird von dem Dienstprogramm dbinit benutzt.DBTools-Funktionen DBCreateWriteFile-Funktion Funktion Prototyp Parameter Erstellt eine Write-Datei. short DBCreateWriteFile ( const a_writefile * Write-Datei ). $ Informationen über das Write-Datei-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Write-Datei-Dienstprogramm" auf Seite 592 der Dokumentation ASA Datenbankadministration. $ Weitere Hinweise zum Verschlüsseln von Datenbanken finden Sie unter "Datenbank mit dem Befehlszeilenprogramm ""dbinit"" erstellen" auf Seite 516 der Dokumentation ASA Datenbankadministration. Diese Funktion wird von dem Dienstprogramm dbwrite benutzt. Parameter Verschlüsselte_DB Beschreibung Zeiger auf eine "a_crypt_db-Struktur" auf Seite 343 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. wenn die Option -e angewendet wird.

$ Informationen über das Dekomprimierungs-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Dekomprimierungs-Dienstprogramm" auf Seite 569 der Dokumentation ASA Datenbankadministration. Diese Funktion wird von dem Dienstprogramm dberase benutzt. short DBErase ( const an_erase_db * Zu_löschende_DB ). 327 . short DBExpand ( const an_expand_db * Zu_expandierende_DB ). $ Informationen über das Lösch-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Dienstprogramm zum Löschen der Datenbank" auf Seite 508 der Dokumentation ASA Datenbankadministration. Parameter Zu_löschende_DB Beschreibung Zeiger auf eine "an_erase_db-Struktur" auf Seite 349 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Parameter Zu_expandierende_DB Beschreibung Zeiger auf eine "an_expand_db-Struktur" auf Seite 350 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Siehe auch "an_erase_db-Struktur" auf Seite 349 DBExpand-Funktion Funktion Prototyp Parameter Dekomprimiert eine Datenbankdatei.Kapitel 8 Die DBTools-Schnittstelle DBErase-Funktion Funktion Prototyp Parameter Löscht eine Datenbankdatei und/oder ein Transaktionslog. Siehe auch "an_expand_db-Struktur" auf Seite 350 DBInfo-Funktion Funktion Gibt Informationen über eine Datenbankdatei zurück. Diese Funktion wird von dem Dienstprogramm dbexpand benutzt. Diese Funktion wird von dem Dienstprogramm dbinfo benutzt.

Siehe auch "DBInfoDump-Funktion" auf Seite 328 "DBInfoFree-Funktion" auf Seite 328 "a_db_info-Struktur" auf Seite 345 DBInfoDump-Funktion Funktion Gibt Informationen über eine Datenbankdatei zurück. 328 . $ Informationen über das Informations-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration. $ Informationen über das Informations-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration. short DBInfoFree ( const a_db_info * DB-Info ). short DBInfoDump ( const a_db_info * DB-Info ). Siehe auch "DBInfo-Funktion" auf Seite 327 "DBInfoFree-Funktion" auf Seite 328 "a_db_info-Struktur" auf Seite 345 DBInfoFree-Funktion Funktion Prototyp Wird aufgerufen.DBTools-Funktionen Prototyp Parameter short DBInfo ( const a_db_info * DB-Info ). um nach dem Aufruf der Funktion DBInfoDump Ressourcen freizugeben. Parameter DB-Info Beschreibung Zeiger auf eine "a_db_info-Struktur" auf Seite 345 Prototyp Parameter Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Parameter DB-Info Beschreibung Zeiger auf eine "a_db_info-Struktur" auf Seite 345 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. wenn die Option -u angewendet wird. Diese Funktion wird von dem Dienstprogramm dbinfo benutzt.

$ Informationen über das Informations-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration. Diese Funktion wird von dem Dienstprogramm dbwrite benutzt. Parameter Write-Datei Beschreibung Zeiger auf eine "a_writefile-Struktur" auf Seite 364 329 . short DBLicense ( const a_db_lic_info * DB-Liz. Parameter DB-Liz. wenn die Option -s angewendet wird. um die Lizenzdaten des Datenbankservers zu ändern oder mitzuteilen. $ Informationen über das Informations-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration.Kapitel 8 Die DBTools-Schnittstelle Parameter Parameter DB-Info Beschreibung Zeiger auf eine "a_db_info-Struktur" auf Seite 345 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. short DBStatusWriteFile ( const a_writefile * Write-Datei ). Siehe auch "DBInfo-Funktion" auf Seite 327 "DBInfoDump-Funktion" auf Seite 328 "a_db_info-Struktur" auf Seite 345 DBLicense-Funktion Funktion Prototyp Parameter Wird aufgerufen. Siehe auch "a_dblic_info-Struktur" auf Seite 348 DBStatusWriteFile-Funktion Funktion Prototyp Parameter Ruft den Status einer Write-Datei ab.-Info ).-Info Beschreibung Zeiger auf eine "a_dblic_info-Struktur" auf Seite 348 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

DBToolsFini-Funktion Funktion Prototyp Parameter Vermindert den Zähler und gibt Ressourcen frei. short DBToolsFini ( const a_dbtools_info * DBTools-Info ). die die DBTools-Schnittstelle benutzt. short DBSynchronizeLog( const a _sync_db * Synchronisierte_DB ). nachdem eine Anwendung die DBTools-Bibliothek nicht mehr benötigt. $ Weitere Informationen über diese Features finden Sie unter "Synchronisation einleiten" auf Seite 149 der Dokumentation MobiLink Benutzerhandbuch. kann das zum Verlust von Speicherressourcen führen. 330 . Siehe auch "DBChangeWriteFile-Funktion" auf Seite 324 "DBCreateWriteFile-Funktion" auf Seite 326 "a_writefile-Struktur" auf Seite 364 DBSynchronizeLog-Funktion Funktion Prototyp Parameter Synchronisiert eine Datenbank mit einem MobiLink Synchronisationsserver. Parameter Synchronisierte_DB Beschreibung Zeiger auf eine "a_sync_db-Struktur" auf Seite 352 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. $ Informationen über das Write-Datei-Dienstprogramm und seine Eigenschaften finden Sie unter "Das Write-Datei-Dienstprogramm" auf Seite 592 der Dokumentation ASA Datenbankadministration. Parameter DBTools-Info Beschreibung Zeiger auf eine "a_dbtools_info-Struktur" auf Seite 349 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.DBTools-Funktionen Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Falls diese Funktion nicht aufgerufen wird. Die Funktion DBToolsFini muss am Ende jeder Anwendung aufgerufen werden.

Der hauptsächliche Zweck der Funktion DBToolsInit ist es. Parameter DBTools-Info Beschreibung Zeiger auf eine "a_dbtools_info-Struktur" auf Seite 349 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. … // DBTools dll bereinigen DBToolsFini( &info ). die DBTools intern verwendet. die Sprach-DLL von Adaptive Server Anywhere zu laden.errorrtn = (MSG_CALLBACK)MakeProcInstance( (FARPROC)MyErrorRtn. hInst ). wie man DBTools initialisiert und ordnungsgemäß beendet: a_dbtools_info info. Die Funktion DBToolsInit muss zu Beginn jeder Anwendung aufgerufen werden. Die Sprach-DLL enthält lokale Versionen der Fehlermeldungen und Bedieneraufforderungen. if( ret != EXIT_OKAY ) { // DLL-Initialisierung fehlgeschlagen … } // einige DBTools-Routinen aufrufen. short ret. . bevor irgend eine andere DBTools-Funktion benutzt wird. Siehe auch "DBToolsFini-Funktion" auf Seite 330 "a_dbtools_info-Struktur" auf Seite 349 331 . . 0. info. die die DBTools-Schnittstelle benutzt. sizeof( a_dbtools_info) ). memset( &info. short DBToolsInit t( const a_dbtools_info * DBTools-Info ). // Initialisierung von DBTools ret = DBToolsInit( &info ). Beispiel ♦ Das folgende Code-Beispiel zeigt.Kapitel 8 Die DBTools-Schnittstelle Siehe auch "DBToolsInit-Funktion" auf Seite 331 "a_dbtools_info-Struktur" auf Seite 349 DBToolsInit-Funktion Funktion Prototyp Parameter Bereitet die DBTools-Bibliothek für die Benutzung vor.

Diese Funktion wird von dem Dienstprogramm dbbackup benutzt. Eine Ganzzahl (short integer). um zu überprüfen. short DBToolsVersion ( void ). Anwendungen können mit neueren Versionen von DBTools laufen. die die Versionsnummer der DBToolsBibliothek angibt Verwenden Sie die Funktion DBToolsVersion. $ Informationen über das Logkonvertierungs-Dienstprogramm finden Sie unter "Das Logkonvertierungs-Dienstprogramm" auf Seite 543 der Dokumentation ASA Datenbankadministration. "Versionsnummern und Kompatibilität" auf Seite 318 Siehe auch DBTranslateLog-Funktion Funktion Prototyp Parameter Übersetzt eine Transaktionslogdatei in SQL.DBTools-Funktionen DBToolsVersion-Funktion Funktion Prototyp Rückgabewert Anwendung Gibt die Versionsnummer der DBTools-Bibliothek zurück. Siehe auch "a_translate_log-Struktur" auf Seite 357 DBTruncateLog-Funktion Funktion Prototyp Parameter Kürzt eine Transaktionslogdatei. Parameter Zu_übersetzendes_Log Beschreibung Zeiger auf eine "a_translate_log-Struktur" auf Seite 357 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. mit der Ihre Anwendung entwickelt wurde. dass die DBTools-Bibliothek nicht älter ist als diejenige. short DBTranslateLog ( const a_translate_log * Zu_übersetzendes_Log ). short DBTruncateLog ( const a_truncate_log * Zu_kürzendes_Log ). Parameter Zu_kürzendes_Log Beschreibung Zeiger auf eine "a_truncate_log-Struktur" auf Seite 358 332 . nicht aber mit älteren Versionen. Diese Funktion wird von dem Dienstprogramm dbtran benutzt.

Diese Funktion wird von dem Dienstprogramm dbupgrade benutzt. Parameter Zu_entladende_DB Beschreibung Zeiger auf eine "an_unload_db-Struktur" auf Seite 359 Prototyp Parameter Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Diese Funktion wird von dem Dienstprogramm dbunload wie auch von dem Dienstprogramm dbxtract für SQL Remote benutzt. 333 . $ Informationen über das Entladungs-Dienstprogramm finden Sie unter "Das Dienstprogramm UNLOAD zum Entladen der Datenbank" auf Seite 572 der Dokumentation ASA Datenbankadministration. short DBUnload ( const an_unload_db * Zu_entladende_DB ).Kapitel 8 Die DBTools-Schnittstelle Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. short DBUpgrade ( const an_upgrade_db * DB_für_Upgrade ). Siehe auch "an_unload_db-Struktur" auf Seite 359 DBUpgrade-Funktion Funktion Prototyp Parameter Installiert ein Upgrade für eine Datenbankdatei. Parameter DB_für_Upgrade Beschreibung Zeiger auf eine "an_upgrade_db-Struktur" auf Seite 361 Rückgabewert Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. $ Informationen über das Sicherungsdienstprogramm finden Sie unter "Das Sicherungsdienstprogramm" auf Seite 484 der Dokumentation ASA Datenbankadministration Siehe auch "a_truncate_log-Struktur" auf Seite 358 DBUnload-Funktion Funktion Entlädt eine Datenbank.

short DBValidate ( const a_validate_db * Zu_validierende_DB ). Diese Funktion wird von dem Dienstprogramm dbvalid benutzt. Siehe auch "an_upgrade_db-Struktur" auf Seite 361 DBValidate-Funktion Funktion Prototyp Parameter Validiert eine Datenbank oder Teile einer Datenbank.DBTools-Funktionen Anwendung $ Informationen über das Upgrade-Dienstprogramm finden Sie unter "Das Upgrade-Dienstprogramm" auf Seite 582 der Dokumentation ASA Datenbankadministration. Parameter Zu_validierende_DB Beschreibung Zeiger auf eine "a_validate_db-Struktur" auf Seite 363 Rückgabewert Anwendung Ein Rückgabecode wie in "Rückgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. $ Informationen über das Validierungs-Dienstprogramm finden Sie unter "Das Validierungs-Dienstprogramm" auf Seite 588 der Dokumentation ASA Datenbankadministration. Siehe auch "a_validate_db-Struktur" auf Seite 363 334 .

typedef struct a_backup_db { unsigned short const char * const char * const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field const char * char } a_backup_db. hotlog_filename. Dieses Element entspricht der Befehlszeilenoption (-q) des Vorgangs "quiet". Viele der Strukturelemente entsprechen Befehlszeilenoptionen des entsprechenden Dienstprogramms. confirmrtn. mit deren Hilfe Informationen mit der DBTools-Bibliothek ausgetauscht werden. no_confirm : 1. Die Strukturen sind alphabetisch aufgeführt. msgrtn. rename_log : 1. truncate_log : 1.Kapitel 8 Die DBTools-Schnittstelle DBTools-Strukturen In diesem Abschnitt sind die Strukturen aufgeführt. backup_writefile : 1. backup_logfile : 1. version. errorrtn. connectparms. um Sicherungsaufgaben mit der DBTools-Bibliothek auszuführen. das mit den Werten 0 oder 1 belegt sein kann. quiet : 1. Einige Strukturen zum Beispiel haben ein Element namens "quiet". der von vielen Dienstprogrammen benutzt wird. die gebraucht werden. rename_local_log: 1. backup_database: 1. backup_interrupted. 335 . statusrtn. output_dir. startline. a_backup_db-Struktur Funktion Syntax Enthält die Informationen.

wenn dieses Element NULL ist. dass der Vorgang unterbrochen wurde "DBBackup-Funktion" auf Seite 323 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.exe" Die standardmäßige Startzeile wird benutzt. Zum Beispiel: "c:\backup" Parameter für die Verbindung zur Datenbank.DBTools-Strukturen Parameter Mitglied Version output_dir connectparms Beschreibung DBTools-Versionsnummer Suchpfad des Ausgabeverzeichnisses. 336 .DBF=c:\asa\asademo.PWD=SQL. confirmrtn errorrtn msgrtn statusrtn backup_database backup_logfile backup_writefile no_confirm quiet rename_log truncate_log rename_local_log hotlog_filename backup_interrupted Siehe auch Callback-Routine für die Bestätigung einer Aktion Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Callback-Routine für die Behandlung einer Statusmeldung Datenbankdatei sichern (1) oder nicht (0) Transaktionslogdatei sichern (1) oder nicht (0) Datenbank-Write-Datei sichern (1) oder nicht (0). zum Beispiel: "UID=DBA.db" $ Alle Zeichenfolgen für die Verbindung finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. falls eine Datenbank-Write-Datei benutzt wird Mit (0) oder ohne (1) Bestätigung arbeiten Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Transaktionslog umbenennen Transaktionslog löschen Lokale Sicherung des Transaktionslogs umbenennen Dateiname für die gerade benutzte Sicherungsdatei Gibt an. Das folgende Beispiel zeigt eine Startzeile: "c:\asa\win32\dbeng8. Sie haben die Form von Zeichenfolgen.

: 1. logname. encryption_key. dbname. query_only : 1. : 1.Kapitel 8 Die DBTools-Schnittstelle a_change_log-Struktur Funktion Syntax Enthält die Informationen. typedef struct a_change_log { unsigned short const char * const char * MSG_CALLBACK MSG_CALLBACK a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field const char * unsigned short const char * char * char * char * } a_change_log. Parameter Beschreibung DBTools-Versionsnummer Datenbankdateiname Name der Transaktionslogdatei. msgrtn. zeigt an. mirrorname. errorrtn. die gebraucht werden. : 1. 0: Änderung des Lognamens erlauben Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Auf 1 setzen. um dblog-Aufgaben mit der DBTools-Bibliothek auszuführen. key_file. mirrorname_present change_mirrorname change_logname ignore_ltm_trunc : 1. um das Feld mirrorname zu unterstützen Änderung des Namens der Logspiegeldatei erlauben Änderung des Transaktionslognamens erlauben. quiet : 1. : 1. Wenn dieser Wert gleich NULL gesetzt wird. Mitglied version dbname logname errorrtn msgrtn query_only quiet mirrorname_present change_mirrorname change_logname version. sap_starting_offset. zap_current_offset. generation_number. 337 . ignore_remote_trunc set_generation_number ignore_dbsync_trunc : 1. dass die DBTools-Version neu genug ist. : 1. gibt es kein Log Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Name des Transaktionslogs anzeigen.

wird hiermit der Ausgangspunkt für die Option DELETE_OLD_LOGS zurückgesetzt. ein Transaktionslog zu löschen. Dies ist nur für das Zurücksetzen eines Transaktionslogs nach Entladen und Aktualisieren zur Abstimmung mit den Einstellungen für dbremote oder dbmlsync vorgesehen. Wird zusammen mit set_generation_number benutzt. set_generation_number ignore_dbsync_trunc mirrorname generation_number key_file zap_current_offset zap_starting_offset encryption_key Siehe auch "DBChangeLogName-Funktion" auf Seite 323 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.DBTools-Strukturen Mitglied ignore_ltm_trunc Beschreibung Wird der Log Transfer Manager verwandt. 'gen_id'. wenn es nicht länger gebraucht wird. Der Chiffrierschlüssel für die Datenbankdatei. Ausgangspunkt auf den angegebenen Wert ändern. Dies ist nur für das Zurücksetzen eines Transaktionslogs nach Entladen und Aktualisieren zur Abstimmung mit den Einstellungen für dbremote oder dbmlsync vorgesehen. um die Generierungsnummer zu setzen. der es erlaubt. Wenn dbmlsync verwendet wird. wird die gleiche Funktion wie mit Funktion dbcc settrunc( ’ltm’. Setzt den Ausgangspunkt für die Option DELETE_OLD_LOGS zurück. mit dem ein Transaktionslog gelöscht werden kann. wenn es nicht mehr gebraucht wird. ignore_remote_trunc Für SQL Remote. Eine Datei mit dem Chiffrierschlüssel Aktuellen Ausgangspunkt auf den angegebenen Wert ändern. Der neue Name des Transaktionslogspiegels Die neue Generationsnummer. 338 . n ) des Replication Server ausgeführt: $ Weitere Informationen finden Sie in der Dokumentation zum Replication Server.falls der Log Transfer Manager benutzt wird nach der Wiederherstellung einer Sicherung verwendet. Wird .

Kapitel 8 Die DBTools-Schnittstelle a_compress_db-Struktur Funktion Enthält die Informationen. statusrtn. dbname. typedef struct a_compress_db { unsigned short const char * const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK a_bit_field a_bit_field a_bit_field a_compress_stats * MSG_CALLBACK a_bit_field const char * } a_compress_db. noconfirm encryption_key Syntax : 1. Mitglied version dbname compress_name errorrtn msgrtn statusrtn display_free_pages quiet version. : 1. compress_name. display_free_pages quiet record_unchanged stats. : 1. : 1. Parameter Beschreibung DBTools-Versionsnummer Name der zu komprimierenden Datenbank Dateiname der komprimierten Datenbank Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Callback-Routine für die Behandlung einer Statusmeldung Informationen über freie Seiten anzeigen Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) 339 . errorrtn. um Datenbank-Komprimierungsaufgaben mit der DBTools-Bibliothek auszuführen. die gebraucht werden. msgrtn. confirmrtn.

a_compress_stats-Struktur Funktion Syntax Enthält statistische Informationen über komprimierte Datenbankdateien. a_stats_line indices. typedef struct a_compress_stats { a_stats_line tables. Mitglied tables Indices Other Free Total free_pages Unchanged Beschreibung Enthält Information zur Komprimierung von Tabellen Enthält Information zur Komprimierung von Indizes Enthält weitere Information zur Komprimierung Enthält Informationen über freien Speicherplatz Enthält allgemeine Information zur Komprimierung Enthält Informationen über freie Seiten Anzahl der Seiten. Zeigt an. a_compress_stats confirmrtn noconfirm encryption_key Siehe auch "DBCompress-Funktion" auf Seite 325 "a_compress_stats-Struktur" auf Seite 340 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. a_stats_line other.DBTools-Strukturen Mitglied record_unchanged Beschreibung Auf 1 gesetzt. a_sql_int32 unchanged. um das Element unchanged zu haben Zeiger auf eine Struktur vom Typ a_compress_stats. a_stats_line free. dass die Struktur a_compress_stats neu genug ist. a_sql_int32 free_pages. Wird belegt. die der Komprimierungsalgorithmus nicht schrumpfen konnte Parameter 340 . } a_compress_stats. a_stats_line total. wenn das Element nicht NULL ist und wenn display_free_pages nicht 0 (Null) ist Callback-Routine für die Bestätigung einer Aktion Mit (0) oder ohne (1) Bestätigung arbeiten Der Chiffrierschlüssel für die Datenbankdatei.

blank_pad respect_case encrypt debug dbo_avail mirrorname_present avoid_view_collisions collation_id. 341 . mirrorname. data_store_type encryption_key. java_classes : 1. dbname. database_version. verbose. die gebraucht werden. typedef struct a_create_db { unsigned short const char * const char * const char * short const char * MSG_CALLBACK MSG_CALLBACK short char a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field short const char * const char * const char * a_bit_field a_bit_field const char * const char * const char * const char * } a_create_db. startline. um eine Datenbank mit der DBTools-Bibliothek zu erstellen. : 1. msgrtn. : 1. jdK_version. : 1. page_size. jconnect : 1. dbo_username. : 1. : 1.Kapitel 8 Die DBTools-Schnittstelle Siehe auch "DBCompress-Funktion" auf Seite 325 "a_compress_db-Struktur" auf Seite 339 a_create_db-Struktur Funktion Syntax Enthält die Informationen. encryption_algorithm. logname. : 1. default_collation. version. errorrtn. encryption_dllname. : 2.

dass die DBTools-Version neu genug ist.DBTools-Strukturen Parameter Mitglied version dbname logname startline Beschreibung DBTools-Versionsnummer Datenbankdateiname Neuer Transaktionslogname Befehlszeile zum Starten der Datenbank-Engine. um das Feld mirrorname zu unterstützen Die Erzeugung der Watcom SQL-KompatibilitätsAnsichten SYS. Für Java aktivierte Datenbank erstellen encrypt debug dbo_avail mirrorname_present avoid_view_collisions collation_id dbo_username mirrorname encryption_dllname java_classes 342 . page_size default_collation errorrtn msgrtn database_version verbose blank_pad respect_case Die Seitengröße der Datenbank Die Kollatierung für die Datenbank Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Die Versionsnummer der Datenbank Im ausführlichen Darstellungsmodus ausführen Leerzeichen in Zeichenfolgevergleichen beachten und entsprechende Indexinformationen speichern Groß/Kleinschreibung in Zeichenfolgevergleichen beachten und entsprechende Indexinformationen speichern Datenbank verschlüsseln Reserviert Auf 1 gesetzt. Das folgende Beispiel zeigt eine Startzeile: "c:\asa\win32\dbeng8. Der Benutzer dbo ist in dieser Datenbank verfügbar.SYSCOLUMNS und SYS. wenn dieses Element NULL ist. Auf 1 setzen. zeigt an.SYSINDEXES vermeiden Kollatierungsname (identifier) Nicht mehr benutzt: auf NULL gesetzt Name des Transaktionslogspiegels Die zum Verschlüsseln der Datenbank verwendete DLL.exe" Die standardmäßige Startzeile wird benutzt.

a_crypt_db-Struktur Funktion Syntax Enthält die Informationen. die auch das dbinit-Dienstprogramm benutzt. die für die Ausführung der Verschlüsselung verwendet wird Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Callback-Routine für die Behandlung einer Statusmeldung Im ausführlichen Darstellungsmodus ausführen Ohne Nachrichten arbeiten Reserviert Parameter 343 . Mitglied dbname dllname errorrtn msgrtn statusrtn verbose quiet debug Beschreibung Datenbankdateiname Der Name der DLL. char verbose. a_bit_field debug : 1. MSG_CALLBACK statusrtn. MSG_CALLBACK msgrtn. die zum Verschlüsseln einer Datenbankdatei verwendet werden.Kapitel 8 Die DBTools-Schnittstelle Mitglied jconnect data_store_type encryption_key encryption_algorithm jdk_version Siehe auch Beschreibung Für jConnect erforderliche Systemprozeduren einbeziehen Reserviert NULL benutzen Der Chiffrierschlüssel für die Datenbankdatei. typedef struct a_crypt_db { const char _fd_ * dbname. AESoder MDSR eingeben. } a_crypt_db. a_bit_field quiet : 1. const char _fd_ * dllname. "DBCreate-Funktion" auf Seite 325 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316 . MSG_CALLBACK errorrtn. Einer der Werte für die Option dbinit -jdk.

include_empty hex_for_extended replace quiet input_filename. : 1. Das folgende Beispiel zeigt eine Startzeile: "c:\asa\win32\dbeng8. typedef struct a_db_collation { unsigned short const char * const char * const char * const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK a_bit_field a_bit_field a_bit_field a_bit_field const char * const char _fd_ * } a_db_collation. startline. wenn dieses Element NULL ist. confirmrtn errorrtn msgrtn Callback-Routine für die Bestätigung einer Aktion Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht 344 . um mit der DBToolsBibliothek eine Kollatierungssequenz aus der Datenbank zu extrahieren.PWD=SQL. Parameter Beschreibung DBTools-Versionsnummer Parameter für die Verbindung zur Datenbank.DBTools-Strukturen Siehe auch "DBCrypt-Funktion" auf Seite 326 "Datenbank mit dem Befehlszeilenprogramm ""dbinit"" erstellen" auf Seite 516 der Dokumentation ASA Datenbankadministration a_db_collation-Struktur Funktion Syntax Enthält die Informationen. msgrtn. : 1. die gebraucht werden. collation_label. confirmrtn.db" $ Alle Zeichenfolgen für die Verbindung finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. Mitglied version connectparms version. errorrtn. : 1. filename.DBF=c:\asa\asademo. connectparms. mapping_filename. zum Beispiel: "UID=DBA. : 1. Sie haben die Form von Zeichenfolgen.exe" Die standardmäßige Startzeile wird benutzt.

Kapitel 8 Die DBTools-Schnittstelle Mitglied include_empty hex_for_extended replace quiet input_filename mapping_filename Siehe auch Beschreibung Leere Zuordnungen für Lücken in der Kollatierungssequenz schreiben Zweiziffrige Hexadezimalzahlen benutzen. um high-valueZeichen zu repräsentieren Ohne Bestätigungsaktionen arbeiten Ohne Nachrichten arbeiten Kollatierungsdefinition eingeben Ausgabe von syscollationmapping "DBCollate-Funktion" auf Seite 324 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. um dbinfo-Informationen mit der DBTools-Bibliothek zurückzugeben. a_db_info-Struktur Funktion Enthält die Informationen. die gebraucht werden. 345 .

dbname. dbbufsize. connectparms. file_size. errorrtn. classesversionbufsize. collationnamebufsize. mirrorname_present : 1. logbufsize. collationnamebuffer. sysinfo. statusrtn. other_pages. quiet : 1. compressed : 1. startline. dbnamebuffer. lognamebuffer. classesversionbuffer.DBTools-Strukturen Syntax typedef struct a_db_info { unsigned short MSG_CALLBACK const char * unsigned short char * unsigned short char * unsigned short char * a_bit_field a_bit_field a_sysinfo unsigned long a_bit_field const char * const char * MSG_CALLBACK MSG_CALLBACK a_bit_field a_table_info * unsigned long unsigned long unsigned long unsigned short char * char * char * unsigned short char * unsigned short } a_db_info. wrtbufsize. unused_field. Parameter Beschreibung DBTools-Versionsnummer Callback-Routine für die Behandlung einer Fehlermeldung Datenbankdateiname Länge des Elements dbnamebuffer Datenbankdateiname Länge des Elements lognamebuffer Transaktionslog-Dateiname Länge des Elements wrtnamebuffer Name der Write-Datei 346 . totals. mirrornamebuffer. mirrorbufsize. free_pages. msgrtn. wrtnamebuffer. page_usage : 1. Mitglied version errortrn dbname dbbufsize dbnamebuffer logbufsize lognamebuffer wrtbufsize wrtnamebuffer version. unused_pages.

msgrtn statusrtn page_usage totals file_size unused_pages other_pages mirrorbufsize mirrornamebuffer Callback-Routine für die Behandlung einer Informationsnachricht Callback-Routine für die Behandlung einer Statusmeldung 1.Kapitel 8 Die DBTools-Schnittstelle Mitglied quiet mirrorname_present sysinfo free_pages compressed connectparms Beschreibung Ohne Bestätigungsnachrichten arbeiten Auf 1 setzen. um das Feld mirrorname zu unterstützen Zeiger auf eine a_sysinfo-Struktur Anzahl der freien Seiten 1 falls komprimiert.exe" Die standardmäßige Startzeile wird benutzt.PWD=SQL. zeigt an. sonst 0 Parameter für die Verbindung zur Datenbank. wenn dieses Element NULL ist. Das folgende Beispiel zeigt eine Startzeile: "c:\asa\win32\dbeng8.noch Indexseiten sind Länge des Elements mirrornamebuffer Name des Transaktionslogspiegels 347 . zum Beispiel: "UID=DBA. dass die DBTools-Version neu genug ist. die weder Tabellen. um Auskunft zu geben über Seitennutzungs-Statistiken. Sie haben die Form von Zeichenfolgen. sonst 0 Zeiger auf eine a_table_info-Struktur Größe der Datenbankdatei Anzahl der nicht genutzten Seiten Anzahl der Seiten.DBF=c:\Programme \Sybase\SQL Anywhere 8\asademo.db" $ Alle Zeichenfolgen für die Verbindung finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine.

1. char * platform_str. wie z. char * compname. MSG_CALLBACK msgrtn. } a_dblic_info. a_bit_field query_only : 1. a_bit_field quiet : 1. 1. a_sql_int32 nodecount.3. a_sql_int32 conncount.3 oder eine leere Zeichenfolge. Parameter 348 .1. Mitglied version exename username compname platform_str nodecount Beschreibung DBTools-Versionsnummer Name der ausführbaren Datei Benutzername für die Lizenz Name des Unternehmens für die Lizenz Betriebssystem: WinNT oder NLM oder UNIX Anzahl der Knotenlizenzen. char * exename. Sie dürfen diese Informationen nur gemäß Ihrem Lizenzvertrag benutzen. a_license_type type. typedef struct a_dblic_info { unsigned short version. char * username.8. 1. MSG_CALLBACK errorrtn.DBTools-Strukturen Mitglied collationnamebuffer collationnamebufsize key_file classesversionbuffer Beschreibung Name und Bezeichnung der Datenbankkollatierung (Maximum ist 128+1) Länge des Elements collationnamebuffer Eine Datei mit dem Chiffrierschlüssel Die JDK-Version der installierten Java-Klassen.1. a_dblic_info-Struktur Funktion Syntax Enthält Angaben zu den Lizenzdaten. falls JavaKlassen nicht in der Datenbank installiert sind (die maximale Größe beträgt 10+1) Länge des Elements classesversionbuffer classesversionbufsize Siehe auch "DBInfo-Funktion" auf Seite 327 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.B.

a_dbtools_info-Struktur Funktion Syntax Enthält die Informationen.Kapitel 8 Die DBTools-Schnittstelle Mitglied conncount type errorrtn msgrtn quiet query_only Beschreibung Muss 1000000L sein Werte finden Sie unter lictype. typedef struct a_dbtools_info { MSG_CALLBACK errorrtn. die gebraucht werden. 349 . Wenn 0. um die Arbeit mit der DBTools-Bibliothek zu beginnen und zu beenden. nur die Lizenzinformationen anzeigen. die gebraucht werden. Änderung der Informationen zulassen. an_erase_db-Struktur Funktion Enthält die Informationen. um eine Datenbank mit der DBTools-Bibliothek zu löschen. Mitglied errorrtn Beschreibung Callback-Routine für die Behandlung einer Fehlermeldung Parameter Siehe auch "DBToolsFini-Funktion" auf Seite 330 "DBToolsInit-Funktion" auf Seite 331 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. } a_dbtools_info.h Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Wenn 1.

DBTools-Strukturen Syntax typedef struct an_erase_db { unsigned short const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK a_bit_field a_bit_field const char * } an_erase_db. msgrtn. erase : 1. encryption_key. 350 . Mitglied version dbname confirmrtn errorrtn msgrtn quiet erase encryption_key Beschreibung version. Siehe auch "DBErase-Funktion" auf Seite 327 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. die für die Datenbankdekomprimierung mit der DBTools-Bibliothek gebraucht werden. an_expand_db-Struktur Funktion Enthält Informationen. quiet : 1. confirmrtn. Parameter DBTools-Versionsnummer Name der zu löschenden Datenbankdatei Callback-Routine für die Bestätigung einer Aktion Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Ohne Bestätigung löschen (1) oder mit Bestätigung (0) Der Chiffrierschlüssel für die Datenbankdatei. dbname. errorrtn.

351 . a_name-Struktur Funktion Enthält eine verkettete Liste von Namen. Parameter DBTools-Versionsnummer Name der komprimierten Datenbankdatei Datenbankdateiname Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Callback-Routine für die Behandlung einer Statusmeldung Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Callback-Routine für die Bestätigung einer Aktion Mit (0) oder ohne (1) Bestätigung arbeiten Eine Datei mit dem Chiffrierschlüssel Der Chiffrierschlüssel für die Datenbankdatei. Siehe auch "DBExpand-Funktion" auf Seite 327 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. key_file. compress_name. quiet : 1. confirmrtn. statusrtn. die Namenslisten erfordern. errorrtn. msgrtn. noconfirm : 1. Mitglied version compress_name dbname errorrtn msgrtn statusrtn quiet confirmrtn noconfirm key_file encryption_key Beschreibung version.Kapitel 8 Die DBTools-Schnittstelle Syntax typedef struct an_expand_db { unsigned short const char * const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK a_bit_field MSG_CALLBACK a_bit_field const char * const char * } an_expand_db. dbname. Wird von anderen Strukturen benutzt. encryption_key.

die für den Gebrauch des Dienstprogramms dbmlsync mit der DBTools-Bibliothek benötigt werden. char name[1].DBTools-Strukturen Syntax typedef struct a_name { struct a_name * next. long bytes. long compressed_bytes. } a_name. * p_name. 352 . Mitglied Pages Bytes Compressed_bytes Beschreibung Anzahl der Seiten Anzahl der Bytes für die nicht komprimierte Datenbank Anzahl der Bytes für die komprimierte Datenbank Syntax Parameter Siehe auch "a_compress_stats-Struktur" auf Seite 340 a_sync_db-Struktur Funktion Enthält Informationen. welche für die Komprimierung und Dekomprimierung der Datenbank mit der DBTools-Bibliothek gebraucht werden. } a_stats_line. typedef struct a_stats_line { long pages. Mitglied next Name p_name Beschreibung Zeiger auf eine next a_name-Struktur in der Liste Der Name Zeiger auf die vorangehende a_name-Struktur Parameter Siehe auch "a_translate_log-Struktur" auf Seite 357 "a_validate_db-Struktur" auf Seite 363 "an_unload_db-Struktur" auf Seite 359 a_stats_line-Struktur Funktion Enthält Informationen.

MSG_CALLBACK errorrtn. const char _fd_ * include_scan_range. char _fd_ * script_full_path. char _fd_ * extended_options. MSG_CALLBACK msgrtn. const char _fd_ * offline_dir. MSG_CALLBACK logrtn.Kapitel 8 Die DBTools-Schnittstelle Syntax typedef struct a_sync_db { unsigned short version. char _fd_ * connectparms. char _fd_ * publication. MSG_CALLBACK confirmrtn. 353 . const char _fd_ * raw_file.

354 . char ** pub_name_list. a_bit_field dl_use_put : 1. a_bit_field retry_remote_behind : 1. a_bit_short verbose_download : 1. a_bit_field ignore_hook_errors : 1. a_bit_field retry_remote_ahead : 1. a_bit_field use_hex_offsets : 1. a_bit_field hide_conn_str : 1. char _fd_ * mlpassword. a_SQL_uint32 dlg_launch_focus. char ** ce_argv. a_bit_short _unused : 9. a_bit_short verbose_upload_data : 1. a_bit_field dl_use_upsert : 1. a_bit_field prompt_again : 1. a_bit_field debug_dump_char : 1. a_bit_field used_dialog_allocation : 1. a_bit_short ping : 1. a_bit_field ignore_debug_interrupt : 1. a_bit_field ignore_scheduling : 1. MSG_QUEUE_CALLBACK msgqueuertn. a_bit_field rename_log : 1. a_bit_field output_to_file : 1. a_bit_field entered_dialog : 1. SET_PROGRESS_CALLBACK progress_index_rtn.DBTools-Strukturen a_SQL_uint32 debug_dump_size. a_bit_field debug : 1. a_bit_field changing_pwd : 1. char ** argv. a_bit_short verbose_upload : 1. a_bit_field verbose : 1. a_SQL_uint32 pub_name_cnt. a_bit_field connectparms_allocated : 1. USAGE_CALLBACK usage_rtn. a_bit_field hide_ml_pwd : 1. a_bit_field output_to_mobile_link : 1. a_bit_field delay_ml_disconn : 1. a_sql_uint32 hovering_frequency. a_bit_field debug_dump_hex : 1. a_bit_field use_relative_offsets : 1. a_bit_field kill_other_connections : 1. a_bit_field debug_page_offsets : 1. a_SQL_uint32 dl_insert_width. a_bit_short ignore_hovering : 1. SET_WINDOW_TITLE_CALLBACK set_window_title_rtn. a_bit_short verbose_download_data : 1. a_bit_short autoclose : 1. MSG_CALLBACK progress_msg_rtn. char _fd_ * verify_mlpassword. char * default_window_title. char _fd_ * new_mlpassword.

$ Weitere Hinweise finden Sie unter "MobiLink-Synchronisationsclient" auf Seite 440 der Dokumentation MobiLink Benutzerhandbuch. Siehe auch: "DBSynchronizeLog-Funktion" auf Seite 330 a_syncpub-Struktur Funktion Syntax typedef struct a_syncpub { struct a_syncpub _fd_ * char _fd_ * char _fd_ * a_bit_field } a_syncpub. die für das Dienstprogramm dbmlsync benötigt werden. NULL für den letzten Knoten Für diesen –n-Parameter angegebene Publikationsnamen. ext_opt. alloced_by_dbsync: 1. Die Parameter entsprechen Funktionen. Beschreibung Zeiger auf den nächsten Knoten in der Liste. mit Ausnahme der von dbtool8. In der Header-Datei dbtools. 0 (Null) falls nicht FALSE.Kapitel 8 Die DBTools-Schnittstelle char _fd_ * a_syncpub _fd_ * char _fd_ * char _fd_ * } a_sync_db. die über das Dienstprogramm dbmlsync zugänglich sind.dll erstellten Knoten ext_opt encryption alloced_by_dbsync 355 . Erweiterte Optionen. pub_name. Parameter Mitglied a_syncpub pub_name next. Dies ist die exakte Zeichenfolge nach -n in der Befehlszeile. Enthält Informationen. log_file_name. upload_defs.h finden Sie weitere Kommentare. Parameter encryption_key. user_name. die mit dem Parameter -eu angegeben werden 1 falls die Datenbank verschlüsselt ist.

0 (Null) falls nicht 1 falls die Datenbank verschlüsselt ist.DBTools-Strukturen a_sysinfo-Struktur Funktion Enthält Informationen. encryption : 1. a_sql_uint32 index_used_pct. unsigned long index_pages. unsigned long table_used. ob die folgenden Werte gesetzt sind 1 falls Auffüllen mit Leerzeichen in der Datenbank benutzt wird. a_sql_uint32 table_used_pct. Parameter Mitglied valid_date blank_padding case_sensitivity encryption default_collation page_size Beschreibung Bit-Feld. blank_padding : 1. typedef struct a_sysinfo { a_bit_field a_bit_field a_bit_field a_bit_field char unsigned short } a_sysinfo. unsigned long table_pages. } a_table_info. char * table_name. unsigned long index_used. 0 (Null) falls nicht 1 falls die Datenbank Groß/Kleinschreibung beachtet. das angibt. page_size. 356 . unsigned short table_id. default_collation[11]. case_sensitivity : 1. typedef struct a_table_info { struct a_table_info * next. 0 (Null) falls nicht Die Kollatierungssequenz für die Datenbank Die Seitengröße für die Datenbank Siehe auch "a_db_info-Struktur" auf Seite 345 a_table_info-Struktur Funktion Syntax Enthält Informationen über eine Tabelle. die als Teil der a_db_info-Struktur gebraucht wird. valid_data : 1. die für den Gebrauch der Dienstprogramme dbinfo und dbunload mit der DBTools-Bibliothek benötigt werden.

char userlisttype. a_bit_field include_trigger_trans : 1. MSG_CALLBACK errorrtn.Kapitel 8 Die DBTools-Schnittstelle Parameter Mitglied next table_id table_pages index_pages table_used index_used table_name table_used_pct index_used_pct Beschreibung Nächste Tabelle in der Liste ID-Nummer für diese Tabelle Anzahl der Tabellenseiten Anzahl der Indexseiten Anzahl der in den Tabellenseiten benutzten Bytes Anzahl der in den Indexseiten benutzten Bytes Name der Tabelle Verwendung des Tabellenbereichs als Prozentsatz Verwendung des Indexbereichs als Prozentsatz Siehe auch "a_db_info-Struktur" auf Seite 345 a_translate_log-Struktur Funktion Syntax Enthält Informationen. unsigned long since_time. p_name userlist. a_bit_field replace : 1. const char * sqlname. a_bit_field omit_comments : 1. const char * logname. a_bit_field remove_rollback : 1. typedef struct a_translate_log { unsigned short version. 357 . die für die Konvertierung des Transaktionslogs mit der DBTools-Bibliothek gebraucht werden. MSG_CALLBACK msgrtn. const char _fd_ * reserved_1. MSG_CALLBACK confirmrtn. a_bit_field comment_trigger_trans : 1. a_bit_field ansi_SQL : 1. a_bit_field since_checkpoint: 1. a_bit_field debug : 1.

encryption_key. include_tables. recovery_ops. repserver_users. debug_dump_hex : 1. debug_page_offsets : 1. force_chaining : 1. match_pos. die für das Kürzen des Transaktionslogs mit der DBTools-Bibliothek gebraucht werden. recovery_bytes. use_hex_offsets : 1. force_recovery : 1. include_audit : 1. Parameter reserved_2. a_truncate_log-Struktur Funktion Enthält Informationen. show_undo :1. reserved_3 : 1. queueparms. Die Parameter entsprechen Funktionen. statusrtn. generate_reciprocals :1. debug_sql_remote : 1. die über das Dienstprogramm dbtran zugänglich sind. include_publications. include_source_sets. include_scan_range. include_destination_sets. use_relative_offsets : 1. debug_dump_char : 1. 358 . include_subsets : 1. chronological_order : 1. match_mode :1. Siehe auch "DBTranslateLog-Funktion" auf Seite 332 "a_name-Struktur" auf Seite 351 "dbtran_userlist_type-Aufzählungstyp" auf Seite 368 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. debug_dump_size. logs_dir.DBTools-Strukturen const char _fd_ * a_sql_uint32 a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_sql_uint32 a_sql_uint32 const char _fd_ * const char _fd_ * const char _fd_ * const char _fd_ * const char _fd_ * const char _fd_ * const char _fd_ * a_bit_field a_bit_field const char _fd_ * MSG_CALLBACK const char _fd_ * a_bit_field const char _fd_ * } a_translate_log. In der Header-Datei dbtools.h finden Sie weitere Kommentare.

errorrtn msgrtn quiet truncate_interrupted Siehe auch Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Gibt an. Parameter Beschreibung DBTools-Versionsnummer Parameter für die Verbindung zur Datenbank. 359 .Kapitel 8 Die DBTools-Schnittstelle Syntax typedef struct a_truncate_log { unsigned short const char * const char * MSG_CALLBACK MSG_CALLBACK a_bit_field char } a_truncate_log. msgrtn. truncate_interrupted. Das folgende Beispiel zeigt eine Startzeile: "c:\asa\win32\dbeng8. sind gekennzeichnet. um eine Datenbank mit der DBTools-Bibliothek zu entladen oder um eine entfernte Datenbank für SQL Remote zu extrahieren. Mitglied version connectparms version. connectparms. zum Beispiel: "UID=DBA. startline. dass der Vorgang unterbrochen wurde "DBTruncateLog-Funktion" auf Seite 332 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. errorrtn.PWD=SQL. an_unload_db-Struktur Funktion Enthält die Informationen. die vom SQL RemoteExtraktionsdienstprogramm dbxtract benutzt werden. wenn dieses Element NULL ist.DBF=c:\asa\asademo. Sie haben die Form von Zeichenfolgen.db" $ Alle Zeichenfolgen für die Verbindung finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. quiet : 1. die gebraucht werden. Die Felder.exe" Die standardmäßige Startzeile wird benutzt.

view_iterations. publisher_address. exclude_tables : 1. extract : 1. debug : 1. view_iterations_present : 1. start_subscriptions : 1. exclude_views : 1. dbo_username. more_flag_bits_present : 1. reload_filename. exclude_triggers : 1. temp_dir. isolation_set : 1. connectparms. 360 . confirmrtn. publisher_address_type. escape_char_present : 1. unload_type. msgrtn. exclude_procedures : 1. errorrtn. startline. include_where_subscribe : 1. subscriber_username. table_list_provided : 1. verbose. use_internal_unload : 1. remote_dir. unordered : 1. sysinfo. table_list. statusrtn. dbo_avail : 1.DBTools-Strukturen Syntax typedef struct an_unload_db { unsigned short const char * const char * const char * const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK char char a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_sysinfo const char * const char * const char * const char * const char * unsigned short a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field a_bit_field p_name a_bit_short a_bit_short unsigned short version. no_confirm : 1. exclude_foreign_keys : 1. isolation_level.

Kapitel 8 Die DBTools-Schnittstelle char char _fd_ * char _fd_ * a_bit_field char a_bit_field const char _fd_ * const char _fd_ * const char _fd_ * a_bit_field a_bit_field char _fd_ * const char _fd_ * const char _fd_ * a_bit_field a_bit_field } an_unload_db. Parameter escape_char. encryption_key. encryption_algorithm. unload_interrupted. site_name. an_upgrade_db-Struktur Funktion Enthält die Informationen. In der Header-Datei dbtools. reload_db_logname. syntax_version_7:1. exclude_hooks:1. reload_db_filename. Die Parameter entsprechen Funktionen. replace_db:1. die über die Dienstprogramme dbunload und dbxtract und mlxtract zugänglich sind. die gebraucht werden. Siehe auch "DBUnload-Funktion" auf Seite 333 "a_name-Struktur" auf Seite 351 "dbunload-Aufzählungstyp" auf Seite 368 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.h finden Sie weitere Kommentare. um eine Datenbank mit der DBTools-Bibliothek zu aktualisieren. locale. preserve_ids:1. remove_java:1. template_name. 361 . output_connections:1. reload_connectparms.

PWD=SQL. um das Feld dbo_mirrorname zu unterstützen 362 . dbo_avail : 1. java_switch_specified : 1.db" $ Alle Zeichenfolgen für die Verbindung finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. quiet : 1. connectparms. dbo_username.exe" Die standardmäßige Startzeile wird benutzt. startline. Parameter DBTools-Versionsnummer Parameter für die Verbindung zur Datenbank.DBF=c:\asa\asademo. jdk_version. msgrtn. Sie haben die Form von Zeichenfolgen. errorrtn. zum Beispiel: "UID=DBA. errorrtn msgrtn statusrtn quiet dbo_avail Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Callback-Routine für die Behandlung einer Statusmeldung Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Auf 1 gesetzt. dass die DBTools-Version neu genug ist.DBTools-Strukturen Syntax typedef struct an_upgrade_db { unsigned short const char * const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK a_bit_field a_bit_field const char * a_bit_field a_bit_field a_bit_field a_bit_field const char * } an_upgrade_db. Zeigt an. Das folgende Beispiel zeigt eine Startzeile: "c:\asa\win32\dbeng8. remove_java : 1. jconnect : 1. statusrtn. java_classes : 1. wenn dieses Element NULL ist. Mitglied version connectparms Beschreibung version.

tables. errorrtn. typedef struct a_validate_db { unsigned short const char * const char * p_name MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK a_bit_field a_bit_field a_validate_type } a_validate_db. version. sodass sie Java enthält Datenbank umstellen. statusrtn. die für Datenbankvalidierung mit der DBToolsBibliothek gebraucht werden. msgrtn. connectparms. a_validate_db-Struktur Funktion Syntax Enthält Informationen. 363 . type. startline. sodass die Java-Funktionen entfernt werden Einer der Werte für die Option dbinit -jdk "DBUpgrade-Funktion" auf Seite 333 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. sodass sie jConnect-Prozeduren akzeptiert Datenbank umstellen. quiet : 1. index : 1.Kapitel 8 Die DBTools-Schnittstelle Mitglied dbo_username java_classes jconnect remove_java jdk_version Siehe auch Beschreibung Der für den dbo zu benutzende Name Datenbank umstellen.

exe" Die standardmäßige Startzeile wird benutzt.DBTools-Strukturen Parameter Mitglied version connectparms Beschreibung DBTools-Versionsnummer Parameter für die Verbindung zur Datenbank. wenn dieses Element NULL ist. 364 . Sie haben die Form von Zeichenfolgen. die für die Verwaltung der Datenbank-Write-Datei mit der DBTools-Bibliothek gebraucht werden.DBF=c:\asa\asademo. Das folgende Beispiel zeigt eine Startzeile: "c:\Programme\Sybase\SA\win32\dbeng8. tables errorrtn msgrtn statusrtn quiet index type Zeiger auf eine verknüpfte Liste mit Tabellennamen Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Callback-Routine für die Behandlung einer Statusmeldung Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Indizes validieren Weitere Hinweise unter "a_validate_type-Aufzählungstyp" auf Seite 369 Siehe auch "DBValidate-Funktion" auf Seite 334 "a_name-Struktur" auf Seite 351 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.db" $ Alle Zeichenfolgen für die Verbindung finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine.PWD=SQL. zum Beispiel: "UID=DBA. a_writefile-Struktur Funktion Enthält Informationen.

writename. dbname. forcename. Ohne Bestätigung löschen (1) oder mit Bestätigung (0) 365 . Parameter Beschreibung DBTools-Versionsnummer Name der Write-Datei Wird nur für die Erstellung von Write-Dateien benutzt Wird zum Ändern und Erstellen von Write-Dateien benutzt Erzwungene Referenz auf einen Dateinamen Callback-Routine für die Bestätigung einer Aktion. Wird nur für die Erstellung einer Write-Datei benutzt Callback-Routine für die Behandlung einer Fehlermeldung Callback-Routine für die Behandlung einer Informationsnachricht Reserviert für Sybase Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Wird nur für die Erstellung von Write-Dateien benutzt. quiet : 1. errorrtn. wlogname. encryption_key. action. wlogmirrorname. make_log_and_mirror_names: 1. erase : 1.Kapitel 8 Die DBTools-Schnittstelle Syntax typedef struct a_writefile { unsigned short const char * const char * const char * const char * MSG_CALLBACK MSG_CALLBACK MSG_CALLBACK char a_bit_field a_bit_field a_bit_field a_bit_field const char * a_bit_field const char * } a_writefile. mirrorname_present : 1. force : 1. Mitglied version writename wlogname dbname forcename confirmrtn errorrtn msgrtn action quiet erase version. msgrtn. confirmrtn.

Write-Datei zwingend auf die angegebene Datei zeigen lassen Wird nur für die Erstellung von Write-Dateien benutzt. dass die DBTools-Version neu genug ist. Der Chiffrierschlüssel für die Datenbankdatei. zeigt an. um das Feld mirrorname zu unterstützen Name des Transaktionslogspiegels Wenn auf TRUE. 366 . verwenden Sie die Werte in wlogname und wlogmirrorname benutzt zum Festlegen der Dateinamen. wlogmirrorname make_log_and_mirro r_names encryption_key Siehe auch "DBChangeWriteFile-Funktion" auf Seite 324 "DBCreateWriteFile-Funktion" auf Seite 326 "DBStatusWriteFile-Funktion" auf Seite 329 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316. Auf 1 setzen.DBTools-Strukturen Mitglied force mirrorname_present Beschreibung Falls 1.

Wert VB_QUIET VB_NORMAL VB_VERBOSE Beschreibung Keine Ausgabe Normale Ausgabemenge Ausgabe ausführlich darstellen. enum { VB_QUIET. Die Aufzählungstypen sind alphabetisch aufgeführt. um den Wert von blank_pad anzugeben. enum { NO_BLANK_PADDING.Kapitel 8 Die DBTools-Schnittstelle DBTools-Aufzählungstypen Dieser Abschnitt führt die Aufzählungstypen auf. VB_NORMAL. die von der DBToolsBibliothek benutzt werden. VB_VERBOSE }. nützlich für die Fehlersuche Parameter Siehe auch "a_create_db-Struktur" auf Seite 341 "an_unload_db-Struktur" auf Seite 359 Auffüllen mit Leerzeichen Funktion Syntax Wird in der Struktur "a_create_db" (siehe "a_create_db-Struktur" auf Seite 341) benutzt. BLANK_PADDING }. Verbosity (Ausführlichkeit) Funktion Syntax Gibt die Ausführlichkeit der Ausgabe an. Wert NO_BLANK_PADDING BLANK_PADDING Beschreibung Benutzt kein Auffüllen mit Leerzeichen Benutzt Auffüllen mit Leerzeichen Parameter Siehe auch "a_create_db-Struktur" auf Seite 341 367 .

wie er unter "a_translate_log-Struktur" auf Seite 357 beschrieben ist. Wert UNLOAD_ALL UNLOAD_DATA_ONLY UNLOAD_NO_DATA Beschreibung Sowohl Daten wie auch Schema entladen Daten entladen Schema nicht entladen. der von der Struktur "an_unload-db" (siehe "an_unload_db-Struktur" auf Seite 359) benutzt wird. typedef enum dbtran_userlist_type { DBTRAN_INCLUDE_ALL. Wert DBTRAN_INCLUDE_ALL DBTRAN_INCLUDE_SOME DBTRAN_EXCLUDE_SOME Beschreibung Alle Benutzervorgänge einschliessen Nur Vorgänge der in der Benutzerliste aufgeführten Benutzer einschliessen Vorgänge der in der Benutzerliste aufgeführten Benutzer ausschliessen Parameter Siehe auch "a_translate_log-Struktur" auf Seite 357 dbunload-Aufzählungstyp Funktion Syntax Der Entladungstyp. UNLOAD_DATA_ONLY. DBTRAN_EXCLUDE_SOME } dbtran_userlist_type. UNLOAD_NO_DATA }. enum { UNLOAD_ALL. DBTRAN_INCLUDE_SOME.DBTools-Aufzählungstypen dbtran_userlist_type-Aufzählungstyp Funktion Syntax Typ einer Benutzerliste. Nur Schema entladen Parameter Siehe auch "an_unload_db-Struktur" auf Seite 359 368 .

typedef enum { VALIDATE_NORMAL = 0.und Datenprüfung mit der Expressprüfung validieren Zusätzlich zur Standardprüfung mit der Daten. VALIDATE_INDEX.Kapitel 8 Die DBTools-Schnittstelle a_validate_type-Aufzählungstyp Funktion Syntax Der ausgeführte Validierungstyp gemäß "a_validate_db-Struktur" auf Seite 363. VALIDATE_DATA. Wert VALIDATE_NORMAL VALIDATE_DATA VALIDATE_INDEX VALIDATE_EXPRESS VALIDATE_FULL Beschreibung Nur mit der Standardprüfung validieren Zusätzlich zur Standardprüfung mit der Datenprüfung validieren Zusätzlich zur Standardprüfung mit der Indexprüfung validieren Zusätzlich zur Standard. VALIDATE_EXPRESS.und Indexprüfung validieren Parameter Siehe auch "Datenbank mit dem Befehlszeilenprogramm ""dbvalid"" validieren" auf Seite 589 der Dokumentation ASA Datenbankadministration "VALIDATE TABLE-Anweisung" auf Seite 632 der Dokumentation ASA SQL-Referenzhandbuch 369 . VALIDATE_FULL } a_validate_type.

DBTools-Aufzählungstypen 370 .

welche die OLE DB-Schnittstelle verwenden. sondern über das Microsoft ActiveX-Datenobjekt (ADO)Programmierungsmodell.und ADOProgrammierschnittstellen Über dieses Kapitel In diesem Kapitel wird beschrieben. wie Sie die OLE DB-Schnittstelle zu Adaptive Server Anywhere verwenden. tun dies nicht direkt. Viele Anwendungen. In diesem Kapitel wird auch die ADOProgrammierung mit Adaptive Server Anywhere beschrieben.K A P I T E L 9 Die OLE DB. Inhalt Thema Einführung zu OLE DB ADO-Programmierung mit Adaptive Server Anywhere Unterstützte OLE DB-Schnittstellen Seite 372 374 382 371 .

Für Windows CE und Nachfolger wurde der OLE DB-Provider für ADOCE 3.0 und Visual Basic 6. wird hier nicht vorausgesetzt.0 entwickelt wurden. Wenn Sie Adaptive Server Anywhere-Provider verwenden. Dieser Provider steht für aktuelle Windows. ADOCE ist der Microsoft ADO für Windows CE SDK und bietet Datenbankfunktionen für Anwendungen. wobei jedoch nicht garantiert wird. dass die Datenquelle einen SQLAbfrageprozessor verwendet. haben Sie Zugriff auf sämtliche Adaptive Server Anywhere-Funktionen aus OLE DBProgrammierumgebungen. die mit den Windows CE Toolkits für Visual Basic 5. Wenn Sie Adaptive Server Anywhere OLE DB-Provider verwenden. anders als bei ODBC.sowie für Windows CE-Plattformen zur Verfügung. Mit MSDASQL können OLE DB-Clients mit jedem ODBC-Treiber arbeiten. wie z. Adaptive Server Anywhere enthält einen OLE DB-Provider namens ASAProv. $ Eine Liste der unterstützten Plattformen finden Sie unter "Betriebssystemversionen" auf Seite 150 der Dokumentation SQL Anywhere Studio Erste Orientierung.Einführung zu OLE DB Einführung zu OLE DB OLE DB ist ein Datenzugriffsmodell von Microsoft. dass Sie sämtliche Funktionen jedes ODBC-Treibers nutzen können.5 und höher arbeitet. Unterstützte Plattformen Der Adaptive Server Anywhere OLE DB-Provider wurde so entwickelt. dass er mit OLE DB 2. ist ODBC für Ihre Entwicklung nicht erforderlich.0 und höher entwickelt. Es verwendet Component Object Model (COM)-Schnittstellen und. 372 . Die Verwendung des OLE DB-Providers von Adaptive Server Anywhere bietet mehrere Vorteile: ♦ ♦ ♦ Einige Funktionen. Sie können auf Adaptive Server Anywhere auch über den Microsoft OLE DB Provider für ODBC (MSDASQL) zusammen mit dem ODBC-Treiber von Adaptive Server Anywhere zugreifen.B. die Aktualisierung über einen Cursor. sind bei Verwendung der OLE DB/ODBC Brücke nicht verfügbar.

und ADO-Programmierschnittstellen Verteilte Transaktionen Der OLE DB-Treiber kann in einer Umgebung mit verteilten Transaktionen als Ressourcen-Manager eingesetzt werden.Kapitel 9 Die OLE DB. $ Weitere Hinweise finden Sie unter "Dreischichtige Datenverarbeitung und verteilte Transaktionen" auf Seite 399. 373 .

0 Microsoft eMbedded Visual Basic 3. Er stellt keine vollständige Anleitung zur Programmierung mit ADO dar. um den Datenzugriff bereitzustellen.sybase. finden Sie im Whitepaper "Accessing Data in Adaptive Server Anywhere Using ADO and Visual Basic" unter http://www. Eine Datenbank mit einem Verbindungsobjekt verbinden In diesem Abschnitt wird eine einfache Visual Basic-Routine beschrieben.ebp $ Weitere Hinweise zur Programmierung in ADO finden Sie im Handbuch Ihres Entwicklungstools. 374 . In diesem Abschnitt wird beschrieben.0 Beispiel Samples\ASA\VBSampler\vbsampler. die es Clientanwendungen ermöglicht. die eine Verbindung zu einer Datenbank herstellt.ADO-Programmierung mit Adaptive Server Anywhere ADO-Programmierung mit Adaptive Server Anywhere Bei ADO (ActiveX-Datenobjekte) handelt es sich um ein Datenzugriffsmodell. Wenn Sie den Adaptive Server Anywhere OLE DB-Provider verwenden. Codebeispiele aus diesem Abschnitt finden Sie in den folgenden Dateien: Entwicklungs-Tool Microsoft Visual Basic 6. ohne das Objekt vorher zu kennen. ADO verwendet OLE DB. $ Detaillierte Erläuterungen zur Verwendung von ADO und Visual Basic. wie grundlegende Aufgaben während der Verwendung von ADO aus Visual Basic ausgeführt werden. das über eine Automationsschnittstelle zugänglich wird. um auf Daten in einer Adaptive Server Anywhere-Datenbank zuzugreifen. die Methoden und Eigenschaften von Objekten in Laufzeit zu erfassen. haben Sie aus einer ADO-Programmierungsumgebung Zugriff auf sämtliche Adaptive Server Anywhere-Funktionen.com/detail?id=1017429. Mit Hilfe von Automation können Skriptsprachen wie Visual Basic ein Standardmodell für Datenzugriffsobjekte verwenden.vbp Samples\ASA\ADOCE\OLEDB_PocketPC.

die eine Meldung im Fenster des Datenbankservers anzeigt.Open MsgBox "Verbindung erfolgreich" myConn. Es beendet die Verbindung.Command Dim cAffected As Long On Error GoTo HandleError ’ Verbindung herstellen myConn. 375 . Der Registriervorgang umfasst auch die Registriereinträge in dem Abschnitt COM der Registry. Wenn der ASAProv-Provider installiert ist. Private Sub cmdTestConnection_Click() ’ Variable deklarieren Dim myConn As New ADODB.Kapitel 9 Die OLE DB. sodass ADO die Position der DLL ermitteln kann.Close Exit Sub HandleError: MsgBox "Verbindung nicht erfolgreich" Exit Sub End Sub Hinweise Das Beispiel führt die folgenden Aufgaben aus: ♦ ♦ ♦ ♦ Es deklariert die Variablen. die in der Routine verwendet werden. Führen Sie das Programm aus und klicken Sie auf die Schaltfläche.Provider = "ASAProv" myConn. registriert er sich selbst. indem Sie eine Befehlsschaltfläche namens Command1 in einer Maske platzieren und die Routine in ihr ClickEreignis einfügen.Connection Dim myCommand As New ADODB. um eine Verbindung herzustellen und trennen Sie die Verbindung dann. Es verwendet ein Befehlsobjekt zur Ausführung einer einfachen Anweisung. Es stellt mit Hilfe des OLE DB-Providers von Adaptive Server Anywhere eine Verbindung zur Beispieldatenbank her.0 Sample" myConn. v So registrieren Sie den OLE DB-Provider: 1 Öffnen Sie eine Befehlszeile. wenn der ASAProv-Provider aufgerufen wird.ConnectionString = _ "Data Source=ASA 8.und ADO-Programmierschnittstellen Beispielcode Sie können diese Routine ausprobieren. Wenn Sie den Speicherort Ihrer DLL ändern. müssen Sie sie neu registrieren.

Command Dim cAffected As Long ’Verbindung herstellen myConn. 376 . in dem der OLE DB-Provider installiert ist.CommandText = _ "update customer set fname='Liz' where id=102" Set myCommand. vbInformation myConn. eine Meldung im Fenster des Datenbankservers anzuzeigen. Geben Sie den folgenden Befehl ein. und trennen Sie die Verbindung dann. erstellt der Beispielcode ein Befehlsobjekt und stellt die Eigenschaft CommandText auf eine UpdateAnweisung und die Eigenschaft ActiveConnection auf die aktuelle Verbindung ein. Beispielcode Sie können diese Routine ausprobieren.ActiveConnection = myConn myCommand. Private Sub cmdUpdate_Click() ’ Variable deklarieren Dim myConn As New ADODB.Connection Dim myCommand As New ADODB. finden Sie unter "Verbinden mit einer Datenbank über OLE DB" auf Seite 75 der Dokumentation ASA Datenbankadministration.Execute cAffected MsgBox CStr(cAffected) + " rows affected.".ConnectionString = _ "Data Source=ASA 8. um den Provider zu registrieren: regsvr32 dboledb8.ADO-Programmierung mit Adaptive Server Anywhere 2 3 Wechseln Sie zu dem Verzeichnis.0 Sample" myConn.Open 'Befehl ausführen myCommand. indem Sie eine Befehlsschaltfläche namens Command2 in einer Maske platzieren und die Routine in ihr ClickEreignis einfügen. wie Sie mit OLE DB eine Verbindung zu einer Datenbank herstellen.Close End Sub Hinweise Nachdem eine Verbindung hergestellt wurde.dll $ Weitere Hinweise. Dann führt er die Update-Anweisung aus und zeigt die Anzahl der von der Aktualisierung betroffenen Zeilen in einem Meldungsfeld an. Führen Sie das Programm aus und klicken Sie auf die Schaltfläche. Anweisungen mit dem Befehlsobjekt ausführen In diesem Abschnitt wird eine einfache Routine beschrieben.Provider = "ASAProv" myConn. um eine Verbindung herzustellen. die eine einfache SQL-Anweisung an die Datenbank sendet.

sobald sie ausgeführt wurde. Führen Sie das Programm aus und klicken Sie auf die Schaltfläche. Datenbank mit dem Recordset-Objekt abfragen Das ADO-Recordset-Objekt stellt die Ergebnismenge einer Abfrage dar. $ Weitere Hinweise zur Verwendung von Transaktionen in ADO finden Sie unter "Transaktionen verwenden" auf Seite 381. indem Sie eine Befehlsschaltfläche mit dem Namen cmdQuery in ein Formular einfügen und die Routine in ihr Click-Ereignis einfügen. Danach trennen Sie die Verbindung. eine Meldung im Fenster des Datenbankservers anzuzeigen. eine Abfrage auszuführen und die ersten Zeilen in Meldungsfeldern anzuzeigen. um Daten aus einer Datenbank anzuzeigen.Kapitel 9 Die OLE DB. $ Weitere Hinweise finden Sie unter "Daten mit einem Cursor aktualisieren" auf Seite 379. um eine Verbindung herzustellen. Sie können Aktualisierungen auch über einen Cursor ausführen.und ADO-Programmierschnittstellen In diesem Beispiel wird die Aktualisierung an die Datenbank gesendet und festgeschrieben. Beispielcode Sie können diese Routine ausprobieren. Sie können es benutzen. 377 .

ADO-Programmierung mit Adaptive Server Anywhere Private Sub cmdQuery_Click() ’ Variable deklarieren Dim myConn As New ADODB.Provider = "ASAProv" myConn.MoveFirst For i = 1 To 5 MsgBox myRS.Close Exit Sub ErrorHandler: MsgBox Error(Err) Exit Sub End Sub Hinweise Das Recordset-Objekt in diesem Beispiel enthält die Ergebnisse aus einer Abfrage der Tabelle Kunden.Connection Dim myCommand As New ADODB.LockType = adLockOptimistic myRS.CursorType = adOpenKeyset myRS. vbInformation myRS.0 Sample" myConn.Recordset On Error GoTo ErrorHandler: ’ Verbindung herstellen myConn.ActiveConnection = myConn myRS. Die Schleife For blättert durch die ersten Zeilen und zeigt den Wert company_name für jede Zeile an.IsolationLevel = adXactCursorStability myConn.Mode = adModeReadWrite myConn.Open 'Eine Abfrage ausführen Set myRS = New Recordset myRS.ConnectionString = _ "Data Source=ASA 8. 378 .CursorLocation = adUseServer myConn. $ Weiterführende Beispiele für die Verwendung eines Cursors aus ADO finden Sie unter "Mit dem Recordset-Objekt arbeiten" auf Seite 379.CacheSize = 50 myRS.Command Dim myRS As New ADODB.Fields("company_name"). Hierbei handelt es sich um ein einfaches Beispiel für die Verwendung eines Cursors aus ADO.MoveNext Next myRS.Close myConn.Source = "Select * from customer" myRS.Open 'Durch die ersten Ergebnisse blättern myRS.

Kapitel 9 Die OLE DB. Cursortypen Die von Adaptive Server Anywhere unterstützten Cursortypen werden in "Cursoreigenschaften" auf Seite 26 beschrieben. Recordsets aktualisieren Sie können die Datenbank über einen Recordset aktualisieren.Recordset myRS.Connection myRS As New ADODB. bevor Sie das Recordset öffnen. Beispielcode Der folgende Code legt den Cursortyp für ein ADO Recordset-Objekt fest: Dim myRS As New ADODB.Recordset SQLString As String 379 . Diese Funktion ist über den MSDASQL-Provider nicht verfügbar. indem Sie eine CursorType-Eigenschaft des Recordset-Objekts deklarieren. Die verfügbaren Cursortypen. denen sie entsprechen. die Sie am Recordset vornehmen können und hat Auswirkungen auf die Performance. Sie können den Cursortyp auswählen.und ADO-Programmierschnittstellen Mit dem Recordset-Objekt arbeiten Bei der Arbeit mit Adaptive Server Anywhere stellt die ADO Recordset einen Cursor dar. ADO hat seine eigene Namenskonvention für Cursortypen.CursorType = adOpenDynamic Daten mit einem Cursor aktualisieren Mit dem Adaptive Server Anywhere OLE DB-Provider können Sie eine Ergebnismenge über einen Cursor aktualisieren. die entsprechenden Cursortypenkonstanten und die Adaptive Server Anywhere-Typen. Die Auswahl des Cursortyps beeinflusst die Aktionen. sind hier aufgelistet: ADO-Cursortyp Dynamischer Cursor SchlüsselgruppenCursor Statischer Cursor Vorwärts-Cursor ADO-Konstante adOpenDynamic adOpenKeyset adOpenStatic adOpenForwardOnly Adaptive Server Anywhere-Typ Dynamisch abrollender Cursor Abrollender Cursor Unempfindlicher Cursor Nicht-abrollender Cursor $ Weitere Hinweise zur Auswahl eines für Ihre Anwendung geeigneten Cursortyps finden Sie unter "Cursortypen auswählen" auf Seite 26. Private Dim Dim Dim Sub Command6_Click() myConn As New ADODB.

_ myConn.Close End If myConn. sodass das Problem.MoveFirst For i = 1 To 3 MsgBox "Zeile: " + CStr(myRS. Die myRS.EOF Then MsgBox "Recordset ist leer!".0 Sample" myConn. adLockBatchOptimistic If myRS.BeginTrans SQLString = "Select * from customer" myRS. nicht mehr besteht. "Toronto" myRS.ADO-Programmierung mit Adaptive Server Anywhere ’ Verbindung herstellen myConn.MovePrevious myRS. _ 16.Close End Sub Hinweise Wenn Sie die Einstellung adLockBatchOptimistic für das Recordset verwenden. da sie sich innerhalb einer Transaktion befindet. ob die lokale Kopie der Daten geändert wurde oder nicht.Open myConn. _ vbInformation If i = 2 Then myRS.CommitTrans myConn.Fields("id")).UpdateBatch-Methode nimmt die Aktualisierung am Datenbankserver vor. 380 . Statt dessen wird eine lokale Kopie des Recordsets aktualisiert. Wenn eine UpdateBatch-Methode von außerhalb einer Transaktion aufgerufen wurde. "Leeres Recordset" Else MsgBox "Cursor-Typ: " + _ CStr(myRS. werden die Änderungen festgeschrieben. vbInformation myRS.CursorType).UpdateBatch End If myRS.Open SQLString.Update-Methode keine Änderungen an der Datenbank selbst vorgenommen. Die Methode myConn.BOF And myRS.Provider = "ASAProv" myConn.Update "City". Das Recordset-Objekt wurde zwischenzeitlich geschlossen. adOpenDynamic. werden bei der myRS.ConnectionString = _ "Data Source=ASA 8.CommitTrans schreibt die Änderungen fest. schreibt sie jedoch nicht fest.MoveNext Next i ’ myRS.

um Transaktionen zu benutzen.und ADO-Programmierschnittstellen Transaktionen verwenden Standardmäßig werden sämtliche Änderungen. Im vorherigen Abschnitt wurde jedoch gezeigt. dass Sie die Methoden BeginTrans und RollbackTrans oder CommitTrans auf das Connection-Objekt anwenden können.Kapitel 9 Die OLE DB. Auf 0 setzen 0 0 adXactCursorStability adXactReadCommitted 1 1 adXactRepeatableRead 2 adXactIsolated adXactSerializable 3 3 $ Weitere Hinweise zu Isolationsstufen finden Sie unter "Isolationsstufen und Konsistenz" auf Seite 105 der Dokumentation ASA SQLBenutzerhandbuch. sobald sie ausgeführt werden. die Sie mit ADO an der Datenbank vornehmen. Hierzu gehören auch explizite Aktualisierungen und die UpdateBatchMethode für einen Recordset. Die Eigenschaft IsolationLevel kann einen der folgenden Werte annehmen: ADO-Isolationsstufe Unbekannt (Unspecified) Chaos Durchsuchen (Browse) Nicht festgeschriebene Lesevorgänge (Read uncommitted) Cursorstabilität (Cursor stability) Festgeschriebene Lesevorgänge (Read committed) Wiederholbare Lesevorgänge (reatable read) Isoliert (Isolated) Serialisierbar (Serializable) Konstante adXactUnspecified adXactChaos adXactBrowse adXactReadUncommitted ASA-Stufe Nicht anwendbar. Die Transaktions-Isolationsstufe wird als eine Eigenschaft des Verbindungsobjekts festgelegt. 381 . Auf 0 setzen Nicht unterstützt. festgeschrieben.

382 . Nicht für CE IColumnsInfo IColumnsRowset Nicht für CE ICommand Unterstützt keinen Aufruf ICommandPropertie s GetProperties mit DBPROPSET_PRO PERTIESINERROR um Eigenschaften zu finden.und Datenspeicherwerten definieren Einschränkungen DBACCESSOR_PA SSBYREF nicht unterstützt DBACCESSOR_OP TIMIZED nicht unterstützt Nicht unterstützt IAlterIndex IAlterTable IChapteredRowset Tabellen. die nicht gesetzt werden konnten. Schnittstelle IAccessor Verwendung Bindungen zwischen Clientspeicher. Indizes und Spalten ändern Mit einer segmentierten Zeilengruppe kann auf Zeilen einer Zeilengruppe in getrennten Kapiteln zugegriffen werden Einfache Informationen zu Spalten in einer Zeilengruppe erhalten Informationen zu optionalen Metadatenspalten in einer Zeilengruppe und eine Zeilengruppe von SpaltenMetadaten erhalten SQL-Befehle ausführen Nicht unterstützt Adaptive Server Anywhere untersützt segmentierte Zeilengruppen nicht. In der folgenden Tabelle wird die Unterstützung für jede Schnittstelle im OLE DBTreiber von Adaptive Server Anywhere beschrieben.Unterstützte OLE DB-Schnittstellen Unterstützte OLE DB-Schnittstellen Die OLE DB API besteht aus einer Reihe von Schnittstellen.

Zeilengruppeneigenschaften für von einem Befehl erstellte Zeilengruppen festlegen. die als Vektoren skalarer Werte gespeichert werden Keine Unterstützung für BLOBParameter Nicht für CE IcommandWithParameters Parameterinformationen für einen Befehl festlegen und beziehen IConvertType Unterstützt Für CE eingeschränkte Unterstützung 383 . um die Schnittstellen anzugeben. welche die Zeilengruppe unterstützen sollen SQL-Befehlstext für Icommand festlegen Einschränkungen Nicht für CE ICommandPrepare ICommandProperties Nicht für CE Unterstützt ICommandText Nur der SQLDialekt DBGUID_DEFAUL T wird unterstützt Nicht für Parameter unterstützt. Diese beständigen Befehlsobjekte können nachfolgend mit der Zeilengruppe PROCEDURES oder VIEWS nummeriert werden.und ADO-Programmierschnittstellen Schnittstelle ICommandPersist Verwendung Zustand eines Befehlsobjekts (jedoch nicht jede aktive Zeilengruppe) aufrechterhalten. Befehle vorbereiten.Kapitel 9 Die OLE DB. Häufig verwendet.

Diese Schnittstelle wird nicht für die Verwaltung von Datenspeichern (Datenbanken) verwendet. und andere LiteralInformationen suchen IDBInitialize IDBProperties Datenquellenobjekte und Aufzähler initialisieren. die von Clients unterstützt werden. Informationen über Schlüsselwörter suchen. die in textlich übereinstimmenden Abfragen verwendet werden. Eigenschaften für ein Datenquellenobjekt oder einen Aufzähler verwalten Nicht für CE Nicht für CE Unterstützt Unterstützt Einschränkungen Nicht unterstützt IDBCreateCommand IDBCreateSession IDBDataSourceAdmin Nicht unterstützt IDBInfo Nicht für CE 384 . bei denen es sich um COMObjekte handelt. Sonderzeichen. Schlüsselwörter die nicht dem Standard-SQL entsprechen) Außerdem Informationen zu Literalen. dem Anfüllen von Zeilengruppen.h. erstellen/zerstören/ändern.Unterstützte OLE DB-Schnittstellen Schnittstelle IDBAsynchNotify IDBAsyncStatus Verwendung Asynchrone Verarbeitung Client über Ereignisse in der asynchronen Verarbeitung bei der Initialisierung von Datenquellen. Datenquellenobjekte. d. usw.h. informieren Befehle aus einer Sitzung erstellen Eine Sitzung aus einem Datenquellenobjekt erstellen. die für diesen Provider eindeutig sind (d.

die im Datenspeicher reflektiert werden InsertRow/SetData für Blobs nocht nicht implementiert IRowset IRowsetChange Unterstützt Nicht für CE IRowsetChapterMember Auf segmentierte/hierarchische Zeilengruppen zugreifen Index für eine Zeilengruppe dynamisch ändern Nicht unterstützt IRowsetCurrentIndex Nicht unterstützt 385 . nicht über einen GUID.Kapitel 9 Die OLE DB. nicht mit SQL zugreifen Unterstützt IIndexDefinition IMultipleResults Nicht unterstützt Unterstützt IOpenRowset Unterstützt Öffnen einer Tabelle mit ihrem Namen.und ADO-Programmierschnittstellen Schnittstelle IDBSchemaRowset Verwendung Informationen zu Systemtabellen in einer Standardmaske (einer Zeilengruppe) beziehen. wird unterstützt Nicht unterstützt IParentRowset Auf segmentierte/hierarchische Zeilengruppen zugreifen Auf Zeilengruppen zugreifen Änderungen an Zeilengruppendaten zulassen. Unterstützung von ActiveX-Fehler-Objekten Einschränkungen Nicht für CE IErrorInfo IErrorLookup IErrorRecords IGetDataSource Nicht für CE Gibt einen Schnittstellenzeiger auf das Datenquellenobjekt einer Sitzung zurück Indizes im Datenspeicher erstellen oder löschen Mehrere Ergebnisse (Zeilengruppen oder Zeilenzählungen) aus einem Befehl abrufen Auf eine Datenbanktabelle mit ihrem Namen.

xSchnittstelle.Unterstützte OLE DB-Schnittstellen Schnittstelle IRowsetFind Verwendung Eine Zeile innerhalb einer Zeilengruppe. der für eine Transaktion sichtbar ist Alte OLEDB 1. das die Zeilengruppe erstellt hat Position in Zeilen einer Zeilengruppe. unter Verwendung von Bookmarks Bietet eine COM-CallbackSchnittstelle für Zeilengruppen-Ereignisse Den neuesten Wert für Daten beziehen. von IRowsetRefresh abgelöst Durch Zeilengruppe blättern. um Zeilendaten abzurufen Änderungen an Zeilengruppendaten verzögern. finden Zeilen-Handles vergleichen Auf Datenbankindizes zugreifen Informationen zu einer Zeilengruppeneigenschaft suchen oder das Objekt suchen. die mit einem spezifischen Wert übereinstimmt. bis Update aufgerufen wurde Ansichten für eine vorhandene Zeilengruppe verwenden Eine Blob-Spalte abrufen Einschränkungen Nicht unterstützt IRowsetIdentity IRowsetIndex IRowsetInfo Nicht unterstützt Nicht unterstützt Nicht für CE IRowsetLocate Nicht für CE IRowsetNotify Unterstützt IRowsetRefresh Nicht unterstützt IRowsetResynch Nicht unterstützt IRowsetScroll Nicht unterstützt IRowsetUpdate Unterstützt Nicht für CE IRowsetView Nicht unterstützt ISequentialStream Nur für Lesen unterstützt Keine Unterstützung von SetData mit dieser Schnittstelle Nicht für CE 386 .

und ADO-Programmierschnittstellen Schnittstelle ISessionProperties Verwendung Informationen zu Sitzungseigenschaften beziehen Eine Zeilengruppe von Datenquellenobjekten und Aufzählern beziehen Unterstützung von ActiveX-Fehler-Objekten Einschränkungen Unterstützt ISourcesRowset Nicht für CE ISQLErrorInfo ISupportErrorInfo Optional für CE ITableDefinition ItableDefinitionWithConstraints ITransaction Tabellen mit Integritätsregeln erstellen.Kapitel 9 Die OLE DB. löschen und ändern Transaktionen festschreiben oder abbrechen Nicht für CE Nicht alle Kennzeichnungen werden unterstützt Nicht für CE ITransactionJoin Verteilte Transaktionen werden unterstützt Nicht alle Kennzeichnungen werden unterstützt Nicht für CE ITransactionLocal Transaktionen für eine Sitzung werden abgewickelt Nicht alle Kennzeichnungen werden unterstützt Nicht für CE 387 .

Unterstützte OLE DB-Schnittstellen Schnittstelle ITransactionOptions Verwendung Optionen für eine Transaktion beziehen oder einstellen Mit Ansichten für eine vorhandene Zeilengruppe arbeiten. insbesondere um Nachbearbeitungsfilter/sortierungen auf Zeilen anzuwenden Inhalte einer Zeilengruppe werden auf Zeilen. beschränkt Inhalte einer Zeilengruppe werden beim Öffnen einer Zeilengruppe auf Zeilen. beschränkt Sortierreihenfolge auf eine Ansicht anwenden Einschränkungen Nicht für CE IviewChapter Nicht unterstützt IviewFilter Nicht unterstützt IviewRowset Nicht unterstützt IviewSort Nicht unterstützt. welche eine Reihe von Bedinungen erfüllen. 388 . welche eine Reihe von Bedinungen erfüllen.

Die primäre Quelle für Informationen zur Open ClientAnwendungsentwicklung ist die Sybase Open Client-Dokumentation.K A P I T E L 1 0 Die Open Client-Schnittstelle Über dieses Kapitel Dieses Kapitel beschreibt die Open Client-Programmierschnittstelle für Adaptive Server Anywhere. Dieses Kapitel beschreibt spezifische Funktionen für Adaptive Server Anywhere. es ist jedoch keine umfassende Anleitung für die Anwendungsentwicklung mit Open Client. Inhalt Thema Was Sie für die Entwicklung von Open Client-Anwendungen brauchen Datentyp-Zuordnungen SQL in Open Client-Anwendungen verwenden Bekannte Open Client-Einschränkungen von Adaptive Server Anywhere Seite 390 391 394 398 389 .

auf dem der Datenbankserver läuft. Open Client-Anwendungen benötigen keine Open Client-Komponenten auf dem Rechner. 390 . andernfalls können Sie diese Bibliotheken wahlweise mit Adaptive Server Anywhere entsprechend den Bedingungen Ihres Lizenzvertrags installieren. Diese Komponenten sind eventuell bereits als Teil Ihrer Installation anderer Sybase Produkte vorhanden. Diese ist bei Sybase erhältlich. auf dem die Anwendung laufen soll. benötigen Sie die Entwicklungsversion von Open Client. Um Open Client-Anwendungen zu erstellen. während Adaptive Server Enterprise-Datenbanken unter Berücksichtigung von Groß/Kleinschreibung erstellt werden.Was Sie für die Entwicklung von Open Client-Anwendungen brauchen Was Sie für die Entwicklung von Open ClientAnwendungen brauchen Um Open Client-Anwendungen auszuführen. $ Weitere Hinweise zur Ausführung von Open Client-Anwendungen mit Adaptive Server Anywhere finden Sie unter "Adaptive Server Anywhere als Open Server" auf Seite 117 der Dokumentation ASA Datenbankadministration. Standardmäßig werden Adaptive Server Anywhere-Datenbanken ohne Berücksichtigung von Groß-/Kleinschreibung erstellt. müssen Sie Open ClientKomponenten auf dem Rechner installieren und konfigurieren.

Es werden alle Open Client-Datentypen unterstützt. und die keine direkte Entsprechung in Open Client haben. Aus diesem Grunde ordnet Adaptive Server Anywhere intern einige Datentypen von Open Client-Anwendungen den in Adaptive Server Anywhere zur Verfügung stehenden Datentypen zu. müssen die Open Client Laufzeitprogramme auf dem Computer installiert und konfiguriert sein. Der Adaptive Server Anywhere Server benötigt zur Unterstützung von Open Client-Anwendungen keine externe Kommunikations-Laufzeit. auf dem die Anwendung laufen soll. die in Adaptive Server Anywhere unterstützt werden. Jeder Open Client-Datentyp wird dem entsprechenden Adaptive Server Anywhere-Datentyp zugeordnet. Um Open Client Anwendungen zu erstellen. die in Adaptive Server Anywhere zur Verfügung stehen. Um Open Client-Anwendungen zu verwenden. Adaptive Server AnywhereDatentypen ohne direkte Entsprechung in Open Client Die folgende Tabelle zeigt die Zuordnung von Datentypen. Adaptive Server AnywhereDatentyp unsigned short unsigned int unsigned bigint date time serialization java string timestamp struct Open Client-Datentyp int bigint bigint smalldatetime smalldatetime longbinary longbinary varchar datetime 391 . die in einigen Details von den Datentypen abweichen. benötigen Sie die Entwicklungsversion von Open Client.Kapitel 10 Die Open Client-Schnittstelle Datentyp-Zuordnungen Open Client hat seine eigenen internen Datentypen.

der zwar akzeptiert und in einer Datenbank gespeichert wird. 7910 Beispiel Die Open Client-Datentypen MONEY und SMALLMONEY umfassen zum Beispiel nicht den gesamten numerischen Bereich der zu Grunde liegenden Adaptive Server Anywhere-Implementierung. um von einer Open Client-Anwendung abgerufen zu werden. Daher kann in einer Spalte in Adaptive Server Anywhere ein Wert enthalten sein.0001 214 748.3648 1. Deshalb ist es möglich. Dez. der einen größeren Bereich möglicher Werte hat.3647 31. Januar 0001 1. aber nur mit einigen Einschränkungen im Wertebereich möglicher Werte.5807 214 748. Die Implementierung des Open Client-Datentyps TIMESTAMP in Adaptive Server Anywhere unterscheidet sich von der Implementierung in Adaptive Server Enterprise. Januar 1900 Obere Open Client-Grenze 922 377 203 685 477. die zwar Adaptive Server Anywhere-Datentypen zugeordnet werden können. In Adaptive Server Anywhere wird der Wert auf dem Adaptive Server Anywhere-Datentyp DATETIME zugeordnet. Dezember 9999 Juni 2079 Untere ASAGrenze –1e15 + 0. wird eine Fehlermeldung erzeugt. einen Wert an Adaptive Server Anywhere zu übergeben. Dez. Der voreingestellte Wert ist NULL in Adaptive Server Anywhere. Im Gegensatz dazu stellt Adaptive Server Enterprise sicher. In den meisten Fällen wird der Open Client-Datentyp einem Adaptive Server Anywhere-Datentyp zugeordnet. der aber zu groß ist.3648 1.0001 –214 748.3647 31. März 1600 Obere ASAGrenze 1e15 – 0.Datentyp-Zuordnungen Wertebereichseinschränkungen bei der Zuordnung von Datentypen Einige Datentypen haben in Adaptive Server Anywhere andere Wertebereiche als in Open Client. Datentyp MONEY SMALLMONEY DATETIME SMALLDATETIME Untere Open Client-Grenze –922 377 203 685 477. dass der Wert gleichförmig steigt und somit immer eindeutig ist. der die Grenzwerte des Open Client Datentyps MONEY überschreitet. der Wert kann also uneindeutig sein. Zeitstempel 392 . Ruft der Client einen solchen unzulässigen Wert mit Adaptive Server Anywhere ab. In solchen Fällen kann es zu Überlauffehlern während der Abfrage oder des Einfügens von Daten kommen. Januar 1753 1. 9999 31.5808 –214 748. Die folgende Tabelle zeigt Open Client-Anwendungsdatentypen.

Tag. Stunde. 393 . die von Adaptive Server Anywhere zugeordnet werden. Außerdem hat der Datentyp DATETIME einen größeren Wertebereich als die Open Client-Datentypen. Sekunde und Sekundenbruchteile.Kapitel 10 Die Open Client-Schnittstelle Der Adaptive Server Anywhere Datentyp TIMESTAMP umfasst Jahr. Minute. Monat.

die Sie ausführen. Setzen Sie die Anweisungsparameter mit ct_param. CS_LANG_CMD. Eine vollständige Beschreibung finden Sie in Ihrer Open Client-Dokumentation. SQL Anweisungen ausführen Sie senden SQL Anweisungen an eine Datenbank. Vorbereitete Anweisungen verwenden Die Funktion ct_dynamic wird für die Verwaltung von vorbereiteten Anweisungen benutzt.SQL in Open Client-Anwendungen verwenden SQL in Open Client-Anwendungen verwenden Dieser Abschnitt bietet eine kurze Einführung in die Verwendung von SQL in Open Client-Anwendungen. Die folgenden beiden Aufrufe führen zum Beispiel eine DELETE-Anweisung aus: ret = ct_command(cmd. Führen Sie die Anweisung mit ct_dynamic mit CS_EXECUTE als type-Parameter aus. der die Aktion beschreibt. ret = ct_send(cmd). mit einem Schwerpunkt auf Themen. "DELETE FROM employee WHERE emp_id=105" CS_NULLTERM. $ Eine Einführung in die Konzepte finden Sie unter "SQL in Anwendungen verwenden" auf Seite 9. v Eine vorbereitete Anweisung in Open Client benutzen: 1 2 3 4 Bereiten Sie die Anweisung mit der Funktion ct_dynamic mit CS_PREPARE als type-Parameter vor. Geben Sie die mit der Anweisung verbundenen Ressourcen frei. die für Adaptive Server Anywhere spezifisch sind. Diese Funktion übernimmt den type-Parameter. CS_UNUSED). indem Sie sie in die Client Library Funktionsaufrufe einschließen. indem Sie ct_dynamic mit einem CS_DEALLOC-type-Parameter verwenden. 394 . Die Funktion ct_command wird für viele verschiedene Zwecke eingesetzt.

Sie können über Open Client weder Scroll-Cursor. Dies verbessert sowohl den Gesamtdurchsatz als auch die Fertigstellungszeit. Nachdem Sie einen Cursor deklariert haben. Eindeutigkeit und Aktualisierbarkeit sind zwei Eigenschaften von Cursorn. stehen in der Open Client Schnittstelle nicht zur Verfügung. die Sie ausführen. Embedded SQL bereitet zuerst eine Anweisung vor. hat jede Zeile einen Primärschlüssel oder eine Eindeutigkeitsinformation) oder nicht eindeutig sein. ob sie von der Anwendung benutzt wird oder nicht. Ist ein Cursor aktualisierbar und nicht eindeutig. Vorab abgerufene Zeilen werden nicht sofort an die Anwendung übergeben. sondern werden verwendungsbereit in einem clientseitigen Puffer zwischengespeichert. Vorab abgerufene Zeilen clientseitig zu speichern. verwenden Sie ct_cursor mit CS_CURSOR_DECLARE als type-Parameter. können Sie steuern. Diese Funktion übernimmt den type-Parameter. noch unempfindliche Cursor benutzen. der die Aktion beschreibt. 395 . Unterstützte Cursortypen Einige der Cursortypen. kann die Performance leiden. reduziert die Anzahl der Serveraufrufe. Cursor können schreibgeschützt oder aktualisierbar sein. Cursor verwenden Die Funktion ct_cursor wird für die Verwaltung von Cursorn verwendet. noch dynamische Scroll-Cursor. und zwar jedesmal wenn eine Zeile mit ct_cursor mit CS_CURSOR_ROWS als typeParameter vom Server abgerufen wird. dann wird der Cursor mit Hilfe des Statement-Handles deklariert. Schritte bei der Verwendung von Cursorn Im Gegensatz zu anderen Schnittstellen wie Embedded SQL ordnet Open Client einem Cursor eine SQL Anweisung als Zeichenfolge zu. v Cursor in Open Client verwenden: 1 2 Um einen Cursor in Open Client zu deklarieren.Kapitel 10 Die Open Client-Schnittstelle $ Weitere Informationen über die Verwendung von vorbereiteten Anweisungen in Open Client finden Sie in der Open Client-Dokumentation. Cursor können eindeutig sein (unabhängig davon. die Adaptive Server Anywhere unterstützt. da in diesem Fall keine Zeilen vorab abgerufen werden können. wie viele Zeilen vorab vom Client abgerufen werden. Dies ist unabhängig von der CS_CURSOR_ROWS-Belegung (siehe unten).

Verwenden Sie dafür ct_cursor mit CS_CURSOR_DEALLOC. können Sie die aktuelle Zeile im Cursor mit ct_cursor und CS_CURSOR_DELETE löschen oder mit ct_cursor und CS_CURSOR_UPDATE aktualisieren. v Zeilen durch einen Cursor verändern: ♦ Statt einen Abruf durchzuführen. In Open Client müssen Sie außerdem die Ressourcen freigeben. Sie wird von Open Client Verbindungen nicht beachtet. 396 . Zeilen mit einen Cursor ändern Mit Open Client können Sie Zeilen in einem Cursor löschen oder aktualisieren. In Embedded SQL und ODBC beschreiben Sie eine Abfrage oder eine gespeicherte Prozedur. 3 4 5 6 Um einen Cursor in Open Client zu öffnen. verwenden Sie jeweils ct_fetch. um die richtige Anzahl und Typen der Variablen zu setzen. aktualisierbaren Cursorn nicht beachtet.SQL in Open Client-Anwendungen verwenden Die Einstellung der Datenbankoption PREFETCH steuert den PrefetchVorgang für andere Schnittstellen. Der Benutzer muss die Berechtigung zur Aktualisierung der Tabelle haben und der Cursor muss für Aktualisierung markiert sein. Um einen Cursor zu schließen. die an den Cursor gebunden waren. Sie können in Open Client-Anwendungen mit einem Cursor keine Zeilen einfügen. Abfrageergebnisse in Open Client beschreiben Open Client geht mit Ergebnismengen anders um als andere Adaptive Server Anywhere-Schnittstellen. Die Einstellung CS_CURSOR_ROWS wird bei nicht eindeutigen. sofern der Cursor für eine einzelne Tabelle gilt. Die Beschreibung wird in der Anweisung selbst gegeben. Sie können auch CS_CURSOR_CLOSE mit dem zusätzlichen Parameter CS_DEALLOC benutzen. die die Ergebnisse aufnehmen sollen. verwenden Sie ct_cursor mit CS_CURSOR_OPEN als type-Parameter. Um eine Zeile in der Anwendung abzurufen. verwenden Sie ct_cursor mit CS_CURSOR_CLOSE. um diese Vorgänge in einem Schritt auszuführen.

die vom Server zurückgegeben wird. Statt dessen kann jede Zeile. können Sie die Funktion ct_results benutzen. um mit allen Aspekten der zurückgegebenen Zeilen umzugehen. können Sie ct_dynamic verwenden.Kapitel 10 Die Open Client-Schnittstelle In Open Client brauchen Sie eine Anweisung nicht zu beschreiben. um Anweisungen auszuführen. eine Beschreibung Ihrer Inhalte enthalten. Dies entspricht mehr dem Beschreiben von SQL Anweisungen bei anderen Schnittstellen. um eine SQL Anweisung vorzubereiten und ct_describe. Falls Sie nicht nach dieser Zeile-für-Zeile-Methode vorgehen wollen. Falls Sie ct_command und ct_send verwenden. 397 . um die Ergebnismenge zu beschreiben.

unter anderem folgende: ♦ ♦ Commit Service Adaptive Server Anywhere unterstützt Adaptive Server Enterprise Commit Service nicht.Bekannte Open Client-Einschränkungen von Adaptive Server Anywhere Bekannte Open Client-Einschränkungen von Adaptive Server Anywhere Mit der Open Client-Schnittstelle können Sie eine Adaptive Server Anywhere-Datenbank weitgehend wie eine Adaptive Server EnterpriseDatenbank verwenden. werden nicht unterstützt. Open Client-Anwendungen können über TCP/IP oder. wie SSL und verschlüsselte Kennwörter. Es gibt allerdings einige Einschränkungen. $ Weitere Hinweise zu Funktionen finden Sie in der Dokumentation Open Server Server-Library C Reference Manual (in englischer Sprache). welche Clientanforderungen und Serverantworten für diese Verbindung zulässig sind. Folgende Funktionen werden nicht unterstützt: ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ ♦ CS_REG_NOTIF CS_CSR_ABS CS_CSR_FIRST CS_CSR_LAST CS_CSR_PREV CS_CSR_REL CS_DATA_BOUNDARY CS_DATA_SENSITIVITY CS_PROTO_DYNPROC CS_REQ_BCP Sicherheitsoptionen. wenn verfügbar. über das Named Pipes-Protokoll des lokalen Systems eine Verbindung zu Adaptive Server Anywhere herstellen. Funktionen Die Funktionen einer Client/Server-Verbindung bestimmen. 398 .

K A P I T E L

1 1

Dreischichtige Datenverarbeitung und verteilte Transaktionen

Über dieses Kapitel

In diesem Kapitel wird beschrieben, wie Adaptive Server Anywhere in einer dreischichtigen Umgebung mit einem Anwendungsserver verwendet wird. Der Schwerpunkt ist, wie Adaptive Server Anywhere in verteilte Transaktionen einbezogen werden kann.
Thema Einleitung Dreischichtige Datenverarbeitungsarchitektur Verteilte Transaktionen verwenden EAServer mit Adaptive Server Anywhere verwenden Seite 400 401 405 407

Inhalt

399

Einleitung

Einleitung
Sie können Adaptive Server Anywhere als Datenbankserver oder als Ressourcen-Manager einsetzen, der an verteilten Transaktionen teilnimmt, die von einem Transaktionsserver koordiniert werden. Eine dreischichtige Umgebung, in der ein Anwendungsserver zwischen Clientanwendung und einer Reihe von Ressourcen-Managern sitzt, ist eine übliche Umgebung für verteilte Transaktionen. Sybase EAServer und einige andere Anwendungsserver sind ebenfalls Transaktionsserver. Sybase EAServer und Microsoft Transaction Server verwenden beide den Microsoft Distributed Transaction Coordinator (DTC) zum Koordinieren der Transaktionen. Adaptive Server Anywhere bietet Unterstützung für verteilte Transaktionen, die vom DTC-Service kontrolliert werden, sodass Sie Adaptive Server Anywhere mit einem dieser Anwendungsserver oder einem anderen DTC-basierten Produkt verwenden können. Wenn Sie Adaptive Server Anywhere in eine dreischichtige Umgebung integrieren, muss der Großteil der Arbeit vom Anwendungsserver erledigt werden. Dieses Kapitel ist eine Einführung in die Konzepte und die Architektur der dreischichtigen Datenverarbeitung sowie ein Überblick über die relevanten Adaptive Server Anywhere-Funktionen. Es beschreibt nicht, wie Ihr Anwendungsserver für die Arbeit mit Adaptive Server Anywhere konfiguriert werden muss. Weitere Hinweise finden Sie in der Anwendungsserver-Dokumentation.

400

Kapitel 11 Dreischichtige Datenverarbeitung und verteilte Transaktionen

Dreischichtige Datenverarbeitungsarchitektur
Bei der dreistufigen Datenverarbeitung wird die Anwendungslogik auf einem Anwendungsserver wie einem Sybase EAServer gespeichert, der sich zwischen dem Ressourcen-Manager und der Clientanwendung befindet. In vielen Situationen kann ein einziger Anwendungsserver auf mehrere Ressourcen-Manager zugreifen. Bei Internetanwendungen ist die Clientseite browserbasiert, und der Anwendungsserver ist im Allgemeinen eine Webserver-Erweiterung.

AnwendungsServer

Sybase EAServer speichert die Anwendungslogik in Form von Komponenten und stellt diese den Clientanwendungen zur Verfügung. Bei den Komponenten kann es sich um PowerBuilder-Komponenten, JavaBeans oder COM-Komponenten handeln.

$ Weitere Hinweise finden Sie in der Dokumentation zum Sybase
EAServer.

401

Dreischichtige Datenverarbeitungsarchitektur

Verteilte Transaktionen in dreischichtiger Datenverarbeitung
Wenn Clientanwendungen oder Anwendungsserver mit einer einfachen Transaktionsverarbeitungs-Datenbank arbeiten, wie etwa Adaptive Server Anywhere, wird außerhalb der Datenbank selbst keine Transaktionslogik benötigt. Wenn jedoch mit mehreren Ressourcen-Managern gearbeitet wird, muss die Transaktionssteuerung die in die Transaktion einbezogenen Ressourcen abdecken. Anwendungsserver bieten ihren Clientanwendungen Transaktionslogik, sodass Gruppen von Vorgängen in kleinsten Einheiten ausgeführt werden. Viele Transaktionsserver, einschließlich Sybase EAServer, verwenden den Microsoft Distributed Transaction Coordinator (DTC), um den Clientanwendungen Transaktionsdienste anzubieten. DTC verwendet OLETransaktionen, die ihrerseits das Protokoll Zwei-Phasen-Commit für die Koordinierung von Transaktionen mit mehreren Ressourcen-Managern verwenden. Um die in diesem Kapitel beschriebenen Funktionen verwenden zu können, müssen Sie DTC installiert haben. Adaptive Server Anywhere in verteilten Transaktionen Adaptive Server Anywhere kann an von DTC koordinierten Transaktionen teilnehmen. Das bedeutet, dass Sie Adaptive Server Anywhere-Datenbanken in verteilten Transaktionen mit einem Transaktionsserver wie etwa Sybase EAServer oder Microsoft Transaction Server verwenden können. Außerdem können Sie DTC direkt in Ihren Anwendungen zur Koordinierung von Transaktionen über mehrere Ressourcen-Manager einsetzen.

Begriffe im Zusammenhang mit verteilten Transaktionen
In diesem Kapitel wird eine gewisse Vertrautheit mit verteilten Transaktionen vorausgesetzt. Hinweise finden Sie in der Dokumentation zum Transaktionsserver. In diesem Abschnitt werden allgemein übliche Begriffe beschrieben. ♦ Ressourcen-Manager sind Dienste, die in eine Transaktion einbezogene Daten verwalten. Der Adaptive Server Anywhere-Datenbankserver kann in einer verteilten Transaktion als Ressourcen-Manager agieren, wenn über OLE DB oder ODBC darauf zugegriffen wird. Der ODBC-Treiber und der OLE DB-Provider agieren auf dem Client-System als RessourcenManager-Proxys.

402

Kapitel 11 Dreischichtige Datenverarbeitung und verteilte Transaktionen
♦ Anstatt direkt mit dem Ressourcen-Manager, können Anwendungskomponenten mit Ressourcen-Verteilern kommunizieren, die ihrerseits Verbindungen oder Verbindungs-Pools zu den RessourcenManagern verwalten. Adaptive Server Anywhere unterstützt zwei Ressourcen-Verteiler: den ODBC-Treibermanager und OLE DB. ♦ Wenn eine Transaktionskomponente eine Datenbankverbindung anfordert (über einen Ressourcen-Manager), bezieht der Anwendungsserver alle Datenbankverbindungen ein, die an der Transaktion teilnehmen. DTC und der Ressourcen-Verteiler führen den Einbeziehungsvorgang aus.

Zwei-PhasenCommit

Verteilte Transaktionen werden mit Zwei-Phasen-Commit verwaltet. Wenn die Arbeit der Transaktion abgeschlossen ist, fragt der Transaktions-Manager (DTC) alle in die Transaktion einbezogenen Ressourcen-Manager, ob sie bereit sind, die Transaktion festzuschreiben. Diese Phase wird Vorbereiten zum Festschreiben genannt. Wenn alle Ressourcen-Manager antworten, dass sie zum Festschreiben bereit sind, sendet DTC eine Anforderung zum Festschreiben an jeden einzelnen Ressourcen-Manager und antwortet seinem Client, dass die Transaktion abgeschlossen ist. Wenn einer oder mehrere Ressourcen-Manager nicht antworten oder antworten, dass sie die Transaktion nicht festschreiben können, wird die gesamte Arbeit der Transaktion über alle RessourcenManager zurückgesetzt.

So verwenden Anwendungsserver DTC
Sybase EAServer und Microsoft Transaction Server sind beides Komponentenserver. Die Anwendungslogik wird in Form von Komponenten gespeichert und den Clientanwendungen zur Verfügung gestellt. Jede Komponente hat ein Transaktionsattribut, das darauf hinweist, wie die Komponente an Transaktionen teilnimmt. Der Anwendungsentwickler, der die Komponente aufbaut, muss die Arbeit der Transaktion in die Komponente einprogrammieren: Die Ressourcen-Manager-Verbindungen, die Vorgänge mit den Daten, für die jeder einzelne Ressourcen-Manager verantwortlich ist. Der Anwendungsentwickler braucht jedoch nicht die Transaktionsverwaltungslogik in die Komponente einzubauen. Wenn das Transaktionsattribut so gesetzt ist, dass darauf hingewiesen wird, dass die Komponente eine Transaktionsverwaltung benötigt, verwendet EAServer DTC, um die Transaktion einzubeziehen und den Zwei-Phasen-CommitVorgang zu verwalten.

403

Dreischichtige Datenverarbeitungsarchitektur

Verteilte Transaktionsarchitektur
Das folgende Diagramm veranschaulicht die Architektur von verteilten Transaktionen. In diesem Fall ist der Ressourcen-Manager-Proxy entweder ODBC oder OLE DB.
ClientSystem

AnwendungsServer RessourcenManagerProxy RessourcenManagerProxy

DTC

DTC

DTC

Serversystem 1

Serversystem 2

In diesem Fall wird ein einzelner Ressourcen-Verteiler verwendet. Der Anwendungsserver fordert DTC auf, die Transaktion vorzubereiten. DTC und der Ressourcen-Verteiler beziehen jede einzelne Verbindung in die Transaktion ein. Jeder einzelne Ressourcen-Manager muss sowohl mit DTC als auch mit der Datenbank in Kontakt stehen, damit die Arbeit ausgeführt werden kann, und um DTC ggf. auf seinen Transaktionsstatus hinzuweisen. Auf jedem System muss ein DTC-Dienst laufen, damit die verteilten Transaktionen ausgeführt werden können. DTC-Dienste können vom Symbol "Dienste" in der Windows-Systemsteuerung aus kontrolliert werden. Der DTC-Dienst heißt MSDTC.

$ Weitere Hinweise finden Sie in der Dokumentation zu DTC bzw.
EAServer. 404

Kapitel 11 Dreischichtige Datenverarbeitung und verteilte Transaktionen

Verteilte Transaktionen verwenden
Wenn Adaptive Server Anywhere in eine verteilte Transaktion einbezogen ist, gibt er die Kontrolle an den Transaktionsserver weiter und Adaptive Server Anywhere gewährleistet, dass keine implizite Transaktionsverwaltung ausgeführt wird. Die folgenden Bedingungen werden automatisch von Adaptive Server Anywhere auferlegt, wenn er an verteilten Transaktionen teilnimmt: ♦ ♦ ♦ Autocommit wird automatisch deaktiviert, wenn es verwendet wurde. Datendefinitions-Anweisungen (als Nebenwirkung festgeschrieben) werden während der verteilten Transaktionen deaktiviert. Ein explizites COMMIT oder ROLLBACK von der Anwendung direkt an Adaptive Server Anywhere anstatt über den Transaktionskoordinator führt zu einer Fehlermeldung. Die Transaktion wird jedoch nicht abgebrochen. Eine Verbindung kann jeweils nur an einer verteilten Transaktion teilnehmen. Zu dem Zeitpunkt, wenn die Verbindung in eine verteilte Transaktion einbezogen wird, darf es keine nicht festgeschriebenen Vorgänge geben.

♦ ♦

DTC-Isolationsstufen
DTC weist eine Reihe von Isolationsstufen auf, die der Anwendungsserver angibt. Diese Isolationsstufen entsprechen folgendermaßen den Isolationsstufen von Adaptive Server Anywhere:
DTC-Isolationsstufe ISOLATIONLEVEL_UNSPECIFIED ISOLATIONLEVEL_CHAOS ISOLATIONLEVEL_READUNCOMMITTED ISOLATIONLEVEL_BROWSE ISOLATIONLEVEL_CURSORSTABILITY ISOLATIONLEVEL_READCOMMITTED ISOLATIONLEVEL_REPEATABLEREAD ISOLATIONLEVEL_SERIALIZABLE ISOLATIONLEVEL_ISOLATED Adaptive Server Anywhere-Isolationsstufe 0 0 0 0 1 1 2 3 3

405

Verteilte Transaktionen verwenden

Wiederherstellung nach verteilten Transaktionen
Wenn der Datenbankserver einen Fehler aufweist, während nicht festgeschriebene Vorgänge auf Ausführung warten, müssen diese Vorgänge beim Neustart entweder zurückgesetzt oder festgeschrieben werden, damit die atomare Natur der Transaktion geschützt wird. Wenn während der Wiederherstellung nicht festgeschriebene Vorgänge einer verteilten Transaktion gefunden werden, versucht der Datenbankserver eine Verbindung mit DTC herzustellen und fordert, wieder in die auf Ausführung wartenden bzw. in die zweifelhaften Transaktionen einbezogen zu werden. Wenn die Wiedereinbeziehung abgeschlossen ist, weist DTC den Datenbankserver an, die ausstehenden Vorgänge zurückzusetzen oder festzuschreiben. Wenn der Wiedereinbeziehungsvorgang fehlschlägt, kann Adaptive Server Anywhere nicht wissen, ob die zweifelhaften Vorgänge festgeschrieben oder zurückgesetzt werden sollten, und die Wiederherstellung schlägt fehl. Wenn Sie wollen, dass die Datenbank wieder in solch einem Status hergestellt wird, unabhängig vom unsicheren Status der Daten, können Sie die Wiederherstellung mit den folgenden Datenbankserveroptionen erzwingen: ♦
-tmf Wenn DTC nicht geladen werden kann, werden die ausstehenden

Vorgänge zurückgesetzt und die Wiederherstellung wird fortgesetzt.

$ Weitere Hinweise finden Sie unter "–tmf-Serveroption" auf
Seite 169 der Dokumentation ASA Datenbankadministration. ♦
-tmt Wenn die Wiedereinbeziehung vor der angegebenen Zeit nicht

gelingt, werden die ausstehenden Vorgänge zurückgesetzt und die Wiederherstellung wird fortgesetzt.

$ Weitere Hinweise finden Sie unter "–tmt-Serveroption" auf
Seite 169 der Dokumentation ASA Datenbankadministration.

406

Kapitel 11 Dreischichtige Datenverarbeitung und verteilte Transaktionen

EAServer mit Adaptive Server Anywhere verwenden
Dieser Abschnitt bietet einen Überblick über die in EAServer 3.0 oder später für die Arbeit mit Adaptive Server Anywhere zu ergreifenden Maßnahmen. Weitere Hinweise finden Sie in der Dokumentation zum Sybase EAServer.

EA Server konfigurieren
Alle in einem Sybase EAServer installierten Komponenten nutzen gemeinsam denselben Transaktionskoordinator. EAServer 3.0 und später bieten eine Auswahl von Transaktionskoordinatoren. Sie müssen DTC als Transaktionskoordinator verwenden, wenn Sie Adaptive Server Anywhere in die Transaktionen einbeziehen. In diesem Abschnitt wird beschrieben, wie EAServer 3.0 für die Benutzung von DTC als Transaktionskoordinator konfiguriert wird. Der Komponentenserver in EAServer trägt den Namen Jaguar.
v So wird ein EAServer für die Verwendung des Microsoft DTC Transaktionsmodells konfiguriert:

1

Vergewissern Sie sich, dass Ihr Jaguar-Server läuft. Unter Windows läuft der Jaguar-Server normalerweise als Dienst. Wenn der mit EAServer 3.0 installierte Jaguar-Server manuell gestartet werden soll, wählen Sie Start®Programme®Sybase®EAServer®EAServer.

2

Starten Sie den Jaguar Manager. Wählen Sie vom Windows Desktop Start®Programme®Sybase®EAServer®Jaguar Manager.

3

Stellen Sie vom Jaguar Manager aus eine Verbindung mit dem JaguarServer her. Wählen Sie im Sybase Central-Menü Extras®Verbinden®Jaguar Manager. Geben Sie im Verbindungsdialog jagadmin als Benutzernamen ein, lassen Sie das Kennwortfeld leer und geben Sie den Hostnamen localhost ein. Klicken Sie auf OK, damit eine Verbindung hergestellt wird.

4

Legen Sie das Transaktionsmodell für den Jaguar-Server fest.

407

EAServer mit Adaptive Server Anywhere verwenden
Öffnen Sie im linken Fensterausschnitt den Ordner "Server". Rechtsklicken Sie im rechten Fensterausschnitt auf den Server, den Sie konfigurieren wollen und wählen Sie "Servereigenschaften" aus dem Menü. Öffnen Sie das Register "Transaktionen" und wählen Sie Microsoft DTC als Transaktionsmodell. Klicken Sie auf OK, damit der Vorgang abgeschlossen wird.

Komponenten-Transaktionsattribut festlegen
Im EAServer können Sie eine Komponente implementieren, die Vorgänge mit mehr als einer Datenbank ausführt. Sie weisen dieser Komponente ein Transaktionsattribut zu, das festlegt, wie sie an Transaktionen teilnimmt. Das Transaktionsattribut kann die folgenden Werte annehmen: ♦
Nicht unterstützt Die Methoden der Komponente werden nie als Teil einer Transaktion ausgeführt. Wird die Komponente von einer anderen Komponente aktiviert, die innerhalb einer Transaktion ausgeführt wird, dann wird die Arbeit der neuen Instanz außerhalb der vorhandenen Transaktion ausgeführt. Dies ist die Standardeinstellung. Unterstützt Transaktion Die Komponente kann im Kontext einer

Transaktion ausgeführt werden, eine Verbindung ist jedoch nicht erforderlich, um die Methoden der Komponente auszuführen. Wenn die Komponente direkt von einem Basis-Clienten instanziert wird, beginnt EAServer keine Transaktion. Wenn Komponente A von Komponente B instanziert und Komponente B innerhalb einer Transaktion ausgeführt wird, führt das System die Komponente A in derselben Transaktion aus. ♦
Erfordert Transaktion Die Komponente wird immer in einer

Transaktion ausgeführt. Wenn die Komponente direkt von einem BasisClient instanziert wird, beginnt eine neue Transaktion. Wenn Komponente A von Komponente B aktiviert wird und B innerhalb einer Transaktion ausgeführt wird, führt das System A innerhalb derselben Transaktion aus, wenn B nicht in einer Transaktion ausgeführt wird, führt das System A in einer neuen Transaktion aus. ♦
Erfordert neue Transaktion Wenn die Komponente instanziert wird, beginnt eine neue Transaktion. Wenn Komponente A von Komponente B aktiviert wird und B innerhalb einer Transaktion ausgeführt wird, beginnt A einen neue Transaktion, die unabhängig ist vom Ergebnis der Transaktion B, wenn B nicht in einer Transaktion ausgeführt wird, führt das System A in einer neuen Transaktion aus.

408

führt die Methode enroll() der Komponente SVUEnrollment zwei separate Vorgänge aus (reserviert einen Platz in einem Kurs. Die Komponente SVUEnrollment ist bereits als "Erfordert Transaktion" markiert. v So wird das Transaktionsattribut einer Komponente festgelegt: 1 Ermitteln Sie die Position der Komponente im Jaguar Manager. Rechtsklicken Sie auf die Komponente und klicken Sie auf "Komponenten-Eigenschaften" im Einblendmenü. die Sie angegeben haben. stellen Sie eine Verbindung mit dem Jaguar-Server her. Die Komponenten im Paket werden im rechten Fensterausschnitt aufgeführt. fakturiert den Studenten für den Kurs). können Sie Adaptive Server Anywhere-Vorgänge von der Komponente aus ausführen und sicher sein. Klicken Sie auf OK. dass die Transaktion auf der Ebene ausgeführt wird. öffnen Sie den Ordner "Pakete" und öffnen Sie das SVU-Paket. Wenn Sie die Komponente SVUEnrollment in der JaguarBeispielanwendung suchen wollen.Kapitel 11 Dreischichtige Datenverarbeitung und verteilte Transaktionen In der Beispielanwendung Sybase Virtual University. Wenn das Komponenten-Transaktionsattribut festgelegt ist. damit der Vorgang abgeschlossen wird. Microsoft Transaction Server bietet dieselbe Gruppe von Attributwerten. die mit EAServer als SVU-Paket geliefert wird. 409 . Öffnen Sie das Register "Transaktion" und wählen Sie den Wert für das Transaktionsattribut aus der Liste. 2 Legen Sie das Transaktionsattribut für die gewünschte Komponente fest. Diese beiden Vorgänge müssen als Einzel-Transaktionen behandelt werden.

EAServer mit Adaptive Server Anywhere verwenden 410 .

prüfen Sie bitte Ihre Lizenzvereinbarung.K A P I T E L 1 2 Deployment: Datenbanken und Anwendungen im System bereitstellen Über dieses Kapitel In diesem Kapitel wird beschrieben. Bevor Sie daher Anwendungen im System bereitstellen. wie Komponenten von Adaptive Server Anywhere für die allgemeine Nutzung im System bereitgestellt werden können. In diesem Kapitel enthaltene Ausführungen können die Bestimmungen Ihrer Lizenzvereinbarung weder aufheben noch ändern.Überblick Installationsverzeichnisse und Dateinamen InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden Dialogfreie Installation für die Systemeinführung Clientanwendungen im System bereitstellen Tools zur Verwaltung bereitstellen Datenbankserver im System bereitstellen Eingebettete Datenbankanwendungen im System bereitstellen Seite 412 415 420 422 426 437 438 441 411 . Inhalt Thema Systemeinführung . Beschrieben werden die erforderlichen Dateien für die Bereitstellung sowie Fragen im Zusammenhang mit der Adressierung und der Einstellung von Verbindungsparametern. Prüfen Sie Ihre Lizenzvereinbarung Die Weitergabe von Dateien wird durch die Lizenzvereinbarung geregelt.

sodass diese sich mit einem zentral untergebrachten Netzwerk-Datenbankserver verbinden können. im Client-/Servermodus usw. wie etwa Datenquellennamen. müssen Sie die Anwendung für Ihre Endbenutzer bereitstellen. hängt vom gewählten Modell ab. Hinweise finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420 und "Dialogfreie Installation für die Systemeinführung" auf Seite 422. In diesem Kapitel enthaltene Ausführungen können die Bestimmungen Ihrer Lizenzvereinbarung weder aufheben noch ändern.Überblick Systemeinführung . Je nach der Art. müssen Sie Komponenten von Adaptive Server Anywhere zusammen mit Ihrer Anwendung bereitstellen. Es wird jedoch empfohlen. prüfen Sie bitte Ihre Lizenzvereinbarung. Modelle für die Systemeinführung Welche Dateien Sie bei der Systemeinführung bereitstellen müssen. Adaptive Server Anywhere-Komponenten unter Verwendung der Installshield-Objekte oder dialogfrei zu installieren. Konfigurationsdaten bereitzustellen.Überblick Wenn Sie eine Datenbankanwendung fertig gestellt haben. Nachstehend werden einige denkbare Modelle beschrieben: ♦ Clientbereitstellung Sie können nur die Clientkomponenten von Adaptive Server Anywhere für die Endbenutzer bereitstellen. wie Ihre Anwendung Adaptive Server Anywhere verwendet (als eingebettete Datenbank. Bevor Sie daher Anwendungen im System bereitstellen. Folgende Bereiche der Systemeinführung werden in diesem Kapitel besprochen: ♦ ♦ Ermittlung der erforderlichen Dateien je nach Anwendungsplattform und Plattformarchitektur Konfiguration der Clientanwendungen Eine großer Teil des Kapitels befasst sich mit einzelnen Dateien und wo sie platziert werden müssen. Es kann außerdem erforderlich sein. Prüfen Sie Ihre Lizenzvereinbarung Die Weitergabe von Dateien wird durch die Lizenzvereinbarung mit Sybase geregelt. 412 . damit die Anwendung mit Adaptive Server Anywhere kommunizieren kann.).Systemeinführung .

Wenn Adaptive Server Anywhere bereits passend für den Servertyp und das Betriebssystem der Clientanwendung installiert wurde. Diese Option ist viel komplizierter. In diesem Fall müssen Sie den Endbenutzern nur noch eine Methode zur Verbindungsaufnahme mit dem Datenbankserver übergeben (z. Wenn der Endbenutzer die richtigen Installationsoptionen wählt. Eingebettete Datenbanken bereitstellen Sie können eine Datenbank bereitstellen. 413 .B. die eigene Installationen entwickeln müssen. Dies ist die einfachste Lösung für viele Fälle der Systemeinführung. die mit einem Personal Datenbankserver läuft. Adaptive Server Anywhere für den allgemeinen Gebrauch verfügbar zu machen: ♦ Sie benutzen das Installationsprogramm von Adaptive Server Anywhere Sie können das Setup-Programm den Endbenutzern zur Verfügung stellen. Bereitstellung über SQL Remote Die Bereitstellung einer SQL Remote-Anwendung ist eine Erweiterung des Modells der Bereitstellung einer eingebetteten Datenbank. dass Sie ein eigenes Installationsprogramm entwickeln wollen. stehen die erforderlichen Dateien in dem entsprechend benannten Unterverzeichnis bereit. In diesem Fall müssen der Client und der Personal Server auf dem Rechner des Endbenutzers installiert werden. DBTools-Bereitstellung Sie können Interactive SQL. das im Installationsverzeichnis von Adaptive Server Anywhere angelegt wurde. und daher richtet sich der größte Teil dieses Kapitels an jene. ♦ Entwicklung Ihrer eigenen Installation Es kann Gründe dafür geben. $ Weitere Hinweise finden Sie unter "Dialogfreie Installation für die Systemeinführung" auf Seite 422. ♦ ♦ ♦ Möglichkeiten zur Weitergabe von Dateien Es gibt zwei Möglichkeiten.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen ♦ Netzwerkserver bereitstellen Sie können Netzwerkserver in Zweigstellen einrichten und dann Clients für alle Benutzer in diesen Büros bereitstellen. Sybase Central und andere Tools zur Verwaltung bereitstellen. das Dateien von Adaptive Server Anywhere enthält. verfügt er garantiert über alle erforderlichen Dateien. eine ODBC-Datenquelle).

enthält das Unterverzeichnis win32 im Installationsverzeichnis die Dateien. 414 .Überblick Wenn beispielsweise das Standard-Installationsverzeichnis gewählt wurde. um den Server unter WindowsBetriebssystemen zu betreiben. um ihre eigenen Anwendungen bereitzustellen. Gleichgültig welche Option Sie wählen: Sie müssen sich dabei immer an die Bestimmungen Ihrer Lizenz halten. indem Sie das gesamte Vorlagenprojekt oder nur die für Ihre Installation relevanten Teile verwenden. Mit dieser Funktion erstellen Sie das Installationsprogramm für Ihre Anwendung.Systemeinführung .5 und höher die InstallShield-Vorlagenprojekte für SQL Anywhere Studio verwenden. die benötigt werden. Ebenso können Anwender von InstallShield Professional 5.

B.sl.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Installationsverzeichnisse und Dateinamen Damit eine im System bereitgestellte Anwendung richtig funktioniert. mit denen sich Anwendungen verknüpfen müssen.so angeführt. nämlich dem Unterverzeichnis win32 des Installationsverzeichnisses von Adaptive Server Anywhere. Im Betriebssystem AIX haben gemeinsam genutzte Dateien. 415 . ♦ Dateierweiterungen In den Tabellen dieses Kapitels werden die gemeinsamen Objekte mit der Erweiterung . müssen die Clientbibliotheken ermitteln können. $ Eine vollständige Beschreibung der Standorte. werden Dateien für den Datenbankserver und für den Client in nur einem Verzeichnis installiert. Anwendungen unter UNIX bereitstellen Die Bereitstellung von Anwendungen unter UNIX unterscheidet sich von der auf PC üblichen in folgender Weise: ♦ Verzeichnisstruktur Bei UNIX-Installationen lautet die Verzeichnisstruktur wie folgt: Verzeichnis Inhalt Programmdateien Gemeinsame Objekte und Bibliotheken Textdateien /opt/sybase/SYBSsa8/bin /opt/sybase/SYBSsa8/lib /opt/sybase/SYBSsa8/res Auf AIX lautet das standardmäßige Stammverzeichnis /usr/lpp/sybase/SYBSsa8 an Stelle von /opt/sybase/SYBSsa8. finden Sie unter "Ermittlung des Dateienstandorts durch Adaptive Server Anywhere" auf Seite 228 der Dokumentation ASA Datenbankadministration. an denen die Software nach Dateien sucht. die Erweiterung . wo die erforderlichen Dateien untergebracht sind. dass auf einem PC die meisten Dateien in ein einziges Verzeichnis gehören. Die bereitgestellten Dateien müssen in derselben Struktur gespeichert werden wie in der Installation von Adaptive Server Anywhere. Unter HP-UX lautet diese Erweiterung . In der Praxis bedeutet das.a. Unter Windows z.

416 .dll Dateien) dargestellt.so gibt es eine Datei mit der Bezeichnung libdblib8_r. Diese Konventionen sind wie folgt aufgebaut: ♦ Versionsnummer Die Versionsnummer von Adaptive Server Anywhere wird im Dateinamen der Haupt-Serverkomponenten (.cvf $ Eine Beschreibung der Standorte.1 in demselben Verzeichnis. Beispiel: Die Datei dbeng8. Beispiel: Zusätzlich zu libdblib8. Wenn Korrekturprogramme für die Installation von Adaptive Server Anywhere erforderlich sind.Installationsverzeichnisse und Dateinamen ♦ Symbolische Verknüpfungen Jedes gemeinsam genutzte Objekt ist als symbolische Verknüpfung zu einer Datei gleichen Namens mit der zusätzlichen Erweiterung . werden sie mit der Erweiterung . Beispiel: Die Datei libdblib8. In diesem Fall müssen Anwendungen mit Thread mit dem gemeinsam genutzten Objekt _r verknüpft werden.exe ist eine Programmdatei für Version 7. ♦ Zeichensatzkonvertierung Wenn Sie die Zeichensatzkonvertierung des Datenbankservers (Serveroption -ct) benutzen möchten.so ist eine symbolische Verknüpfung zur Datei libdblib8. ♦ Anwendungen mit und ohne Threads Die meisten gemeinsam genutzten Objekte werden in zwei Formen geliefert. müssen die folgenden Dateien hinzugefügt werden: ♦ ♦ ♦ libunic. damit Sie die Systemkomponenten leichter erkennen und zu Gruppen zusammenfassen können. Anwendungen ohne Thread hingegen mit dem gemeinsam genutzten Objekt ohne den Zusatz _r. von denen eine mit den zusätzlichen Zeichen _r vor der Dateierweiterung versehen ist.1 (eins) installiert. Namenskonventionen für Dateien Adaptive Server Anywhere benutzt einheitliche Konventionen.so Verzeichnisstruktur charsets/ asa.so. an denen die Software nach Dateien sucht.so.2 geliefert und die symbolische Verknüpfung muss umgeleitet werden.exe and . finden Sie unter "Ermittlung des Dateienstandorts durch Adaptive Server Anywhere" auf Seite 228 der Dokumentation ASA Datenbankadministration.

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen ♦ Sprache Die in einer Sprachen-Ressourcebibliothek verwendete Sprache wird durch einen Sprachcode im Dateinamen angezeigt. 417 . Sie können das International Resources Deployment Kit. falls Sie noch keines haben.dll die SprachenRessourcebibliothek für Englisch. Zum Beispiel ist dblgen8. Die zwei Zeichen vor der Versionsnummer weisen auf die in der Bibliothek verwendete Sprache hin. Klicken Sie unterhalb der Überschrift "Emergency Bug Fix/Updates" auf "Emergency Bug Fixes and Updates for SQL Anywhere Studio". Diese Codes aus zwei Buchstaben sind im ISO-Standard 639 festgelegt. das DLLs für die Bereitstellung von Sprachressourcen enthält. $ Eine Liste der in Adaptive Server Anywhere verfügbaren Sprachen finden Sie unter "Mitgelieferte Kollatierungen" auf Seite 295 der Dokumentation ASA Datenbankadministration. die StandardDateierweiterungen verwendet. $ Weitere Hinweise zur Sprachenkennzeichnung finden Sie unter "Näheres zur Sprache der Sprachumgebung" auf Seite 288 der Dokumentation ASA Datenbankadministration. Andere Dateitypen erkennen Die folgende Tabelle zeigt die Plattform und die Funktion der Adaptive Server Anywhere-Dateien entsprechend ihrer Dateierweiterung. In Adaptive Server Anywhere wurden. gratis von der Sybase-Website herunterladen. um ein Sybase-Netzkonto zu erstellen. das der verwendeten Plattform und Version von Adaptive Server Anywhere entspricht. wo immer möglich.com/products/mobilewireless/anywhe re/ 2 3 4 Klicken Sie unterhalb der Überschrift "SQL Anywhere Studio" links auf der Seite auf "Downloads". Melden Sie sich bei Ihrem Sybase-Netzkonto an.sybase. Klicken Sie auf "Create a New Account". 5 Aus der Liste der verfügbaren Downloads wählen Sie das International Resources Deployment Kit aus. v So laden Sie das International Resources Deployment Kit von der Sybase-Website herunter: 1 Öffnen Sie im Webbrowser den folgenden URL: http://www.

res Windows Windows NetWare.chw . . Dies ist das Gegenstück zu einer DLL auf PC-Plattformen. .spr.lib Ändert sich je nach Entwicklungstool Statische Laufzeitbibliotheken für die Erstellung von Embedded SQL Programmdateien Komponenten von Sybase Adaptive Server Enterprise Befehlsdateien Sprachen-Ressourcedatei für Umgebungen außer Windows Dynamische Verknüpfungsbibliothek (Dynamic Link Library) Gemeinsam genutztes Objekt (Sun Solaris und IBM AIX) oder gemeinsam genutzte Bibliothek (HPUX). ♦ Transaktionslogdatei Sie wird benutzt. .hlp.srt.cnt.fts. . .a UNIX Datenbankdateinamen Die Adaptive Server Anywhere Datenbanken bestehen aus zwei Elementen: ♦ Datenbankdatei Sie wird verwendet.db zugeordnet. die an den Daten in der Datenbankdatei vorgenommen werden. verfügt sie in der Regel über die Dateierweiterung .sl .xlt . .Installationsverzeichnisse und Dateinamen Dateierweiterung Plattform Novell Netware Windows NT Dateityp Mit NetWare ladbares Modul Datei des Hilfesystems .dll Windows . Ein gespiegeltes Transaktionslog hat die standardmäßige Erweiterung . wenn keine solche Datei vorhanden ist und die Verwendung einer Logdatei definiert wurde. .log verwendet.cpr.nlm . Für diese Datei wird die Dateierweiterung .cmd . . .ftg.chm.so .dat.loc. um Informationen in organisierter Form zu speichern. UNIX .bat . . ♦ 418 .wrt.mlg. Sie wird vom Adaptive Server Anywhere erzeugt. . Write-Datei Wenn Ihre Anwendung eine Write-Datei verwendet. .cfg. Dieser Datei ist die Dateierweiterung . .gid. um alle Änderungen aufzuzeichnen.

hat sie normalerweise die Dateierweiterung .cdb.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen ♦ Komprimierte Datenbankdatei Wenn Sie eine schreibgeschützte komprimierte Datenbankdatei verwenden. gepflegt und verwaltet. 419 . Diese Dateien werden vom Datenbank-Managementsystem von Adaptive Server Anywhere aktualisiert.

Wenn Sie InstallShield 6 oder höher haben. Sie können zwischen NetworkServer. Anwender von InstallShield Professional 5. Laden Sie einfach die Vorlage in die InstallShield-IDE.fgl-Dateien aufgelistet sind. generieren Sie die Medien und die Vorlage wird unmittelbar ausgeführt. 5 Wählen Sie die Datei mit der Erweiterung . 420 . auf die aktuelle Installation von ASA zeigen.InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden Wenn Sie InstallShield 6 oder höher verwenden. weil sie einfacher zusammen mit anderen Komponenten in die Installation zu integrieren sind. Personal Datenbankservern. die dem Typ des Objekts entspricht. Das Projekt wird in der InstallShield-IDE geöffnet. Wechseln Sie zum Beispiel zu folgendem Verzeichnis: C:\Programme\Sybase\SQL Anywhere 8\deployment. Die Vorlagen werden während der Installation geändert.ipr. Wählen Sie Datei®Öffnen. Die Objekte zur Bereitstellung von Clients. Im Projektbereich wird ein Symbol für die Vorlage angezeigt. ClientSchnittstellen und Verwaltungstools finden Sie im Verzeichnis SQL Anywhere 8\deployment\Templates. Wechseln Sie zu Ihrer SQL Anywhere 7-Installation und ins Bereitstellungsverzeichnis. v So fügen Sie ein Vorlagenprojekt zu Ihrer InstallShield-IDE hinzu: 1 2 3 Starten Sie die InstallShield-IDE. Netzwerkservern und Verwaltungstools finden Sie im Verzeichnis deployment\Objects in Ihrem SQL Anywhere-Verzeichnis. sind die Objekte den Vorlagen vorzuziehen. eines Personal Servers. das Sie bereitstellen wollen. können Sie SQL Anywhere Studio InstallShield-Objekte in Ihr Installationsprogramm einbeziehen. sodass die Suchpfade der einzelnen Dateien.5 und höher können InstallShieldVorlagenprojekte für SQL Anywhere Studio verwenden. 4 Öffnen Sie die Vorlage. PersonalServer. um sich die Arbeit für die Bereitstellung ihrer eigenen Anwendungen zu erleichtern. die in allen . Vorlagen zum Bereitstellen eines Netzwerkservers. Client und JavaTools wählen.

können Sie entweder die Dateien Ihrer Anwendung in die Dateigruppen einfügen oder die Dateigruppen löschen oder umbenennen. 421 . Um diese Warnungen zu entfernen.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Hinweise: Wenn Sie die Medien generieren. die als Platzhalter für die Dateien Ihrer Anwendung in die Vorlage eingefügt wurden. sehen Sie Warnmeldungen über leere Dateigruppen. Diese Warnungen werden durch leere Dateigruppen verursacht.

Sie können zur Bereitstellung von MobiLinkSynchronisationsservern auch eine dialogfreie Installation verwenden. setup. Verwenden Sie keine Durchsuchungsfunktionen Wenn Sie eine dialogfreie Installation erstellen. Die Ergebnisse von Durchsuchungsfunktionen können fehlerhaft sein. Installieren Sie die Software im Modus "Record" (Aufzeichnen).Dialogfreie Installation für die Systemeinführung Dialogfreie Installation für die Systemeinführung Dialogfreie Installationen laufen ohne Eingriff von Seiten des Benutzers und ohne dass der Benutzer erfährt. Sie können eine dialogfreie Installation für alle Systemeinführungsmodelle verwenden. Eine dialogfreie Installation wird durch Ausführen von Setup mit der Option –s ausgeführt. dass eine Installation ausgeführt wird. Dialogfreie Installationen werden ebenfalls vom Microsoft Systems Management Server verwendet (siehe "SMS-Installation" auf Seite 424). dass die Adaptive Server Anywhere Installation dialogfrei verläuft. enthalten). indem das Setup-Programm von Adaptive Server Anywhere mit der Option –r ausgeführt wird. Bei Windows-Betriebssystemen können Sie das InstallShield-Setup-Programm von Adaptive Server Anywhere so aufrufen. So wird eine dialogfreie Installation eingerichtet Die bei einer dialogfreien Installation verwendeten Installationsoptionen stammen aus einer Antwortdatei. Die Antwortdatei wird erstellt.exe. die in "Modelle für die Systemeinführung" auf Seite 412 beschrieben wurden. v So wird eine dialogfreie Installation eingerichtet: 1 2 3 (Fakultativ) Entfernen Sie vorhandene Installationen von Adaptive Server Anywhere. Öffnen Sie eine Systembefehlszeile und wechseln Sie in das Verzeichnis mit den Installations-Dateien (die setup.ins usw. Geben Sie folgenden Befehl ein: setup –r 422 . dürfen Sie die Schaltflächen "Durchsuchen" nicht verwenden.

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Mit diesem Befehl wird das Setup-Programm von Adaptive Server Anywhere ausgeführt und aus Ihrer Auswahl bei den Optionen eine Antwortdatei erstellt.INS". indem Sie im Verzeichnis mit dem Installationsabbilds folgenden Befehl ausführen: setup –s Wenn sich die Antwortdatei anderswo befindet. Wenn das Programm im Modus "Record" (Aufzeichnen) ausgeführt wird. Diese Datei enthält die Antworten. v So wird eine dialogfreie Installation verwendet: 1 Fügen Sie den entsprechenden Befehl in Ihre Installationsprozedur ein. Wenn die Antwortdatei sich im Installations-Verzeichnis befindet. In der folgenden Befehlszeile darf es keine Leerstelle zwischen f1 und dem Anführungszeichen geben. das Betriebssystem neu zu starten. WAIT ). Dialogfreie Installation ausführen Ihr eigenes Installationsprogramm muss die dialogfreie Installation von Adaptive Server Anywhere mit der Option –s aufrufen. damit die dialogfreie Installation von Adaptive Server Anywhere ausgeführt wird. Die Antwortdatei erhält den Namen setup. In diesem Abschnitt wird beschrieben. müssen Sie den Pfad mit der Option –f1 angeben. 423 . die Sie während der Installation in den Dialogfeldern gegeben haben. "-s". können Sie die dialogfreie Installation ausführen. schlägt es nicht vor. auch wenn ein Neustart erforderlich ist.iss" Wenn die Installation von einem anderen InstallShield-Skript ausgeführt werden soll. Während der dialogfreien Installation können Pfade aufgehoben werden. die beim Bereitstellen von Adaptive Server Anywhere auf dem Computer des Endbenutzers für die Benutzung mit Ihrer Anwendung eingerichtet werden sollen. wie eine dialogfreie Installation verwendet wird. 4 Installieren Sie Adaptive Server Anywhere mit den Optionen und Einstellungen. setup –s –f1"c:\winnt\setup. können Sie folgenden Befehl benutzen: DoInstall( "Pfad_des_ASA_Installationsabbilds\SETUP.iss und befindet sich im Windows-Verzeichnis.

log im Zielverzeichnis. mit folgender Bedeutung: ♦ ♦ Reboot=0 Neustart nicht erforderlich. 3 Prüfen Sie. die die dialogfreie Installation aufgerufen hat. Ein Nicht-NullResultCode gibt an. 2 Prüfen Sie. Eine Beschreibung der Fehlercodes finden Sie in der Dokumentation zu InstallShield. ist verantwortlich für die Prüfung des Eintrags "Reboot" und ggf. Die Logdatei enthält einen Bericht über die dialogfreie Installation. 1.Dialogfreie Installation für die Systemeinführung Zum Aufheben der Pfade für das Adaptive Server AnywhereVerzeichnis und für das gemeinsam genutzte Verzeichnis können Sie Optionen benutzen: setup TARGET_DIR=Verzeichnisname SHARED_DIR=Gem_Verzeichnis –s Die Argumente TARGET_DIR und SHARED_DIR müssen allen anderen Optionen vorangestellt werden. Der letzte Abschnitt dieser Datei heißt ResponseResult und enthält die folgende Zeile: ResultCode=Wert Diese Zeile gibt an. für den Neustart des Zielcomputers. damit die Installation abgeschlossen wird. ob das Setup ordnungsgemäß abgeschlossen wurde. Die dialogfreie Installation von Adaptive Server Anywhere startet den Computer nicht neu. ob der Zielcomputer neu gestartet werden muss. ob der Zielcomputer neu gestartet werden muss. Reboot=1 Die Option BATCH_INSTALL war während der Installation aktiviert und der Zielcomputer muss neu gestartet werden. ob die Installation erforderlich war. Mögliche Werte sind 0 bzw. dass während der Installation ein Fehler aufgetreten ist. Setup erstellt eine Datei namens setup. Die Installationsprozedur. die den Zielcomputer nicht neu startet. Diese Datei enthält nur einen Abschnitt mit der Bezeichnung ResponseResult und der folgenden Zeile: Reboot=Wert Diese Zeile gibt an. 424 . SMS-Installation Microsoft System Management Server (SMS) erfordert eine dialogfreie Installation. Setup erstellt eine Datei namens silent.log im Verzeichnis mit der Antwortdatei.

damit eine MIF-Datei erzeugt wird. Die MIF-Datei wird von SMS verwendet um festzustellen. Die SetupBefehlszeile in der PDF-Datei enthält die folgenden Optionen: ♦ ♦ ♦ Die Option –s für eine dialogfreie Installation Die Option –SMS zur Angabe. ob die Installation erfolgreich war.pdf enthalten (auf der Adaptive Server Anywhere-CD-ROM im Ordner \Extras).Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Ihr SMS-Distributionspaket müsste eine Antwortdatei. das Installationsabbild und die Paket-Definitionsdatei asa8. 425 . dass die Installation von SMS ausgelöst wird Die Option –m.

Jeder OLE DB-Clientrechner muss folgende Elemente aufweisen: ♦ Eine funktionierende OLE DB-Installation OLE DB-Dateien und Anweisungen für ihre Verteilung können bei der Microsoft Corporation bezogen werden. Ihre eigene Installation zu erstellen. Hinweise dazu finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. JDBC. die für den Adaptive Server Anywhere OLE DB-Provider erforderlich sind.Clientanwendungen im System bereitstellen Clientanwendungen im System bereitstellen Um eine Clientanwendung im System bereitzustellen. die InstallShield-Objekte und Vorlagen zu verwenden. die Sie den Endbenutzern bereitstellen müssen. die mit einem Netzwerk-Datenbankserver betrieben wird. Weitere Hinweise finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. Die einfachste Methode zur Bereitstellung von Clients ist es. Verbindungsinformationen Jede Clientanwendung benötigt ♦ Verbindungsinformationen für die Datenbank. OLE DB. Die erforderlichen Interface-Dateien und Verbindungsinformationen richten sich nach der Schnittstelle.und ADO-Clients bereitstellen Die einfachste Art. müssen Sie jedem Endbenutzer folgende Elemente zur Verfügung stellen: ♦ ♦ Clientanwendung Die Anwendungssoftware selbst ist von der Datenbanksoftware unabhängig und wird hier nicht beschrieben. die sie benutzt (ODBC. die mitgelieferten InstallShield-Objekte zu verwenden. die von Ihrer Anwendung benutzt wird. Diese Dateien sollten in nur einem Verzeichnis abgelegt werden. Die Adaptive Server AnywhereInstallation platziert sie alle in das Betriebssystem-Unterverzeichnis des SQL Anywhere-Installationsverzeichnisses (zum Beispiel: win32). OLE DB-Clientbibliotheken bereitzustellen. Jede Schnittstelle wird in den folgenden Abschnitten im Einzelnen beschrieben. Embedded SQL oder Open Client). 426 . Sie werden hier nicht im Einzelnen beschrieben. Datenbank-Interface-Dateien Die Clientanwendung benötigt die Dateien für die Datenbank-Schnittstelle. ist es. wenn Sie vorhaben. Dieser Abschnitt beschreibt die Dateien. ♦ Der Adaptive Server Anywhere OLE DB-Provider Die folgende Tabelle enthält die Dateien.

Auf Plattformen. Sie werden hier nicht im Einzelnen beschrieben. ODBC-Clients bereitzustellen. für die ein ODBC-Treibermanager verfügbar ist.dll dboledb8.dll Nicht zutreffend OLE DB-Provider benötigen viele Registrierungseinträge.dll dbcon8. die InstallShieldObjekte und Vorlagen zu verwenden.dll dblgen8.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Beschreibung OLE DB-Treiberdatei OLE DB-Treiberdatei SprachenRessourcebibliothek Dialogfeld "Verbinden" Windows Windows CE dboledb8. Hinweise dazu finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. $ Weitere Hinweise finden Sie unter "Datenbanken für Windows CE erstellen" auf Seite 300 der Dokumentation ASA Datenbankadministration und "ODBC-Anwendungen unter Windows CE verknüpfen" auf Seite 281. Sie können diese erstellen. ist es. indem Sie die DLLs mit dem Dienstprogramm regsvr32 unter Windows oder dem Dienstprogramm regsvrce unter Windows CE selbst registrieren. ist das nicht zu empfehlen. Jeder ODBC-Clientrechner muss folgende Elemente aufweisen: ♦ Eine funktionierende ODBC-Installation ODBC-Dateien und Anweisungen für ihre Verteilung können bei der Microsoft Corporation bezogen werden. Es gibt keinen ODBC-Treibermanager für Windows CE. SQL Anywhere Studio enthält einen ODBC Driver Manager für UNIX. Microsoft liefert den ODBC-Treibermanager für WindowsBetriebssysteme. ODBC-Anwendungen können ohne den Treibermanager laufen.dll dboledba8.dll dblgen8.dll dboledba8. ODBC-Clients im System bereitstellen Die einfachste Art. 427 .

wenn die Endbenutzer eigene Datenquellen erstellen sollen. Wenn Sie Ihre eigene Anwendung bereitstellen. Diese Dateien sollten in nur einem Verzeichnis abgelegt werden. Das Dialogfeld "Verbinden" ist erforderlich.so libdbtasks8.so dblgen8. Diese Informationen sind normalerweise in der ODBC-Datenquelle enthalten. $ Weitere Hinweise finden Sie unter "Erforderliche Dateien für den ODBC-Treiber" auf Seite 428.res Nicht zutreffend Sprachendblgen8.dll Ressourcebibliothek Dialogfeld "Verbinden" dbcon8. ♦ 428 . Anweisungen für die Bereitstellung von ODBC finden Sie im Microsoft ODBC SDK. müssen Sie sichergehen. dass die ODBC-Installation den Anforderungen Ihrer Anwendung entspricht.Clientanwendungen im System bereitstellen Falls erforderlich ODBC aktualisieren Das SQL Anywhere Setup-Programm aktualisiert alte Installationen der Microsoft Data Access-Komponenten. einschließlich ODBC.dll dblgen8. Die Adaptive Server Anywhere-Installation platziert sie alle in das BetriebssystemUnterverzeichnis des SQL Anywhere-Installationsverzeichnisses (zum Beispiel: win32). aus denen sie die Informationen für die Verbindung mit dem Server bezieht.dll Hinweise ♦ Der Endbenutzer muss über eine funktionierende ODBC-Installation mit einem Treibermanager verfügen. ♦ Der ODBC-Treiber für Adaptive Server Anywhere Dies ist die Datei dbodbc8.dll dbodbc8. Beschreibung ODBC-Treiber Windows Windows CE UNIX dbodbc8. ♦ Verbindungsinformation Die Clientanwendung muss Zugriff auf die Daten haben. Erforderliche Dateien für den ODBC-Treiber Die folgende Tabelle zeigt die Dateien.dll mit ihren Zusatzdateien. bei der Verbindungsaufnahme Benutzer-IDs und Kennwörter eingeben müssen oder wenn Das Dialogfeld aus anderen Gründen angezeigt werden muss. die für einen funktionierenden ODBC-Treiber von Adaptive Server Anywhere erforderlich sind.dll Nicht zutreffend libdbodbc8.

$ Weitere Hinweise finden Sie unter "Datenbanken für Windows CE erstellen" auf Seite 300 der Dokumentation ASA Datenbankadministration. Wenn Sie ein Setup-Programm für die Endbenutzer erstellen.dll Pfad\dbodbc8.so. Der ODBC-Treiber von Adaptive Server Anywhere wird im System durch eine Gruppe von Registrierungseinträgen im folgenden Registrierungsschlüssel angemeldet: HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBCINST. Windows Das Setup-Programm von Adaptive Server Anywhere führt Änderungen in der Systemregistrierung durch. und "ODBC-Anwendungen unter Windows CE verknüpfen" auf Seite 281.dll Es gibt auch einen Registrierungseintrag im folgenden Schlüssel: HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBCINST.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen ♦ Der ODBC-Übersetzer ist nur erforderlich. wenn Ihre Anwendung eine Umwandlung von OEM in ANSI durchführt.INI\ Adaptive Server Anywhere 8. ♦ Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie libdbodbc8_r. um die Registrierungseinträge anzuzeigen. um den ODBC-Treiber anzumelden und zu konfigurieren. sondern auch eine Reihe von Einträgen in der Registrierung vornehmen.0 Folgende Werte werden gesetzt: Name des Wertes Driver Setup Typ des Wertes Zeichenfolge Zeichenfolge Daten des Wertes Pfad\dbodbc8.INI\ ODBC Drivers 429 . ODBC-Treiber konfigurieren Das Setup-Programm muss nicht nur die Dateien des ODBC-Treibers auf die Festplatte kopieren. damit der ODBC-Treiber richtig installiert wird. müssen Sie dieselben Einstellungen vornehmen.so und libdbtasks8_r. Sie können das Dienstprogramm regedit verwenden.

finden Sie in der Dokumentation dieses ODBC-Treibers Hinweise dazu. Einstellungen für die Datenquelle enthalten den Standort der Datenbankdatei. Die Definitionen der Benutzerdatenquellen werden in der Registrierung im Abschnitt für den aktuell im System angemeldeten Benutzer gespeichert. In diesem Abschnitt finden Sie die Informationen. wobei die Dienste auch aktiv sind. Systemdatenquellen und Dateidatenquellen.Clientanwendungen im System bereitstellen Der Wert ist wie folgt: Name des Wertes Adaptive Server Anywhere 8. Die Bereitstellung einer ODBC-Datenquelle erfolgt auf folgende Weise: ♦ Programmgesteuert Fügen Sie die Beschreibung für eine Datenquelle in die Registrierung des Endbenutzers oder in die ODBCInitialisierungsdateien ein. den Namen des Datenbankservers sowie Startparameter und andere Optionen. indem er "DSN=MeineAnwendung" in der ODBCVerbindungszeichenfolge eingibt. ♦ Manuell Übergeben Sie den Endbenutzern Anweisungen. Bei einer richtig konfigurierten Systemdatenquelle "MeineAnwendung" kann jeder Benutzer diese ODBC-Verbindung verwenden. damit sie auf ihrem Rechner eine geeignete Datenquelle einrichten können. Verbindungsinformationen bereitstellen Die Verbindungsinformationen für den ODBC-Client werden im Allgemeinen in Form einer ODBC-Datenquelle im System bereitgestellt. indem Sie das Register Benutzer-DSN oder System-DSN verwenden. Arten von Datenquellen Es gibt drei Arten von Datenquellen: Benutzerdatenquellen. 430 . Systemdatenquellen hingegen stehen allen Benutzern und Diensten von Windows zur Verfügung. die Sie für beide Ansätze benötigen. wie der ODBC-Treiber zu konfigurieren ist. wenn kein Benutzer angemeldet ist.0 Typ des Wertes Zeichenfolge Daten des Wertes Installed ODBC-Treiber von Drittanbietern Wenn Sie einen ODBC-Treiber eines Drittanbieters auf einem anderen Betriebssystem als Windows verwenden. Sie können eine Datenquelle manuell mit dem ODBC Administrator erstellen. Der ODBC-Treiber von Adaptive Server Anywhere zeigt den Konfigurationsdialog für die Eingabe der Einstellungen an.

folgende Einstellungen: Name des Wertes Autostop DatabaseFile Description Driver PWD Start UID Typ des Wertes Zeichenfolge Zeichenfolge Zeichenfolge String String String String Daten des Wertes yes Pfad\asademo. die jeweils einem Verbindungsparameter entsprechen.0 entspricht.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Dateidatenquellen werden nicht in der Registrierung gespeichert. Eine Verbindungszeichenfolge muss einen FileDSN-Verbindungsparameter liefern.INI\ Benutzerdatenquellenname Für Systemdatenquellen ist der Schlüssel wie folgt: HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBC. Registrierungseinträge für die Datenquelle Jede Benutzerdatenquelle ist im System über Registrierungseinträge angemeldet.exe -c 8m dba In diesen Einträgen steht Pfad für das Installationsverzeichnis von Adaptive Server Anywhere.INI\ Systemdatenquellenname Der Schlüssel enthält eine Gruppe von Registrierungswerten.dll sql Pfad\win32\dbeng8. sondern in einem speziellen Verzeichnis.0 Sample". Außerdem müssen Sie die Datenquelle der Liste von Datenquellen in der Registrierung hinzufügen. Zum Beispiel enthält der Schlüssel "ASA 8.db Adaptive Server Anywhere Beispieldatenbank Pfad\win32\dbodbc8. um eine Dateidatenquelle benutzen zu können. Für Benutzerdatenquellen benutzen Sie folgenden Schlüssel: 431 . Für Benutzerdatenquellen ist der Schlüssel wie folgt: HKEY_CURRENT_USER\ SOFTWARE\ ODBC\ ODBC. Sie müssen eine Gruppe von Registrierungswerten in einem bestimmten Registrierungsschlüssel angeben. der der Datenquelle der Beispieldatenbank von ASA 8.

werden erst die aktuellen Definitionen von Benutzerdatenquellen in der Registrierung durchsucht. Beispiel: Die Benutzerdatenquelle. heißt "ASA 8. Dateidatenquellen werden nur durchsucht. 432 . wenn eine Datenquelle vorhanden ist und in die Verbindungszeichenfolge der Anwendung als Parameter DSN oder FileDSN einbezogen ist.0 Vorsicht: ODBC-Einstellungen können leicht angezeigt werden Die Konfiguration von Benutzerdatenquellen kann vertrauliche Datenbankeinstellungen enthalten.B. und die Daten des Wertes sind der Name des ODBC-Treibers.Clientanwendungen im System bereitstellen HKEY_CURRENT_USER\ SOFTWARE\ ODBC\ ODBC.INI\ ODBC Data Sources Der Wert verknüpft jede Datenquelle mit einem ODBC-Treiber. dann die Systemdatenquellen. Diese Einstellungen werden in der Registrierung in reiner Textform gespeichert und können mit Registrierungseditoren von Windows regedit.0 Sample" und hat folgenden Wert: Name des Wertes ASA 8. Der Name des Wertes ist der Datenquellenname. Die folgende Tabelle zeigt die Auswirkungen auf Benutzer und Entwickler. wie z. Erforderliche und fakultative Verbindungsparameter Sie können den Datenquellennamen in einem ODBC-Konfigurationseintrag in folgender Weise definieren: DSN=Benutzerdatenquellenname Wenn ein DSN-Parameter in der Verbindungszeichenfolge geliefert wird.exe angezeigt werden. die von Adaptive Server Anywhere installiert wird.INI\ ODBC Data Sources Für Systemdatenquellen benutzen Sie folgenden Schlüssel: HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBC. Benutzerkennungen und Kennwörter. Sie können Kennwörter verschlüsseln oder von Benutzern verlangen. wenn "FileDSN" in der Zeichenfolge für die ODBCVerbindung geliefert wird.exe oder regedt32. sie bei der Aufnahme der Verbindung einzugeben.0 Sample Typ des Wertes Zeichenfolge Daten des Wertes Adaptive Server Anywhere 8. Diese Editoren sind in jedem Windows-System automatisch installiert.

fakultativ andere Verbindungsparameter wie Benutzerkennung und Kennwort $ Weitere Hinweise zu ODBC-Verbindungen und Konfigurationen finden Sie unter ♦ ♦ "Verbindung mit einer Datenbank herstellen" auf Seite 41 der Dokumentation ASA Datenbankadministration. des Datenbankservers. ist es. Hinweise dazu finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. den Namen der Datenbankdatei. 433 . Open Database Connectivity (ODBC) SDK von Microsoft Bereitstellen von Embedded SQL-Clients Die einfachste Art. fakultativ die Benutzerkennung und das Kennwort Der Name des zu verwendenden ODBCTreibers in folgendem Format: Driver={ODBC Treibername} Benutzer-ID und Kennwort. die Startparameter sowie Benutzer-ID und Kennwort Enthält nur Namen und Speicherort des ODBCTreibers Name der Datenbankdatei oder des Datenbankservers. die InstallShield-Objekte und Vorlagen zu verwenden. wenn nicht in der Zeichenfolge für die ODBC-Verbindung geliefert Nicht vorhanden Ebenfalls: Name der Datenbank.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Datenquelle Eingabe in der Verbindungszeichenfolge Keine zusätzlichen Informationen Eingabe durch den Benutzer Keine zusätzlichen Informationen Enthält den ODBCTreibernamen und – Speicherort. Embedded SQL-Clients bereitzustellen. wenn nicht im DSN oder in der Zeichenfolge für die ODBC-Verbindung angegeben. Benutzerkennung und Kennwort. Datenbankdatei oder Datenbankserver.

Verbindungsinformation Die Clientanwendung muss Zugriff auf die ♦ Daten haben.Clientanwendungen im System bereitstellen Die Bereitstellung von Embedded SQL-Clients im System umfasst folgende Aufgaben: ♦ Installierte Dateien Jeder Clientrechner muss die erforderlichen Dateien für eine Adaptive Server Anywhere Embedded SQL-Clientanwendung enthalten. um die Verbindungsparameter zu speichern. libdbtasks8.so.dll Hinweise ♦ ♦ Die Netzwerkport-DLL ist nicht erforderlich. Wenn die Clientanwendung eine ODBC-Datenquelle benutzt. ♦ Das Dialogfeld "Verbindung" ist erforderlich. Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie libdbodbc8_r. aus denen sie die Informationen für die Verbindung mit dem Server bezieht. wenn der Client nur mit dem Personal Datenbankserver arbeitet. Dateien für Embedded SQL-Clients installieren Die folgende Tabelle zeigt. ♦ 434 .so dblgen8. wenn die Endbenutzer eigene Datenquellen erstellen. Beschreibung Schnittstellenbibliothek SprachenRessourcebibliothek Windows UNIX dblib8. $ Weitere Hinweise zur Bereitstellung von ODBC-Informationen im System finden Sie unter "ODBC-Clients im System bereitstellen" auf Seite 427.so und libdbtasks8_r. Anweisungen für die Bereitstellung von ODBC finden Sie im Microsoft ODBC SDK.res Nicht zutreffend Nicht zutreffend IPX dbipx8. welche Dateien für Embedded SQL Clients benötigt werden. Diese Informationen können in die ODBCDatenquelle aufgenommen werden. muss der Endbenutzer über eine funktionierende ODBC-Installation verfügen.dll dblgen8.so.dll libdblib8. bei der Verbindungsaufnahme BenutzerIDs und Kennwörter eingeben müssen oder wenn das Dialogfeld aus anderen Gründen angezeigt werden muss.dll Netzwerkkommunikation Dialogfeld "Verbinden" dbcon8.

jar Diese muss sich im Classpath der Anwendung befinden.dll Diese muss sich im Systempfad befinden. Hinweise finden Sie unter "ODBC-Clients im System bereitstellen" auf Seite 427. den zu verwendenden Rechner und den Port an. Dies ist eine unflexible Methode. ♦ Die ODBC-Treiberdateien. Dieser URL gibt den Treiber. 435 .sybase.oder Linux-Umgebungen ist die Datei eine gemeinsam genutzte Bibliothek (dbjodbc8. um sich mit der Datenbank zu verbinden. dbjodbc8.so). $ Hinweise zur Bereitstellung von jConnect finden Sie unter http://manuals. ODBC-Datenquelle Sie können die ODBC-Datenquelle verwenden. die beispielsweise bei einem Upgrade von Datenbanken umfassende Neuprogrammierungen erforderlich macht. Hartcodiert Sie können Verbindungsinformationen in der Anwendung ♦ ♦ programmieren. auf dem der Datenbankserver auf Daten wartet. die Verbindungsinformationen in einem Format enthält. damit sie auf ihrem Rechner eine geeignete Datenquelle einrichten können. Zur Bereitstellung der JDBC-ODBC-Brücke müssen die folgenden Dateien mitgeliefert werden: ♦ ♦ jodbc. JDBC-Clients im System bereitstellen Zusätzlich zur Java-Laufzeitumgebung (Java Runtime Environment) muss jeder JDBC-Client auch über den JDBC-Treiber jConnect von Sybase oder die JDBC-ODBC-Brücke verfügen. Ihre Java-Anwendung benötigt einen URL. Datei Übergeben Sie den Endbenutzern eine Datei. In UNIX.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Verbindungsinformationen Verbindungsinformation Die Bereitstellung von Embedded SQLVerbindungsinformationen erfolgt auf folgende Weise: ♦ ♦ Manuell Übergeben Sie den Endbenutzern Anweisungen. Weitere Hinweise finden Sie unter "Erforderliche Dateien für den ODBC-Treiber" auf Seite 428. um darin die Verbindungsinformationen zu speichern.com/onlinebooks/group-jc/jcg0420e/ auf der SybaseWebsite. In diesem Fall benötigen Sie eine Teilgruppe der ODBC-Dateien von Microsoft. das Ihre Anwendung lesen kann.

Hinweise zur Interface-Datei finden Sie in der Open ClientDokumentation und unter "Open Server konfigurieren" auf Seite 122 der Dokumentation ASA Datenbankadministration. 436 . $ Verbindungsinformationen für Open Client-Clients sind in der InterfaceDatei zu finden. Sie enthält eigene Installationsanweisungen. Sie müssen die Open Client-Software getrennt bei Sybase erwerben.Clientanwendungen im System bereitstellen $ Weitere Hinweise zu URL finden Sie unter "Einem Server einen URL liefern" auf Seite 152. muss auf jedem Rechner Sybase Open Client installiert sein. Open Client-Anwendungen im System bereitstellen Um Open Client-Anwendungen bereitzustellen.

Die einfachste Methode zur Bereitstellung von Verwaltungstools ist es. die mitgelieferten InstallShield-Objekte zu verwenden. sollten Sie die C-Version von Interactive SQL (dbisqlc. Interactive SQL bereitstellen Wenn Ihre Kundenanwendung auf Rechnern mit begrenzten Ressourcen läuft. Das dbisqlc-Programm erfordert die clientseitigen Embedded SQLStandardbibliotheken.exe und die dazugehörigen JavaKlassen).exe) an Stelle der Standardversion bereitstellen (dbisql. 437 . Weitere Hinweise finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. Sybase Central und das Überwachungsdienstprogramm dbconsole bereitstellen. $ Hinweise über die Systemanforderungen von Verwaltungstools finden Sie unter "Systemvoraussetzungen für das Administrationstool" auf Seite 153 der Dokumentation SQL Anywhere Studio Erste Orientierung.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Tools zur Verwaltung bereitstellen Abhängig von Ihrer Lizenzvereinbarung können Sie eine Reihe von Verwaltungstools wie Interactive SQL.

Die einfachste Methode zur Bereitstellung eines Personal Datenbankservers oder eines Netzwerk-Datenbankserver ist es.zip (1.so dblgen8. libdbtasks8_r.1 initialisiert wurden.3) dbmem.res libdbjava8.cvf Verzeichnis charsets\ asajdbc.so (1) Nicht zutreffend (2) dbsrv8.so dbextf.cvf charsets/ directory asa.so asa.so.3) asajrt12.res dbjava8.zip bereit. stellen Sie asajdbc. müssen Sie eine Gruppe von Dateien installieren.so. wenn Sie Java in der Datenbank verwenden. Die Dateien werden in der folgenden Tabelle angeführt.dll asa. stellen Sie asajrt13.3) asajrt12. 438 . die mitgelieferten InstallShieldObjekte zu verwenden.2 oder JDK 1. die Dateien des Datenbankservers weiterzugeben.dll oder dblgde8. Windows UNIX NetWare Nicht zutreffend dbeng8. Die Weitergabe dieser Dateien unterliegt den Bestimmungen der Lizenzvereinbarung. libdbtasks8.zip (1.zip (1.zip (1. indem Sie das Setup-Programm für das SQL Anywhere Studio den Endbenutzern übergeben.3 initialisiert wurden.zip (1.dll dbserv8. Wenn der Endbenutzer die richtigen Installationsoptionen wählt. Sie müssen vorher feststellen. Bei Datenbanken. die mit JDK 1. ob Sie das Recht haben.dll (1) dbctrs8.zip (1.nlm (1) Nicht zutreffend libdbextf. verfügt er garantiert über alle erforderlichen Dateien.3) classes.dll dbjava8.zip bereit.cvf N/A 1.zip (1. Bei Datenbanken. die mit JDK 1.zip (1.exe dbsrv8.3) classes. Um einen Datenbankserver zu betreiben.dll dbextf.3) classes.nlm (2) asajdbc.zip (1.nlm Nicht zutreffend Nicht zutreffend dblgen8.Datenbankserver im System bereitstellen Datenbankserver im System bereitstellen Sie können einen Datenbankserver im System bereitstellen.3) N/A libunic.dll dblgen8. Weitere Hinweise finden Sie unter "InstallShieldObjekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420.so dbserv8.dll (2) dbeng8 dbsrv8 libdbserv8. Nur erforderlich.3) asajrt12.exe dbserv8.vxd (4) libunic.3) N/A N/A asajdbc.

wie etwa CD-ROM.dll) ist nur erforderlich. Hinweise ♦ Je nach Konfiguration müssen Sie den Personal Datenbankserver (dbeng8) oder den Netzwerk-Datenbankserver (dbsrv8) im System bereitstellen. Erforderlich auf Windows 95/98/Me. Wenn der Datenbankserver sauber herunterfährt. Datenbanken auf schreibgeschützten Datenträgern bereitstellen Sie können Datenbanken auf schreibgeschützten Datenträgern verteilen. wenn der Datenbankserver die Funktionalität von Java in der Datenbank verwenden soll. So installieren. wenn die dynamische Cachebelegung verwendet wird. die für das Ausführung von Dienstprogrammen wie dbbackup erforderlich sind. indem Sie die Datenbankdatei auf der Festplatte des Endbenutzers installieren. Nur erforderlich. Die Tabelle enthält keine Dateien. ♦ Die zip-Dateien sind nur für Anwendungen erforderlich. Für Anwendungen mit SQL Remote muss die Datenbank in einem ordentlich synchronisierten Zustand erstellt werden und daher wird kein Transaktionslog benötigt. Sie können dafür das Extraktionsdienstprogramm verwenden. die Java in der Datenbank verwenden und werden an einem Standort in der Umgebungsvariable CLASSPATH auf dem Rechner des Benutzers installiert. 439 . brauchen Sie mit der Datenbankdatei kein Transaktionslog bereitzustellen. wenn Sie erweiterte Systemprozeduren und Funktionen benutzen (xp_). 3. wird ein neues Transaktionslog erstellt. 4. sofern Sie sie im schreibgeschützten Modus oder mit einer Write-Datei ausführen.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen 2. Wenn der Endbenutzer die Datenbank startet. Datenbanken im System bereitstellen Eine Datenbankdatei wird im System bereitgestellt. dass die Klassen in dieser Datei über die Umgebungsvariable CLASSPATH gefunden werden. Die Java DLL (dbjava8. ♦ ♦ $ Hinweise zur Bereitstellung von Datenbank-Dienstprogrammen im System finden Sie unter "Tools zur Verwaltung bereitstellen" auf Seite 437. $ Weitere Hinweise zum Ausführen von Datenbanken im schreibgeschützten Modus finden Sie unter "–r-Serveroption" auf Seite 166 der Dokumentation ASA Datenbankadministration.

In der Write-Datei werden Änderungen gespeichert. einer Festplatte. die auf der Festplatte ein Transaktionslog führt. wie etwa CD-ROM. die auf schreibgeschützten Datenträgern geliefert werden.B. die in einer schreibgeschützten Datenbank durchgeführt werden. der Schreiben und Lesen zulässt. z. die Write-Datei hingegen auf der Festplatte. Die Verbindung wird mit der WriteDatei aufgenommen. $ Weitere Hinweise zu Write-Dateien finden Sie unter "Mit WriteDateien arbeiten" auf Seite 247 der Dokumentation ASA Datenbankadministration.Datenbankserver im System bereitstellen Damit Änderungen an Adaptive Server Anywhere-Datenbanken vorgenommen werden können. In diesem Fall wird die Datenbankdatei auf der CD-ROM gespeichert. Sie befindet sich auf einem Datenträger. 440 . können Sie eine Write-Datei verwenden.

$ Hinweise zur Bereitstellung von Datenbankservern finden Sie unter "Datenbankserver im System bereitstellen" auf Seite 438. Personal Server im System bereitstellen Wenn Sie eine Anwendung im System bereitstellen. Eine eingebettete Datenbankanwendung enthält folgende Komponenten: ♦ Datenbankserver Der Adaptive Server Anywhere Personal Datenbankserver. die die von der Anwendung benutzten Daten aufnimmt. dass Sie die Java zip-Dateien und die Java-DLL bereitstellen müssen. bei denen die Anwendung und die Datenbank auf demselben Rechner untergebracht sind. wenn Ihre Anwendung Java in der Datenbank benutzt.dll) wird vom Client und vom Server gemeinsam genutzt. dass Sie die Installationsvorgaben von Adaptive Server Anywhere einhalten und die Dateien für Client und Server in demselben Verzeichnis installieren. Beachten Sie.exe) gemeinsam mit Ihrer Anwendung im System bereitstellen müssen. Sie brauchen nur ein Exemplar dieser Datei. müssen Sie sowohl die Komponenten der Clientanwendung bereitstellen.Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Eingebettete Datenbankanwendungen im System bereitstellen In diesem Abschnitt finden Sie Informationen über die Bereitstellung von eingebetteten Datenbanken. als auch die Komponenten des Datenbankservers.B. ♦ SQL Remote Wenn Ihre Anwendung die Replikation mit SQL Remote benutzt. Datenbank-Dienstprogramme bereitstellen Wenn Sie Datenbank-Dienstprogramme (wie z. Die Sprachen-Ressourcebibliothek (dblgen8. ♦ Die Datenbank Sie müssen eine Datenbankdatei im System bereitstellen. dbbackup. müssen Sie das Deployment von SQL Remote Message Agent vornehmen. die den Personal Server benutzt. Es wird empfohlen. brauchen Sie die Programmdatei des Dienstprogramms mit folgenden zusätzlichen Dateien: 441 .

res libdbfile8.so Libdbwtsp8.so.dll dblgen8.dll dbwtsp8.dll dbftp8.dll dbsmtp8. die die Anwendung benutzen wird.so.dll dblgen8. Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie libdbodbc8_r.dll dbmapi8. müssen folgende Dateien installiert werden: Beschreibung Nachrichtenagent Bibliothek der Datenbanktools Zusätzliche Bibliothek Sprachen-Ressourcebibliothek Bibliothek für VIMNachrichtenverbindungen1 Bibliothek für SMTPNachrichtenverbindungen1 Bibliothek für FILENachrichtenverbindungen1 Bibliothek für FTPNachrichtenverbindungen1 Bibliothek für MAPINachrichtenverbindungen1 Schnittstellenbibliothek 1 Windows UNIX dbremote.res Hinweise ♦ Die Datenbanktools sind Embedded SQL-Anwendungen.dll dbvim8.Eingebettete Datenbankanwendungen im System bereitstellen Beschreibung Bibliothek der Datenbanktools Zusätzliche Bibliothek Sprachen-Ressourcebibliothek Verbindungsdialog (nur dbisqlc) Windows UNIX Dbtool8.so und libdbtasks8_r.dll dbremote libdbtools8.so dblgen8.dll dblib8. Siehe dazu die Liste in "Bereitstellen von Embedded SQL-Clients" auf Seite 433.dll dbfile8. ♦ SQL Remote im System bereitstellen Wenn Sie den Nachrichtenagenten von SQL Remote im System bereitstellen. libdbtasks8.dll dbwtsp8.so libdbwtsp8. libdbtasks8.dll dbcon8.so dblgen8. Sie müssen die für diese Anwendungen erforderlichen Dateien bereitstellen. 442 .so Stellen Sie nur die Bibliothek für die Nachrichtenverbindung bereit.so.exe dbtool8.dll libdbtools8.

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen Es wird empfohlen.so. 443 .so und libdbtasks8_r. dass Sie die Installationsvorgaben von Adaptive Server Anywhere einhalten und die Dateien für SQL Remote in demselben Verzeichnis installieren wie Adaptive Server Anywhere. Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie libdbodbc8_r.

Eingebettete Datenbankanwendungen im System bereitstellen 444 .

K A P I T E L 1 3 Fehlermeldungen des SQL-Präprozessors Über dieses Kapitel Inhalt In diesem Kapitel finden Sie eine Liste aller Fehler. sortiert nach Fehlernummern SQLPP-Fehler Seite 446 450 445 .und Warnmeldungen des SQL-Präprozessors. Thema Fehlermeldungen des SQL-Präprozessors.

Fehlermeldungen des SQL-Präprozessors. sortiert nach Fehlernummern Fehlernummer 2601 2602 Meldung "Subskriptionswert %1 zu groß" auf Seite 464 "Kombinierter Zeiger und Arrays für Hosttypen nicht zulässig" auf Seite 455 "Nur eindimensionale Arrays werden für den 'char'-Typ unterstützt" auf Seite 463 "VARCHAR-Typ muss eine Länge haben" auf Seite 454 "Arrays von VARCHAR nicht unterstützt" auf Seite 454 "VARCHAR-Hostvariable können keine Zeiger sein" auf Seite 453 "Initialisieren bei der VARCHARHostvariablen nicht zulässig" auf Seite 459 "FIXCHAR-Typ muss eine Länge haben" auf Seite 451 "Arrays werden für FIXCHAR nicht unterstützt" auf Seite 454 "Arrays dieses Typs werden nicht unterstützt" auf Seite 455 "Beim Dezimaltyp muss die Anzahl der Dezimalstellen angegeben werden" auf Seite 463 "Dezimalzahlen-Arrays sind nicht zulässig" auf Seite 454 "Unbekannter Hostvariablen-Typ" auf Seite 453 "Ungültige Ganzzahl" auf Seite 460 "'%1' Hostvariable muss ein CZeichenfolgentyp sein" auf Seite 450 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 446 . sortiert nach Fehlernummern Fehlermeldungen des SQL-Präprozessors.

Dies ist eine '%1' Erweiterung" auf Seite 458 2626 2627 2628 2629 2630 2631 2633 2634 2635 447 .Kapitel 13 Fehlermeldungen des SQL-Präprozessors Fehlernummer 2617 2618 2619 2620 2621 2622 2623 2625 Meldung "Das Symbol ’%1’ ist bereits definiert" auf Seite 450 "Ungültiger Typ für SQLAnweisungsvariable" auf Seite 461 "Include-Datei '%1' kann nicht gefunden werden" auf Seite 451 "Hostvariable '%1' ist unbekannt" auf Seite 457 "Indikatorvariable '%1' ist unbekannt" auf Seite 459 "Ungültiger Typ für Indikatorvariable '%1'" auf Seite 460 "Ungültiger Hostvariablen-Typ auf '%1'" auf Seite 460 "Hostvariable '%1' hat zwei verschiedene Definitionen" auf Seite 457 "Anweisung '%1' wurde vorher noch nicht vorbereitet" auf Seite 463 "Cursor '%1' wurde vorher noch nicht deklariert" auf Seite 455 "Unbekannte Anweisung '%1'" auf Seite 465 "Hostvariable für diesen Cursor nicht zulässig" auf Seite 457 "Hostvariable zweimal angegeben bei 'Declare' und bei 'Open'" auf Seite 458 "Host-Liste oder Using-Klausel für %1 muss angegeben werden" auf Seite 461 "Keine INTO-Klausel in SELECTAnweisung" auf Seite 462 "Fehlerhafte SQL-Sprachensyntax Dies ist eine '%1' Erweiterung" auf Seite 458 "Fehlerhafte Embedded-SQLSprachensyntax .

ignoriert" auf Seite 452 "Nicht erkannte SQL-Syntax" auf Seite 465 "Unbekannte SQL-Funktion '%1'" auf Seite 465 "Falsche Anzahl von Parametern für SQL-Funktion '%1'" auf Seite 466 "Statische Anweisungsnamen funktionieren nicht richtig. wenn von 2 Threads benutzt" auf Seite 463 2639 2640 2641 2642 2646 2647 2648 2649 2650 2651 2652 2660 2661 2662 2663 2664 448 .Fehlermeldungen des SQL-Präprozessors. sortiert nach Fehlernummern Fehlernummer 2636 2637 Meldung "Fehlerhafte Embedded-SQL-Syntax" auf Seite 458 "Fehlendes schließendes Anführungszeichen für die Zeichenfolge" auf Seite 461 "Token zu lang" auf Seite 464 "'%1' Hostvariable muss ein Ganzzahltyp sein" auf Seite 450 "SQLDA muss für DESCRIBE angegeben werden" auf Seite 462 "Zwei SQLDAs für denselben Typ angegeben (INTO oder USING)" auf Seite 453 "Statische Cursor können nicht beschrieben werden" auf Seite 455 "Makros können nicht neu definiert werden" auf Seite 453 "Ungültige Arraydimension" auf Seite 453 "Ungültiger Deskriptor-Index" auf Seite 459 "Ungültiges Feld für SET DESCRIPTOR" auf Seite 460 "Feld in SET DESCRIPTOR Anweisung mehr als einmal verwendet" auf Seite 456 "Datenwert muss eine Hostvariable sein" auf Seite 456 "Into-Klausel in 'declare cursor' nicht zulässig .

Kapitel 13 Fehlermeldungen des SQL-Präprozessors Fehlernummer 2665 2666 2667 2668 2669 2680 Meldung "Hostvariable ’%1!’ wurde neu definiert" auf Seite 457 "Erweiterung des Herstellers" auf Seite 466 "Intermediate-SQL-Merkmal" auf Seite 459 "Volles SQL-Merkmal" auf Seite 456 "Transact-SQL-Erweiterung" auf Seite 464 "Kein ’Declare’-Abschnitt und keine INCLUDE SQLCA Anweisung" auf Seite 462 "Temporäre Datei kann nicht geöffnet werden" auf Seite 465 "Fehler beim Lesen der temporären Datei" auf Seite 456 "Fehler beim Schreiben der Ausgabedatei" auf Seite 456 "Inkonsistente Zahl von Hostvariable für diesen Cursor" auf Seite 452 "Inkonsistente Hostvariablentypen für diesen Cursor" auf Seite 452 "Inkonsistente Indikatorvariable für diesen Cursor" auf Seite 452 "Merkmal steht bei UltraLite nicht zur Verfügung" auf Seite 451 "Kein OPEN-Befehl für Cursor '%1'" auf Seite 462 "Kein FETCH.oder PUT-Befehl für Cursor '%1'" auf Seite 462 "Hostvariable '%1' wird mit unterschiedlichen Indikatoren mehr als einmal verwendet" auf Seite 451 "Größenlimit für long binary/long varchar ist 65535 für UltraLite" auf Seite 461 2681 2682 2683 2690 2691 2692 2693 2694 2695 2696 2697 449 .

SQLPP-Fehler SQLPP-Fehler In diesem Abschnitt finden Sie die Meldungen. und der übergebene Wert war keine C-Zeichenfolge. in der nur Hostvariablen vom Ganzzahltyp zulässig sind. Die Meldungen können je nach Einstellung durch die Befehlszeilenparameter Fehler-. $ Weitere Hinweise zum SQL-Präprozessor und zu seinen Befehlszeilenparametern finden Sie unter "SQL-Präprozessor" auf Seite 249. 450 . in einer Anweisung verwendet. die vom SQL-Präprozessor generiert werden. ’%1’ Hostvariable muss ein C-Zeichenfolgentyp sein Fehlernummer 2615 Mögliche Ursache Fehlertyp Fehler Eine C-Zeichenfolge war in einer Embedded SQL-Anweisung erforderlich (für einen Cursornamen.). Warnmeldungen oder beides sein. ’%1’ Hostvariable muss ein Ganzzahltyp sein Fehlernummer 2640 Mögliche Ursache Fehlertyp Fehler Sie haben eine Hostvariable. die kein Ganzzahltyp ist. Das Symbol ’%1’ ist bereits definiert Fehlernummer 2617 Mögliche Ursache Fehlertyp Fehler Sie haben eine Hostvariable zweimal definiert. Optionsnamen etc.

dass der Präprozessor die INCLUDE-Umgebungsvariable zur Suche nach IncludeDateien verwendet. aber keine Länge angegeben. die von UltraLite nicht unterstützt wird. Beachten Sie. um eine Hostvariable des Typs FIXCHAR zu deklarieren. FIXCHAR-Typ muss eine Länge haben Fehlernummer 2608 Mögliche Ursache Fehlertyp Fehler Sie haben den Makro DECL_FIXCHAR benutzt. Dies wird nicht unterstützt. Hostvariable ’%1’ wird mit unterschiedlichen Indikatoren mehr als einmal verwendet Fehlernummer 2696 Mögliche Ursache Fehlertyp Fehler Sie haben dieselbe Hostvariable mehrere Male mit unterschiedlichen Indikatorvariablen in derselben Anweisung verwendet.Kapitel 13 Fehlermeldungen des SQL-Präprozessors Include-Datei ’%1’ kann nicht gefunden werden Fehlernummer Fehlertyp 2619 Mögliche Ursache Fehler Die angegebene Include-Datei wurde nicht gefunden. 451 . Merkmal steht bei UltraLite nicht zur Verfügung Fehlernummer 2693 Mögliche Ursache Fehlertyp Markierung (Warnung oder Fehler) Sie haben eine Funktion benutzt.

Into-Klausel in 'declare cursor' nicht zulässig .ignoriert Fehlernummer 2660 Mögliche Ursache Fehlertyp Warnung Sie haben eine INTO-Klausel mit einer DECLARE CURSOR-Anweisung verwendet. oder Sie haben keine Indikatorvariable benutzt. Die Anzahl von Hostvariablentypen muss für den Cursor konsistent sein.SQLPP-Fehler Inkonsistente Hostvariablentypen für diesen Cursor Fehlernummer 2691 Mögliche Ursache Fehlertyp Fehler Sie haben eine Hostvariable mit einem anderen Typ oder einer anderen Länge verwendet als vorher mit diesem Cursor. 452 . Inkonsistente Indikatorvariable für diesen Cursor Fehlernummer 2692 Mögliche Ursache Fehlertyp Fehler Sie haben eine Indikatorvariable benutzt. Hostvariablentypen müssen für den Cursor konsistent sein. Indikatorvariablen müssen bei Cursorn konsistent verwendet werden. Inkonsistente Zahl von Hostvariable für diesen Cursor Fehlernummer 2690 Mögliche Ursache Fehlertyp Fehler Sie haben eine andere Anzahl von Hostvariablen benutzt als vorher mit dem Cursor benutzt wurde. obwohl vorher mit dem Cursor keine verwendet wurde. obwohl vorher mit dem Cursor eine benutzt wurde. Die INTO-Klausel wird ignoriert.

Zwei SQLDAs für denselben Typ angegeben (INTO oder USING) Fehlernummer 2642 Mögliche Ursache Fehlertyp Fehler Sie haben zwei INTO DESCRIPTOR. möglicherweise in einer Header-Datei. der vom SQLPräprozessor nicht verstanden wird. VARCHAR-Hostvariable können keine Zeiger sein Fehlernummer 2606 Fehlertyp Fehler 453 .oder zwei USING DESCRIPTORKlauseln für diese Anweisung angegeben.Kapitel 13 Fehlermeldungen des SQL-Präprozessors Ungültige Arraydimension Fehlernummer 2648 Mögliche Ursache Fehlertyp Fehler Die Arraydimension der Variablen ist negativ. Makros können nicht neu definiert werden Fehlernummer 2647 Mögliche Ursache Fehlertyp Fehler Ein Präprozessor-Makro wurde zweimal definiert. Unbekannter Hostvariablen-Typ Fehlernummer 2613 Mögliche Ursache Fehlertyp Fehler Sie haben eine Hostvariable eines Typs angegeben.

Dies ist kein zulässiger Hostvariablentyp. Arrays werden für FIXCHAR nicht unterstützt Fehlernummer 2609 Mögliche Ursache Fehlertyp Fehler Sie haben versucht.SQLPP-Fehler Mögliche Ursache Sie haben versucht. eine Hostvariable als Array von FIXCHAR-Arrays zu deklarieren.oder BINARY-Hostvariable mit dem DECL_VARCHAR. eine Hostvariable als Zeiger auf einen VARCHAR. eine Hostvariable als Array von VARCHAR. aber keine Größe für das Array angegeben. eine VARCHAR. Dies ist kein zulässiger Hostvariablentyp. VARCHAR-Typ muss eine Länge haben Fehlernummer 2604 Mögliche Ursache Fehlertyp Fehler Sie haben versucht. Dies ist kein zulässiger Hostvariablentyp.oder DECL_BINARY-Makro zu deklarieren.oder BINARY-Arrays zu deklarieren. Arrays von VARCHAR nicht unterstützt Fehlernummer 2605 Mögliche Ursache Fehlertyp Fehler Sie haben versucht. Dezimalzahlen-Arrays sind nicht zulässig Fehlernummer 2612 Fehlertyp Fehler 454 .oder BINARY-Typ zu deklarieren.

CLOSE etc. Kombinierter Zeiger und Arrays für Hosttypen nicht zulässig Fehlernummer 2602 Mögliche Ursache Fehlertyp Fehler Sie haben ein Array von Zeigern als Hostvariable benutzt. ohne vorher deklariert worden zu sein. ein Hostvariablen-Array eines Typs zu deklarieren. Arrays dieses Typs werden nicht unterstützt Fehlernummer 2610 Mögliche Ursache Fehlertyp Fehler Sie haben versucht. OPEN.Kapitel 13 Fehlermeldungen des SQL-Präprozessors Mögliche Ursache Sie haben versucht. Cursor ’%1’ wurde vorher noch nicht deklariert Fehlernummer 2627 Mögliche Ursache Fehlertyp Fehler Ein Embedded SQL-Cursorname wurde benutzt (in FETCH. Statische Cursor können nicht beschrieben werden Fehlernummer 2646 Mögliche Ursache Fehlertyp Fehler Sie haben einen statischen Cursor beschrieben. Ein dezimales Array ist kein zulässiger Hostvariablentyp. der nicht unterstützt wird. eine Hostvariable als Array von DECIMAL-Arrays zu deklarieren. 455 . Beim Beschreiben eines Cursors muss der Cursorname in einer Hostvariablen angegeben sein.). Dies ist nicht zulässig.

Feld in SET DESCRIPTOR Anweisung mehr als einmal verwendet Fehlernummer 2651 Mögliche Ursache Fehlertyp Fehler Dasselbe Schlüsselwort wurde mehr als einmal in einer einzigen SET DESCRIPTOR-Anweisung verwendet. Fehler beim Lesen der temporären Datei Fehlernummer 2682 Mögliche Ursache Fehlertyp Fehler Beim Lesen aus einer temporären Datei ist ein Fehler aufgetreten. Volles SQL-Merkmal Fehlernummer 2668 Fehlertyp Markierung (Warnung oder Fehler) 456 . Fehler beim Schreiben der Ausgabedatei Fehlernummer 2683 Mögliche Ursache Fehlertyp Fehler Beim Schreiben in die Ausgabedatei ist ein Fehler aufgetreten.SQLPP-Fehler Datenwert muss eine Hostvariable sein Fehlernummer 2652 Mögliche Ursache Fehlertyp Fehler Die in der SET DESCRIPTOR-Anweisung benutzte Variable wurde nicht als Hostvariable deklariert.

dass die Hostvariablen in einem C-Modul global sind. -we oder -wi im Präprozessor verarbeitet. Hostvariable für diesen Cursor nicht zulässig Fehlernummer 2629 Fehlertyp Fehler 457 . Hostvariable ’%1!’ wurde neu definiert Fehlernummer 2665 Mögliche Ursache Fehlertyp Warnung Sie haben dieselbe Hostvariable mit einem anderen Hosttyp neu definiert. -ei. und diese Hostvariable wurde nicht in einem Declare-Abschnitt deklariert. Für den SQL-Präprozessor sind Hostvariable globale Variable: zwei Hostvariable mit unterschiedlichen Typen können niemals den gleichen Namen haben.Kapitel 13 Fehlermeldungen des SQL-Präprozessors Mögliche Ursache Sie haben eine volle SQL/92-Funktion verwendet und mit den Optionen -ee. Hostvariable ’%1’ ist unbekannt Fehlernummer 2620 Mögliche Ursache Fehlertyp Fehler Sie haben eine Hostvariable in einer Anweisung benutzt. Beachten Sie. Hostvariable ’%1’ hat zwei verschiedene Definitionen Fehlernummer 2625 Mögliche Ursache Fehlertyp Fehler Dieselbe Hostvariable wurden in demselben Modul mit zwei verschiedenen Typen definiert.

SQLPP-Fehler

Mögliche Ursache

Hostvariable sind in der Declare-Anweisung für den angegebenen Cursor nicht zulässig. Wenn der Cursorname über eine Hostvariable übergeben wird, müssen Sie volle dynamische SQL verwenden und die Anweisung vorbereiten. Eine vorbereitete Anweisung kann Hostvariable aufweisen.

Hostvariable zweimal angegeben - bei ’Declare’ und bei ’Open’
Fehlernummer 2630 Mögliche Ursache Fehlertyp Fehler

Sie haben Hostvariablen für einen Cursor in den Declare- und OpenAnweisungen angegeben. Im statischen Fall müssen Sie Hostvariable in der Declare-Anweisung angeben. Im dynamischen Fall geben Sie sie in der Open-Anweisung an.

Fehlerhafte Embedded-SQL-Sprachensyntax - Dies ist eine ’%1’ Erweiterung
Fehlernummer 2635 Fehlertyp Fehler

Fehlerhafte Embedded-SQL-Syntax
Fehlernummer 2636 Mögliche Ursache Fehlertyp Fehler

Eine Embedded SQL-spezifische Anweisung (OPEN, DECLARE, FETCH etc.) hat einen Syntaxfehler.

Fehlerhafte SQL-Sprachensyntax - Dies ist eine ’%1’ Erweiterung
Fehlernummer 2634 Fehlertyp Fehler

458

Kapitel 13 Fehlermeldungen des SQL-Präprozessors

Indikatorvariable ’%1’ ist unbekannt
Fehlernummer 2621 Mögliche Ursache Fehlertyp Fehler

Sie haben eine Indikatorvariable in einer Anweisung benutzt, und diese Indikatorvariable wurde nicht in einem Declare-Abschnitt deklariert.

Initialisieren bei der VARCHAR-Hostvariablen nicht zulässig
Fehlernummer 2607 Mögliche Ursache Fehlertyp Fehler

Sie können keinen C-Variablen-Initialisierer für eine Hostvariable des Typs VARCHAR oder BINARY angeben. Sie müssen diese Variable in regulätem ausführbarem C-Code initialisieren.

Intermediate-SQL-Merkmal
Fehlernummer 2667 Mögliche Ursache Fehlertyp Markierung (Warnung oder Fehler)

Sie haben eine Intermediate-SQL/92-Funktion verwendet und mit den Optionen -ee oder -we im Präprozessor verarbeitet.

Ungültiger Deskriptor-Index
Fehlernummer 2649 Mögliche Ursache Fehlertyp Fehler

Sie haben weniger als eine Variable mit der Anweisung ALLOCATE DESCRIPTOR zugewiesen.

459

SQLPP-Fehler

Ungültiges Feld für SET DESCRIPTOR
Fehlernummer 2650 Mögliche Ursache Fehlertyp Fehler

Ein ungültiges oder unbekanntes Schlüsselwort ist in einer SET DESCRIPTOR-Anweisung vorhanden. Schlüsselwörter können nur sein: TYPE, PRECISION, SCALE, LENGTH, INDICATOR oder DATA.

Ungültiger Hostvariablen-Typ auf '%1'
Fehlernummer 2623 Mögliche Ursache Fehlertyp Fehler

Sie haben an einer Stelle, an der der Präprozessor eine Hostvariable vom Zeichenfolgentyp erwartete, eine Hostvariable verwendet, die kein Zeichenfolgentyp ist.

Ungültige Ganzzahl
Fehlernummer 2614 Mögliche Ursache Fehlertyp Fehler

Eine Ganzzahl wurde in einer Embedded SQL-Anweisung (für einen FetchOffset oder einen Hostvariablen-Arrayindex, etc.) erwartet, und der Präprozessor konnte das übergebene Element nicht in eine Ganzzahl konvertieren.

Ungültiger Typ für Indikatorvariable '%1'
Fehlernummer 2622 Mögliche Ursache Fehlertyp Fehler

Indikatorvariable müssen den Typ "short int" haben. Sie haben eine Variable eines anderen Typs als Indikatorvariable verwendet.

460

Kapitel 13 Fehlermeldungen des SQL-Präprozessors

Ungültiger Typ für SQL-Anweisungsvariable
Fehlernummer 2618 Mögliche Ursache Fehlertyp Fehler

Eine Hostvariable, die als Anweisungsbezeichner benutzt wird, muss vom Typ a_sql_statement_number sein. Sie haben versucht, eine Hostvariable eines anderen Typs als Anweisungsbezeichner zu benutzen.

Größenlimit für long binary/long varchar ist 65535 für UltraLite
Fehlernummer 2697 Mögliche Ursache Fehlertyp Fehler

Bei der Verwendung von DECL_LONGBINARY oder DECL_LONGVARCHAR mit UltraLite ist die Obergrenze für das Array 64 KByte.

Fehlendes schließendes Anführungszeichen für die Zeichenfolge
Fehlernummer 2637 Mögliche Ursache Fehlertyp Fehler

Sie haben eine Zeichenfolgenkonstante in einer Embedded SQL-Anweisung eingegeben, aber es ist kein schließendes Anführungszeichen für das Zeilenende oder das Dateiende vorhanden.

Host-Liste oder Using-Klausel für %1 muss angegeben werden
Fehlernummer 2631 Mögliche Ursache Fehlertyp Fehler

Die angegebene Anweisung benötigt die Angabe von Hostvariablen in einer Hostvariablenliste oder aus einer SQLDA.

461

SQLPP-Fehler

SQLDA muss für DESCRIBE angegeben werden
Fehlernummer 2641 Fehlertyp Fehler

Kein FETCH- oder PUT-Befehl für Cursor '%1'
Fehlernummer 2695 Mögliche Ursache Fehlertyp Fehler

Ein Cursor ist deklariert und geöffnet, wird aber nie verwendet.

Keine INTO-Klausel in SELECT-Anweisung
Fehlernummer 2633 Mögliche Ursache Fehlertyp Fehler

Sie haben eine statische Embedded-SQL-SELECT-Anweisung angegeben, aber keine INTO-Klausel für die Ergebnisse festgelegt.

Kein OPEN-Befehl für Cursor '%1'
Fehlernummer 2694 Mögliche Ursache Fehlertyp Fehler

Ein Cursor ist deklariert und möglicherweise benutzt, wird aber nie geöffnet.

Kein ’Declare’-Abschnitt und keine INCLUDE SQLCA Anweisung
Fehlernummer 2680 Mögliche Ursache Fehlertyp Fehler

Die EXEC SQL INCLUDE SQLCA-Anweisung fehlt in der Quelldatei.

462

Kapitel 13 Fehlermeldungen des SQL-Präprozessors

Nur eindimensionale Arrays werden für den 'char'-Typ unterstützt
Fehlernummer 2603 Mögliche Ursache Fehlertyp Fehler

Sie haben versucht, eine Hostvariable als Array von Zeichen-Arrays zu deklarieren. Dies ist kein zulässiger Hostvariablentyp.

Beim Dezimaltyp muss die Anzahl der Dezimalstellen angegeben werden
Fehlernummer 2611 Mögliche Ursache Fehlertyp Fehler

Sie müssen die Dezimalstellen angeben, wenn Sie eine gepackte dezimale Hostvariable mit dem Makro DECL_DECIMAL deklarieren. Die Gesamtstellenanzahl ist fakultativ.

Anweisung ’%1’ wurde vorher noch nicht vorbereitet
Fehlernummer 2626 Mögliche Ursache Fehlertyp Fehler

Ein Embedded SQL-Anweisungsname wurde benutzt (EXECUTE), ohne vorher vorbereitet worden zu sein.

Statische Anweisungsnamen funktionieren nicht richtig, wenn von 2 Threads benutzt
Fehlernummer 2664 Fehlertyp Warnung

463

SQLPP-Fehler

Mögliche Ursache

Sie haben einen statischen Anweisungsnamen benutzt und mit dem Wiedereintrittsparameter -r im Präprozessor verarbeitet. Statische Anweisungsnamen bewirken, dass statische Variable generiert werden, die aus der Datenbank einfließen. Wenn zwei Threads dieselbe Anweisung verwenden, kommt es wegen dieser Variablen zum Engpass. Benutzen Sie eine lokale Hostvariable als Anweisungsbezeichner, und nicht einen statischen Namen.

Subskriptionswert %1 zu groß
Fehlernummer 2601 Mögliche Ursache Fehlertyp Fehler

Sie haben versucht, eine Hostvariable zu indizieren, die in einem Array mit einem zu großen Wert für das Array liegt.

Token zu lang
Fehlernummer 2639 Mögliche Ursache Fehlertyp Fehler

Der SQL-Präprozessor hat eine maximale Tokenlänge von 2 KByte. Alle Token über 2 KByte ergeben diesen Fehler. Für Konstantenzeichenfolgen in Embedded SQL-Befehlen (Hauptursache für diesen Fehler) benutzen Sie eine Zeichenfolgenverkettung, um eine längere Zeichenfolge zu ermöglichen.

Transact-SQL-Erweiterung
Fehlernummer 2669 Mögliche Ursache Fehlertyp Markierung (Warnung oder Fehler)

Sie haben eine Sybase Transact-SQL-Funktion verwendet, die von SQL/92 nicht definiert wurde, und mit den Parametern -ee, -ei, -ef, -we, -wi oder -wf im Präprozessor verarbeitet.

464

Kapitel 13 Fehlermeldungen des SQL-Präprozessors

Temporäre Datei kann nicht geöffnet werden
Fehlernummer 2681 Mögliche Ursache Fehlertyp Fehler

Beim Öffnen einer temporären Datei ist ein Fehler aufgetreten.

Unbekannte SQL-Funktion ’%1’
Fehlernummer 2662 Mögliche Ursache Fehlertyp Warnung

Sie haben eine SQL-Funktion benutzt, die dem Präprozessor nicht bekannt ist und die wahrscheinlich einen Fehler generieren wird, sobald die Anweisung an die Datenbankengine geschickt wurde.

Unbekannte Anweisung ’%1’
Fehlernummer 2628 Mögliche Ursache Fehlertyp Fehler

Sie haben versucht, eine Embedded SQL-Anweisung zu löschen, die nicht existiert.

Nicht erkannte SQL-Syntax
Fehlernummer 2661 Mögliche Ursache Fehlertyp Warnung

Sie haben eine SQL-Anweisung benutzt, die wahrscheinlich einen Syntaxfehler generieren wird, sobald sie an die Datenbankengine geschickt wurde.

465

SQLPP-Fehler

Erweiterung des Herstellers
Fehlernummer 2666 Mögliche Ursache Fehlertyp Markierung (Warnung oder Fehler)

Sie haben eine Adaptive Server Anywhere-Funktion verwendet, die von SQL/92 nicht definiert wurde, und mit den Parametern -ee, -ei, -ef, -we, -wi oder -wf im Präprozessor verarbeitet.

Falsche Anzahl von Parametern für SQL-Funktion '%1'
Fehlernummer 2663 Mögliche Ursache Fehlertyp Warnung

Sie haben eine SQL-Funktion mit der falschen Anzahl von Parametern verwendet. Dies wird wahrscheinlich einen Fehler generieren, sobald die Anweisung an die Datenbankengine gesendet wurde.

466

Index

a_validate_db, Struktur, 363

>
>> Java in der Datenbank-Methoden, 77

a_validate_type, Aufzählungstyp, 369 a_writefile, Struktur, 364 Abfragen ADO-Recordset-Objekt, 377, 379 einzelne Zeilen, 214 Java in der Datenbank, 117 JDBC, 169 Abrollbare Cursor JDBC-Unterstützung, 145 Abrollender Cursor, 23 Abrufen Objekte, 174 ODBC, 300 SQLDA, 235 ActiveX-Datenobjekte Info, 374 ADO Abfragen, 377, 379 Aktualisierungen, 379 Befehle, 376 Befehlsobjekt, 376 Cursor, 28, 379 Cursortypen, 26 Einführung in die Programmierung, 3 Info, 374 Recordset-Objekt, 377, 379 SQL-Anweisungen in Anwendungen verwenden, 10 Verbindungen, 374 Verbindungsobjekt, 374 Aggregatfunktionen Java in der Datenbank, Spalten, 120

A
a_backup_db, Struktur, 335 a_change_log, Struktur, 337 a_compress_db, Struktur, 339 a_compress_stats, Struktur, 340 a_create_db, Struktur, 341 a_crypt_db, Struktur, 343 a_db_collation, Struktur, 344 a_db_info, Struktur, 345 a_dblic_info, Struktur, 348 a_dbtools_info, Struktur, 349 a_name, Struktur, 351 a_stats_line, Struktur, 352 a_sync_db, Struktur, 352 a_syncpub, Struktur, 355 a_sysinfo, Struktur, 356 a_table_info, Struktur, 356 a_translate_log, Struktur, 357 a_truncate_log, Struktur, 358

467

73 468 . 426 Bereitstellung. 97 ASAJDBCDRV. 100 an_erase_db. 98 ASAProv OLE DB-Provider. Assistent. 379 alloc_sqlda. 85. 350 an_unload_db. 422 Anweisungen COMMIT.zip Datenbankserver bereitstellen. 287 Anwendungen bereitstellen. 43 Array. Struktur. 367 Auslagerbar Definition. 247 Anführungszeichen Java in der Datenbank. 98 asajrt12. 218 asademo. 253 alloc_sqlda_noind. 433 Anwendungen mit mehreren Threads ODBC. JAR-Datei Info. 361 Anforderungen abbrechen. 278. 52 ROLLBACK TO SAVEPOINT. 367 Aufzählungstypen DBTools-Schnittstelle. Struktur. 133 Auffüllen mit Leerzeichen. xv Antwortdatei Definition. 411 SQL. 24 Anweisungs-Handle ODBC. 78 Angeführte Bezeichner SQL_needs_quotes-Funktion. 105 Java-Klasse hinzufügen. 367 Ausführlichkeit. 247 Anforderungsverarbeitung Embedded SQL. JAR-Datei Info. 416 Arbeitstabellen Cursor-Performance. 10 Anwendungen bereitstellen Embedded SQL. Struktur. Struktur. 101 Attribute Java in der Datenbank. positionsbasiert. 390 Anforderungen abbrechen Embedded SQL. 253 ALTER DATABASE. 12 PUT. 372 Assistenten JAR. 140 Ausnahmen Java. 97 ASAJSystem. Funktion.zip Laufzeitklassen.und ZIP-Datei erstellen. 438 Laufzeitklassen. 99.A–A Aktualisierungen Cursor. xiv asajdbc.db. 24 ROLLBACK. Anweisung Java in der Datenbank. Datei Info. 24 INSERT. positionsbasiert. 104 Neue Java-Klasse erstellen. 218 ARRAY. 282 Anwendungen mit Threadverarbeitung UNIX. Funktion. 359 an_upgrade_db. 293 UNIX. JAR-Datei Info. 270 Anregungen Dokumentation. Klausel FETCH-Anweisung. 52 DELETE. 257 Open Client-Anwendungen. 52 UPDATE. 98 ASAJRT. 349 an_expand_db. 161 Upgrade einer Datenbank. Abrufe Info.

173 Bereich Java. Überblick.B–B autocommit ODBC. 138 Berechtigungen JDBC. 412 MobiLink-Synchronisationsserver. 418 Beschreiben Ergebnismengen. 289 steuern. 253 BINARY. 433 Interactive SQL. 438 jConnect. Datentypen Embedded SQL. 427 ODBC-Treiber. 422 siehe auch Bereitstellung. 436 Personal Datenbankserver. 185 Bibliotheksfunktionen Embedded SQL. 138 UPDATE-Anweisung. Modus Implementierung. 72 Bereitstellen Anwendungen.db. 422 ohne Dialog. 137 Neuberechnungen. 435 JDBC-ODBC-Brücke. 188 ODBC. 376 Befehlsobjekt ADO. 139 erstellen. 376 Beispieldatenbank Info über asademo. 435 ODBC. 47 Beständigkeit Java in den Datenbankklassen. 426 Open Client. 319 Embedded SQL. 190 esqldll. 437 Bereitstellung Dateistandorte. 439 SQL Remote. 137 INSERT-Anweisung. 164 Autocommit. 191 Embedded SQL-Anwendungen. 270 Bibliotheken Embedded SQL. 441 Embedded SQL. 420 Methoden. 442 Sybase Central. 411 InstallShield. 428 OLE DB-Provider.c. 426 Datenbanken. xiv Java in der Datenbank. 437 Verwaltungstools. 50 AutoCommit JDBC. 76 Berechnete Spalten Begrenzungen. 139 Trigger. 51 Transaktionen. 437 eingebettete Datenbanken. 193 Windows-Dienste. 223 B Befehle ADO-Befehlsobjekt. 435 JDBC-Clients. 439 Datenbanken auf CD-ROM. 441 schreibgeschützte Datenbanken. 138 Java in der Datenbank. Dienstprogramm. 437 Java in der Datenbank. 80 Betriebssystem Dateinamen. 49 Datenbankserver. 285 statische Cursor in Embedded SQL. 201 Bindevariable Info. 286 Benutzerdefinierte Klassen Java in der Datenbank. 415 Datenbanken und Anwendungen. 412 Write-Dateien. 438 dbconsole. 417 Bezeichner Anführungszeichen nötig. 439 469 . 411 Info. 94 Beispiele DBTools-Programm.

97 CLASSPATH. 82 Java in der Datenbank. 150 Clientseitiges autocommit Info. 13 Bit-Felder Verwendung. 398 C C. Funktionen Embedded SQL. Methode Objektvergleiche. Option JDBC. Methode jConnect laden.sybase.C–C Bindungsparameter vorbereitete Anweisungen. 97 COMMIT. 49 CHAINED. Anweisung Autocommit-Modus. 319 BLOBs Embedded SQL. 398 CS_DATA_SENSITIVITY. Klausel CREATE TABLE. 237 in Embedded SQL abrufen. 51 CLOSE. 184 COMPUTE. 438 Laufzeitklassen. 51 steuern. 243 Callback. Anweisung embedded SQL-Syntax. 58 Class. 152 classes. Paket Laufzeitklassen. 398 CS_DATA_BOUNDARY. Programmiersprache Datentypen. 240 Block-Cursor. 262 Catch. 218 Bytecode Java-Klassen. 215 com. 137 CREATE DATABASE. 439 Chained. 164 470 . 184 Breite Ablagen. 398 CS_REG_NOTIF. 398 CS_CSR_LAST. 398 CS_CSR_PREV. 100 CREATE PROCEDURE. 201 Cache Java in der Datenbank.forName. Block Java. 247 registrieren. 22 ODBC. 243 CS_CSR_ABS. Anweisung Info. 238 in Embedded SQL senden. 50 Transaktionen. 398 CS_CSR_FIRST. 99. 82 jConnect. 29 Bookmarks ODBC-Cursor. 303 Borland C++ Unterstützung. 73 CD-ROM Datenbanken bereitstellen. 398 CS_PROTO_DYNPROC. 398 CS_CSR_REL. 261 Callbacks DB_CALLBACK_DEBUG_MESSAGE.zip Datenbankserver bereitstellen. 52 JDBC. Modus Implementierung. Anweisung embedded SQL. 120 Compiler unterstützte. 160 Info. 140 CALL. 164 compareTo. Umgebungsvariable einrichten.. Anweisung Java in der Datenbank. 50 Cursor. 49.

396 ct_send. Funktion Open Client. 23 ADO. 21 D JDBCExamples. 40 sichtbare Änderungen. 379. 20 Reihenfolge. 28. 39 unempfindlich. 415 Dateinamen Konventionen. 144 Dateien Namenskonventionen. Funktion Open Client. 15 Embedded SQL. 299 ODBC-Ergebnismengen. 398 ct_command. 26. 30 Isolationsstufe (isolation level). 27 Arbeitstabellen. 30 nicht-empfindlich. 214 Datenbankdesign Java in der Datenbank. 394 ct_results. 47 DYNAMIC SCROLL. 30. 299 ODBC-Aktualisierungen. 37 eindeutig. 52 unbestimmte Empfindlichkeit. 302 ODBC-Bookmarks. 44 Plattformen. 244 Info. 40 Schreibschutz. 258 Datenbanken bereitstellen. 37 Empfindlichkeit. 417 Versionsnummer. Beispiele. 31 Empfindlichkeit. 20. 30 Savepoints. 99. Funktion Open Client. 39 Dynamisch. Funktion Open Client. 396 CT_CURSOR. 133 Java-aktivieren. 20 vorbereitete Anweisungen. 34 Ergebnismengen. 29 abbrechen. 32. 19 Werte. 21 löschen. 15. 15 Fat. 24 anfordern. 26 Schritt für Schritt. 396 aktualisieren und löschen. 396 Mitgliedschaft. 39 NO SCROLL. 22 gespeicherte Prozeduren. 215 empfindlich. 395 ct_dynamic. 97. 22 Fetch-Vorgänge für Zeilen.D–D CS_REQ_BCP. 36 ODBC. 396 Cursor. 439 Java in der Datenbank. 28 aktualisieren. 133 Datenbankeigenschaften db_get_property-Funktion. 36 Transaktionen. 28 Open Client. 26 positionieren. 26. 28. 26. 21. 43. 153 471 . 394. Funktion Open Client. 52 Schlüsselmengen-gesteuert. 303 ODBC-Cursor-Merkmale wählen.java. 40 Cursor positionieren Fehlerbehandlung. 190 beschreiben. 22 Fetch-Vorgänge für mehrere Zeilen. 416 Sprache. 36 Verfügbarkeit. 26 Einführung. 257 abrollende. 26 verwenden. 416 Daten abrufen Embedded SQL. 26. 25. 101 URL. 416 Standorte für die Bereitstellung. 302 OLE DB. 31 Statisch. 395 Performance. 43 Beispiel C-Code. 17 SCROLL. 30 wert-empfindlich. 300 ODBC-Löschungen. 15 Interna.

335 a_change_log-Struktur. Callback-Parameter. 329 DBToolsFini-Funktion.D–D Datenbankoptionen für jConnect eingestellt. 334 dbxtract. 363 a_validate_type-Aufzählungstypen. 328 DBInfoFree-Funktion. 327 DBExpand-Funktion. 332 dbtran_userlist_type-Aufzählungstyp. Parameter. 350 an_unload_db-Struktur. 332 DBTruncateLog-Funktion. Schnittstelle a_backup_db-Struktur. 263 DB_CALLBACK_START. 367 Aufzählungstypen. 355 a_sysinfo-Struktur. 254 DB_BACKUP_READ_RENAME_LOG. Funktion Info. 352 a_sync-db-Struktur. 352 a_syncpub-Struktur. 345 a_dblic_info-Struktur. 254 DB_BACKUP_OPEN_FILE. 326 DBErase-Funktion. 254 DB_BACKUP_READ_PAGE. 247. 343 a_db_collation-Struktur. 201 dynamische SQL. 262 DB_CALLBACK_MESSAGE. 325 DBCreate-Funktion. Parameter. 364 an_erase_db-Struktur. 254 DB_BACKUP_END. Callback-Parameter. 109 Open Client. 311 Datentypen Bereiche. 254 DB_CALLBACK_CONN_DROPPED. 331 DBToolsVersion-Funktion. 337 a_compress_db-Struktur. 230 Zuordnung. 333 DBUpgrade-Funktion. 323 DBChangeLogName-Funktion. 340 a_create_db-Struktur. 328 DBLicense-Funktion. 324 DBCollate-Funktion. 391 Datentypkonvertierung Indikatorvariable. 327 DBInfoDump-Funktion. Callback-Parameter. 332 dbunload-Aufzählungstyp. 344 a_db_info-Struktur. 339 a_compress_stats-Struktur. Parameter. 356 a_translate_log-Struktur. 348 a_dbtools_info-Struktur. 367 Ausführlichkeit. 392 C-Datentypen. 324 DBCompress-Funktion. 201 Java in der Datenbank. 367 DBBackup-Funktion. 351 a_stats_line-Struktur. 228 Embedded SQL. 356 a_table_info-Struktur. 391 SQLDA. 349 a_name-Struktur. 357 a_truncate_log-Struktur. 267 Datenbank-Tools. 368 DBTranslateLog-Funktion. 330 DBToolsInit-Funktion. 254 DB_BACKUP_START. 254 DB_BACKUP_CLOSE_FILE. 154 Datenbankserver bereitstellen. CallbackParameter. 327 DBInfo. 262 DB_CALLBACK_FINISH. 262 DB_CALLBACK_DEBUG_MESSAGE. 361 Auffüllen mit Leerzeichen. 359 an_upgrade_db-Struktur. 323 DBChangeWriteFile-Funktion. 368 DBUnload-Funktion. 349 an_expand_db-Struktur. 358 a_validate_db-Struktur. Parameter. 206 db_backup. 325 DBCreateWriteFile-Funktion. 333 Info. 326 DBCrypt-Funktion. 438 Funktionen. 262 472 . 369 a_writefile-Struktur. CallbackParameter. 196 Hostvariable. Parameter. Funktion. 341 a_crypt_db-Struktur. 333 DBValidate-Funktion. 329 DBStatusWriteFile-Funktion. Parameter.

Funktion Info. 438 dbfile. 188 db_get_property. 260 db_register_a_callback. 99. 265 db_stop_engine. Callback-Parameter. 442 DBInfo. 438 dblgen8. Funktion. 428 OLE DB-Clients bereitstellen. 325 dbcon8. 324 DBCompress. 258 db_fini_dll aufrufen. 259 db_init_dll aufrufen. Dienstprogramm bereitstellen. Funktion. Funktion. 324 DBCollate. Funktion. 438 dbeng8 Datenbankserver bereitstellen. 258 db_init. 247 db_delete_file. 188 db_is_working. Funktion Info. 323 DBChangeLogName.dll Embedded SQL-Clients bereitstellen. Funktion. 268 DBBackup. 442 dblib8. Funktion. 328 dbinit (Dienstprogramm) Java in der Datenbank. 325 DBCreateWriteFile. 323 DBChangeWriteFile.dll SQL Remote bereitstellen. Funktion Info. 428 dbjava8. 257 Anforderungsverwaltung. Funktion. Funktion. Funktion Info. Funktion. 438 Embedded SQL-Clients bereitstellen. Funktion. Funktion. 247 db_start_database. Funktion. 327 DBExpand. 438 DBErase. Funktion Info. 263 db_start_engine. 262 db_cancel_request.dll Datenbankserver bereitstellen. 426 dbconsole. 261 Anforderungsverwaltung. Funktion.dll Datenbank-Dienstprogramme bereitstellen. 426 SQL Remote bereitstellen. 258 db_fini. Funktion. 437 DBCreate. Funktion Info. 441 Embedded SQL-Clients bereitstellen. 257 db_find_engine. Funktion Info. 327 dbextf. 328 DBInfoFree. Funktion. 434 ODBC-Clients bereitstellen. 428 OLE DB-Clients bereitstellen.dll Datenbankserver bereitstellen.D–D DB_CALLBACK_WAIT. 434 ODBC-Clients bereitstellen. 247 db_locate_servers.dll Embedded SQL-Clients bereitstellen. 264 db_stop_database. 266 db_string_connect. 267 db_string_disconnect. 327 DBInfoDump. Funktion. 326 dbctrs8.dll Datenbank-Dienstprogramme bereitstellen.dll Datenbankserver bereitstellen. 100 dbipx8. Funktion. Funktion. 260 Anforderungsverwaltung. Funktion Info. 434 ODBC-Clients bereitstellen. 434 Schnittstellenbibliothek. Funktion. 326 DBCrypt. Funktion. Funktion. 441 Datenbankserver bereitstellen. 182 473 . 267 db_string_ping_server.

282 dbodbc8. Aufzählungstyp. Makro. Funktion.dll SQL Remote bereitstellen. 332 DBTruncateLog. 333 dbxtract.dll Datenbank-Dienstprogramme bereitstellen. Makro. Funktion. Funktion. 359 DBUnload. 329 DBSynchronizeLog. Funktion. 311 starten. 359 DECIMAL. Funktion. 201 DECL_BINARY. 438 DBStatusWriteFile. Funktion. 201 DECL_LONGVARCHAR.dll Datenbankserver bereitstellen. 283 dboledb8.dll SQL Remote bereitstellen. 442 Windows CE. 442 dbserv8. 331 DBTools-Schnittstelle Beispielprogramm. Funktion. Aufzählungstyp. 319 DBTools-Funktionen aufrufen. 312 DBTools. 323 DBToolsVersion. (Dienstprogramm) Datenbank-Tools-Schnittstelle. 314 Einführung. 442 dbmlsync. 442 dbwtsp8. 442 dbxtract. 332 dbunload. 442 dbsrv8 Datenbankserver bereitstellen. 332 dbtran_userlist_type. 315 Funktionen.dll SQL Remote bereitstellen. 368 DBTranslateLog. Funktion. Schnittstelle beenden. 314 DBToolsFini. Dienstprogramm eigenes schreiben. 334 dbvim. 426 dboledba8.dll Datenbank-Dienstprogramme bereitstellen. 359 Header-Datei. Makro. Datentyp Embedded SQL.so UNIX ODBC-Treiber.dll OLE DB-Clients bereitstellen. 330 dbtool8. Funktion.dll ODBC-Clients bereitstellen. (Dienstprogramm) Java in der Datenbank. 352 eigenes schreiben. Funktion. 100 dbupgrad. 426 dbremote SQL Remote bereitstellen. Makro.lib Windows CE ODBC-Importbibliothek. 333 dbupgrad (Dienstprogramm) Java in der Datenbank. 201 DECL_DECIMAL. 329 dbmapi.D–D DBLicense. 201 DECL_LONGBINARY. Funktion. 438 dbsmtp. 330 DBToolsInit. 314 Verwendung. 201 DECL_FIXCHAR. 201 474 . 441 SQL Remote bereitstellen. (Dienstprogramm) C API für. 428 dbodbc8. 368 dbunload. 441 SQL Remote bereitstellen.dll OLE DB-Clients bereitstellen. Makro. 333 DBValidate. Dienstprogramm eigenes schreiben. 352 dbodbc8. 359 Header-Datei. 312 Info. 201 DECL_VARCHAR. 99 DBUpgrade. Makro.

Datentyp. 441 SQL-Präprozessor. Datentyp. 197 DT_SMALLINT Embedded SQL. 196 DT_STRING. 21 Info. 226 mehrere Ergebnismengen. 403 DLL-Eintrittspunkte. Datentyp. 198 DT_TINYINT Embedded SQL. 197 DT_VARIABLE Embedded SQL. 402 Ressourcen-Verteiler. 402 DT_BIGINT Embedded SQL. 246 SQLDA-Felder. Anweisung Info. 286 Windows. 399 Microsoft Transaction Server. Datentyp. 212 Dokumentation Konventionen. 196 Hostvariable. Datentyp. 403 Info. 26. 197 DT_FLOAT Embedded SQL. 24 DESCRIBE. 230 sqllen-Felder. 402 verteilte Transaktionen. Datentyp. 120 Distributed Transaction Coordinator dreischichtige Datenverarbeitung. Datentyp. Datentyp. Datentyp. 199 DTC dreischichtige Datenverarbeitung.D–D DECLARE. 249 DISTINCT. 196 DT_DECIMAL Embedded SQL. 232 sqltype-Feld. 47 Destruktoren Java. 197 DT_TIMESTAMP_STRUCT Embedded SQL. Cursor Embedded SQL. 196 DT_INT Embedded SQL. 196 DT_TIMESTAMP Embedded SQL. 196 DT_DATE Embedded SQL. 116 positionsbasiert. viii Dreischichtige Datenverarbeitung Architektur. 197 DT_BIT Embedded SQL. Datentyp. 215 Deklarationsabschnitt Info. Datentyp. 403 Ressourcen-Manager. 196 DT_BINARY Embedded SQL. 196 DT_UNSSMALLINT Embedded SQL. Datentyp. 72 Dienste Beispielcode. 28 Fehlerbehandlung. 39 475 . Datentyp. 403 DYNAMIC SCROLL. Schlüsselwort Java in der Datenbank. Datentyp. Datentyp. Datentyp. 232 Deskriptoren Ergebnismengen beschreiben. 403 EAServer. 200 Deklarieren Embedded SQL-Datentypen. Anweisung Java in der Datenbank-Objekte. Datentyp. 401 Distributed Transaction Coordinator. Datentyp. 253 DLLs mehrere SQLCAs. 196 DT_LONGBINARY Embedded SQL. 195. 196 DT_UNSINT Embedded SQL. 196 DT_VARCHAR Embedded SQL. 200 DELETE. 198 DT_LONGVARCHAR Embedded SQL. 198. Datentyp. 271 DT_TIME Embedded SQL. xi Dokumentation zu SQL Anywhere Studio. 286 Dienstprogramme bereitstellen. Datentyp. Spalten. 441 Datenbank-Dienstprogramme bereitstellen. 196 DT_FIXCHAR Embedded SQL. Datentyp. 196 DT_DOUBLE Embedded SQL. Anweisung Info.

186 Berechtigungen. 251 Zeilennummern. 20 Escapezeichen Java in der Datenbank. 181 Kompilieren. Anweisung. 26 Daten abrufen. 10 statische Anweisungen. 185 Info. 403 Komponenten-Transaktionsattribut. 45 Entitäten Java in der Datenbank. 223 SQLDA. 243 executeQuery. 258 Einbeziehung verteilte Transaktionen.und Verknüpfen-Prozess. Spalten. 182 Funktionen. 251 Empfindliche Cursor Beispiele für Aktualisieren. 228 SQL-Anweisungen. 304 ODBC abrufen. 166 E EAServer dreischichtige Datenverarbeitung. 169 executeUpdate. 31 Embedded SQL. 49. 133 Ergebnismengen ADO-Recordset-Objekt. Gespeicherte Prozeduren. 299. JDBC-Methode. 234 Embedded SQL autocommit-Modus. 34 Beispiele für Löschen. 37 ODBC. 441 Einstellen Werte mit SQLDA. 379 Cursor. 30. 125 Java in der Datenbank. 80 EXEC SQL Entwicklung in Embedded SQL. 300 Open Client. 215 Cursortypen. 407 Verteilte Transaktionen. 31 Isolationsstufen und. 407 Eigenschaften db_get_property-Funktion. 377. 187 EXECUTE. 244 Java in der Datenbank. 50 Befehlszusammenfassung. 120 Eingebettete Datenbanken bereitstellen. 183 F Fat Cursor. 223 Zeichenfolgen. 47 ODBC. 253 Header-Dateien. 408 transaction coordinator. 402 Eindeutige Cursor Info. 4 Entwicklung. 214 Dynamische Anweisungen.E–F Dynamische Cursor Beispiel. 37 Empfindlichkeit Beispiele für Aktualisieren. 193 Info. 184 Hostvariable. 125 Metadaten. 396 verwenden. 22 476 . 251 Cursor. 200 Importbibliotheken. 190. 272 Beispielprogramm. 28 Dynamische SQL Info. 193 Einführung. 15 gespeicherte Prozeduren. 80 SQL. 223 Dynamische Cursor. 26 Eindeutige Spalten Java in der Datenbank. 223 Gespeicherte Prozeduren in Embedded SQL. 14 Info. Methoden. 32 Cursor. 28. 32 Einführung. 28 Info. Methode Info. 34 Beispiele für Löschen.

173 Groß-/Kleinschreibung Java in der Datenbank und SQL. 125 OUT-Parameter und Java. 244 in dynamischem SQL ausführen. Verbindungsparameter db_start_engine. Vorgänge abrollende Cursor. 243 INOUT-Parameter und Java. 66 Klasse. 21 Java. 243 Ergebnismengen. 20 Cursor. 72 protected. 289 Fetch ODBC. 270 free_sqlda_noind. Methoden. 269 Finally. Funktion Info. 72. 124 ODBC. 23 Beschränkungen. 300 FETCH. Objekte. 208 sqlcode SQLCA-Feld. 306 Fehlermeldungen Embedded SQL-Funktion. 72 public. 67 Java in der Datenbank. 73 FIXCHAR. Methode verwenden. 208 SQLCODE. 119 GNU-Compiler Unterstützung.G–G Feedback geben. Spalten. Block Java. 201 ForceStart. 127 getConnection. 130 free_filled. 164 getObject. Funktion Info. 243 in dynamischem SQL erstellen. 218 Fetch. xv Fehler Codes. 176 Gleichheit Java in der Datenbank-Objekte. 28 Gespeicherte Prozeduren Embedded SQL. 323 DBTools-Funktionen aufrufen. 127 Java in der Datenbank. 271 Felder Instanz. 218 weit. 78 Java in der Datenbank. 22 Mehrere Zeilen. 22 fill_s_sqlda. 184 GRANT. 109 GROUP BY. 270 Funktionen DBTools. Funktion Info. Datentyp Embedded SQL. 215 mehrzeilig. Klausel Java in der Datenbank. 67 private. 73 Java in der Datenbank. Funktion Info. 214. 83 Festschreiben Transaktionen aus ODBC. 265 Format Java in der Datenbank. Anweisung JDBC. Anweisung dynamische Abfragen. 208 Fehlerbehandlung Cursor positionieren. 253 G Gemischte Cursor ODBC. 269 free_sqlda. 315 Embedded SQL. Methode Instanzen. 269 fill_sqlda. Funktion Info. Datentypen. 226 Info. 120 477 .

218 INSTALL. 287 Header-Dateien Embedded SQL. 183 Embedded SQL. 76 Klassenversionen. 314 Einführung. 185 NetWare. 141 Hintergrundverarbeitung Callback-Funktionen. 45 I Import. 422 Installationsprogramme Bereitstellung. 120. 151 Importbibliotheken Alternativen. Felder Info. Parameter Java in der Datenbank. 200 Info. 280 Heap-Größe Java in der Datenbank. 104. 67 Instanz. 105 Klassen für Java in der Datenbank. 422 Instanz. 201 deklarieren. 204 kürzen. 137 INOUT. Anweisung Java. 105 Java-Klassen in einer Datenbank. 206 Info. 218 Objekte. 184 ODBC.H–I H Handles ODBC zuweisen. 71 Java in der Datenbank. 247 Hinzufügen JAR-Dateien. 282 INCLUDE. 206 478 . 188 ODBC. Anweisung Einführung. Anweisung SQLCA. 205 SQLDA. 437 Isolationsstufen Anwendungen. 203 Datentypen. 21 Cursorempfindlichkeit und. 420 Bereitstellung ohne Dialog. 132 verwenden. 200 SQLDA. Anweisung Java in der Datenbank. 280 Windows CE ODBC. 172 Performance. 104 Hostvariable benutzen. 166. 104 InstallShield Adaptive Server Anywhere-Anwendungen bereitstellen. 105 Installation ohne Dialog. 206 NULL. 127 INSERT. Methoden Info. 168 mehrzeilig. 81 jConnect. 288 über ODBC. 103. 187 DBTools. 230 Indizes Java in der Datenbank. 230 Zusammenfassungen der Werte. 51 Cursor. 413 Installieren JAR-Dateien in einer Datenbank. 71 Interactive SQL bereitstellen. 68 Instanzen Java-Klassen. 71 Instanziert Definition. 208 Indikatorvariable Datentypkonvertierung. 130. 12 weit. 112 JDBC.

58. 131 Laufzeitklassen. 141 JAVA_NAMESPACE_SIZE. 99. 128 Spalten aktualisieren. 75 Virtual Machine. 144 Klassen. 66 Fragen und Antworten. 120 Sicherheitsmanagement. 97 Indizes. 61 unterstützte Plattformen. 75.. 124 Felder. 73 Java 2 unterstützte Versionen. Assistant verwenden.J–J J Jaguar EAServer. 73 Destruktoren. 130 Klassen installieren. 109 Objekte. 120. 97 Laufzeitumgebung.und ZIP-Datei erstellen verwenden. 141 Java-Klasse erstellen. Paket Laufzeitklassen. 71 Konstruktoren. 59 Überblick. 126 Info. 75 Beispiel-Tabellen. 115 Spalten berechnen. 72 Fehlerbehandlung. 101 einfügen. 112 Einführung. gespeicherte Prozeduren Beispiel. 97 JAVA_HEAP_SIZE. 130 Standardwerte. 123 Methoden. 64 Escapezeichen. 93 bereitstellen. 114 Zeilen löschen. 172 einfügen. 80 Fehler. 132 Objekte vergleichen. 60. 141 NULL. 116 Versionen. 84 Primärschlüssel. 66 Objekte einfügen. 174 Schnittstellen. 140 Speicherung. 54. 117 API. 109 die Dokumentation verwenden. 407 JAR. Assistant verwenden. 141 Werte aktualisieren. 103 Klassen kompilieren. 57 Heap-Größe. Option. 105 JAR. Option verwenden. 66 Namensbereich. 132 Objekte replizieren. Dateien aktualisieren. 119 Performance. 75 Java in der Datenbank Abfragen. 109 Speicherfragen. 103. 120 Datenbankdesign. 85 Java-Klasse hinzufügen. 55 die wichtigsten Funktionen. 57. 94 benutzen. 65 Klassen löschen. Info. 161 479 . 72 Objekte abfragen. 73 Finally-Block. 141 in der Datenbank aktivieren. 109 unterstützte Klassen. 133 Datentypen. 130 Praktische Einführung. 57 eine Datenbank aktivieren. 73 Try-Block. 114 Objekte entladen und wieder laden. 71 löschen. 96 main-Methode. 438 Beständigkeit. 94 Version. 79. 106 hinzufügen. 106 Java Catch-Block. 105 installieren. 137 Spalten erstellen. 104. 73 JDBC. 172 Java. 105 Java. 116 Java. 80 compareTo-Methode. 116 Klassenversionen. Prozedur nicht gefunden. 125 Java. Datentypen abrufen.

Datei jConnect. 164 Autocommit-Modus. 171 JDBCExamples. 103 importieren. 50 Beispiele. 64 installieren. 144 AutoCommit. 150 JDBC-Clients bereitstellen. 145 verbinden. 97 K Kapazitäten unterstützte.K–K Java-Klassen Hinzufügen. 26 Datenzugriff. Felder Info. 158 Version. 109 Beispiel. 75. 176 Info. 75 unterstützte. 146. 49. 157 clientseitig. 149. 104 Java-Sicherheitsmanagement Info. 152 Verbindungen. 150 Info.0-Funktionen. 67 Klassen. 75. 166. 165 Einführung. Methoden Info. Umgebungsvariable. 71 Java. 129 jcatalog. 155 JDBC-Treiber Kompatibilität. 106 als Datentypen. 97 Nicht-Standardklassen. 157 Verbindungscode. 435 JDBC-Treiber wählen. 398 Klassen aktualisieren. 65 Konstruktoren. 161 JDBC Arten der Benutzung. 152 Pakete. 144 INSERT-Anweisung. 157. 155 JDBC-Clients bereitstellen.sql. 161 SQL-Anweisungen. 144 Berechtigungen. 5 Info. 149 Client-Verbindungen. 151 jConnect CLASSPATH. 145 wählen. 146. 153 Verbindungen. 150 JDBC-Clients bereitstellen. 111 erstellen. 151 Systemobjekte. 164 Überblick über die Anwendungen. 435 JDBC-Treiber wählen. 157 Verbindung mit einer Datenbank. 168 jConnect. 104 installieren. 103 Instanzen. 147 SELECT-Anweisung. 71 kompilieren. 150 Einrichtung der Datenbank. 435 Laufzeitklassen. 146. 66 Laufzeit. 145 jdemo. 106 Klassen. 173 Bespiele. 147 Voraussetzungen. 68 480 . 155 verwenden. 94 JDK Definition. 165 JDBC-ODBC-Brücke erforderliche Dateien. 145 laden. 147 Version 2. 157 Cursortypen. 145 Performance. 145 verbinden. Klasse Info. 151 gelieferte Versionen. 10 Standardwerte für die Verbindung. 169 serverseitig. 149 serverseitige Verbindungen. 60 Version. 61 Versionen.sql Beispieltabellen. 144 vorbereitete Anweisungen. 151 URL.

238 in Embedded SQL senden. Datentyp Embedded SQL. 79. 96 length. Modus Implementierung. Methode Java in der Datenbank. 97 Laufzeitklassen. 77 deklarieren. 230. 116 M main. 201. 116 Java-Klassen. 211 Java in der Datenbank. 29 LONG BINARY. 232 Lesezeichen. Java in der Datenbank. 246 Mehrere Threads in Anwendungen Embedded SQL. 240 LONG VARCHAR. 97 installieren. SQLDA-Feld Info. 263 Server. 75 Laufzeitumgebung Java in der Datenbank. 416 Dokumentation. Spalten. 123 Makros _SQL_OS_NETWARE. 218 Meldungen Callback. 206 Indikatorvariable. 188 manual commit. 304 Mehrzeilige Abfragen Cursor. 50 Transaktionen. 79 Methoden >>. 49 MAX. 218 Mehrzeiliges Speichern. 21 Kompilieren und Verknüpfen. 66 Klasse. 51 steuern. 206 Löschen JAR-Dateien. 206 FETCH-Anweisung. 201. xi Konvertierung Datentypen. 68 Instanz. 263 println Java in der Datenbank. 206 Kürzen bei FETCH. 437 Konstruktoren Daten einfügen. 113 Info. 68 Java in der Datenbank. 72 L Laufzeitklassen Inhalt. Prozess. Funktion Java in der Datenbank. Datentyp Embedded SQL. 215 Mehrzeilige Abrufe. 218 Mehrzeilige Einfügungen. 72 Konventionen Dateinamen.L–M Klauseln WITH HOLD. 237 in Embedded SQL abrufen. 188 _SQL_OS_UNIX. 66 Java. 188 _SQL_OS_WINNT. 183 Komponenten Transaktionsattribut. 124 Mehrfache Ergebnismengen ODBC. 238 in Embedded SQL senden. 68 private. 120 Mehrere Ergebnismengen DESCRIBE-Anweisung. 240 481 . 408 Konsolendienstprogramm bereitstellen. 237 in Embedded SQL abrufen.

34 Beispiele für Löschen.N–O protected. 130 Typen. 39 NLM Embedded SQL-Programme. 28. 66 Klassenversionen. 107 Speicherung von Java in der Datenbank. 359 MobiLink. 26. 28 Info. 32 Einführung. 68 void-Rückgabewert. 31 Info. 280 N name. 184 MIN. Cursor Embedded SQL. 427 Cursor. 83 ODBC Abwärts-Kompatibilität. 172 entladen und wieder laden. 228 O Objekte abfragen. 132 Java in der Datenbank. 50 Beispielanwendung. 36 ntodbc. Dienstprogramm eigenes schreiben. 172 einfügen. 372 NO SCROLL. 204 Java in der Datenbank. 70 Stil. 403 Microsoft Visual C++ Unterstützung.h Info. 77 statisch. 304 Handles. 287 Header-Dateien. 174 abrufen. 132 Speicherformat. 125 Microsoft Transaction Server dreischichtige Datenverarbeitung. 293 Autocommit-Modus. 188 Newsgroups technische Unterstützung. 359 Header-Datei. 30 mlxtract. 299 Cursortypen. 280 NULL Indikatorvariable. Spalten. 289 Beispielprogramm. 431 Einführung. Synchronisationsserver Bereitstellung. 306 gespeicherte Prozeduren. 278 Einführung in die Programmierung. 285 bereitstellen. 279 Anwendungen mit mehreren Threads. 72 public. 196 Mitgliedschaft Ergebnismengen. 196 NULLWERT dynamische SQL. xv Nicht-empfindlicher Cursor Beispiele für Aktualisieren. 131 Replikation. 66 Objektorientierte Programmierung Java in der Datenbank. 304 Fehlerprüfung. 188 482 . 26 Datenquellen. 109 Nullabschlusszeichen für Zeichenfolge Embedded SQL-Datentyp. 49. Funktion Java in der Datenbank. SQLDA-Feld Info. 141 NetWare Embedded SQL-Programme. 230 Namensbereich Java in der Datenbank. 2 Ergebnismengen. 72 Punktoperator. 120 Mit Leerzeichen aufgefüllt Zeichenfolgen in Embedded SQL. 422 MSDASQL OLE DB-Provider.

280 mehrfache Ergebnismengen. 426 unterstützte Plattformen. 151 Performance Cursor. 284 Kompatibilität. Klausel Java in der Datenbank. 26 Java in der Datenbank. 278 vorbereitete Anweisungen. 145 vorbereitete Anweisungen. 24 Präprozessor ausführen. 28. 392 Datentypen. 3 Info. 391 Datentyp-Kompatibilität. 26 Datentypbereiche. Parameter Java in der Datenbank. 282 ODBC. 223 Positionsbasierte Lösch-Vorgänge. 436 SQL. 280 ODBC-Einstellungen bereitstellen. 394 SQL-Anweisungen. 379 bereitstellen. Werte. 279 linken. 278 Übereinstimmung. 182 483 . 372 Aktualisierungen. 26 Einführung in die Programmierung. 105 Java.P–P Importbibliotheken. 402 Online-Sicherungen Embedded SQL-Funktionen. Spalten. 277 Registrierungseinträge. 283 odbc. 59 Platzhalter dynamische SQL. 247 Open Client Adaptive Server Anywhere-Einschränkungen. 10 OPEN. 282. 130 JDBC. 12. 372 unterstützte Schnittstellen. 284 unterstützte Version. 398 Schnittstelle. 184 Info. 6 Open Client-Anwendungen bereitstellen. 372 Provider bereitstellen. 426 Cursor. 43. 81 jConnect. 372 ODBC und. 44 Java in der Datenbank.h Info. 71 Java in der Datenbank. 171 JDBC-Treiber. 297 Windows CE. Transaktionen dreischichtige Datenverarbeitung. 215 OpenClient Einschränkungen. 390 autocommit-Modus. 430 OLE DB Adaptive Server Anywhere. 297 Personal Server bereitstellen. 304 programmieren. 21 Positionsbasierte Update-Vorgänge. Werte. 280 kein Treiber-Manager. 127 P Pakete installieren. 379 Cursortypen. 382 OLE. 428 UNIX-Entwicklung. 391 Einführung. 431 SQL-Anweisungen. 120 OUT. 24 Positionsbasierte Updates Info. 130 Plattformen Cursor. 49. 10 Treiber bereitstellen. Anweisung Info. 398 Anforderungen. 50 Cursortypen. 428. 441 Plattenspeicher Java in der Datenbank. Treiber UNIX. 389 ORDER BY. 281.

430 ODBC. 223 PreparedStatement. 72 Programmeinstiegspunkte DBTools-Funktionen aufrufen. Anweisung. Klasse setObject-Methode. 44 Prefetch-Vorgänge mehrere Zeilen abrufen. Vorgang. 262 DB_CALLBACK_WAIT. Schnittstelle Info. 154 R Recordset-Objekt ADO. 243 Ergebnismengen. 218 weit. 168 Prozeduren Embedded SQL. 114 PreparedStatement. 263 DB_CALLBACK_START. 171 prepareStatement. Option jConnect-Einstellung. 72 Prozedur nicht gefunden. 120 Private Java-Zugriff. 316 ODBC. 153 Replikation Java in der Datenbank. Objekte. 77 PUT. Anweisung. 72 Public. 52 rt. 83 Punkt-Operator Java und SQL. 398 PREPARE. 379 Registrierung bereitstellen. 262 484 . 22 PREPARE TRANSACTION. 400 Ressourcen-Verteiler dreischichtige Datenverarbeitung. 81 Ressourcen-Manager dreischichtige Datenverarbeitung. 262 DB_CALLBACK_MESSAGE. 402 Info. 44 Cursor-Performance. Option Cursor. 304 Public Java-Zugriff. Anweisung Cursor. 97 Rückgabecodes. Anweisung Cursor. 377. 218 PUT. Fehlermeldung Java-Methoden. 71 Java-Zugriff. 431 REMOTEPWD verwenden.Q–R Prefetch Cursor. Spalten. 428. 306 Rückrufe DB_CALLBACK_CONN_DROPPED. Anweisung und OpenClient. 24 Q QUOTED_IDENTIFIER. 402 ROLLBACK TO SAVEPOINT. 14 Primärschlüssel Java in der Datenbank. 132 Reservierte Wörter SQL und Java in der Datenbank. 244 ODBC. Methode. 24 mehrzeilig. 262 DB_CALLBACK_FINISH. Felder Wichtiges.jar Laufzeitklassen. 187 Protected Java. 52 ROLLBACK. 315 Programmstruktur Embedded SQL. 43 PREFETCH.

154 Spalten Java in der Datenbank aktualisieren. 323 DBTools-Beispiel. 187 Info. 31 Software Rückgabecode. gespeicherte Prozedur Optionen für jConnect einstellen. Objekte.S–S S Savepoints Cursor. 114 Java in der Datenbank. 175 Objekte in Tabellen. 129 Sicherungen DBBackup. 316 Sortieren Java in der Datenbank-Objekte. 119 sp_tsql_environment. Klasse Info. 109 Speicher Java in der Datenbank. 258 setAutocommit. 154 SQL ADO-Anwendungen. 176 Setup-Programm dialogfreie Installation. 176 Server suchen. Systemprozedur Optionen für jConnect einstellen. 417 spt_mda. 26 Schreibschutz Datenbanken bereitstellen. 226 einzelne Zeilen. 10 ODBC-Anwendungen. 40 ODBC. Cursor Embedded SQL. 81 Schnittstelle Java. 182 Schreibgeschützte Cursor Info. Objekte. Anweisung dynamisch. 439 SCROLL. 132 485 . 417 Sprachen-DLL erhalten. 117 JDBC. 10 JDBC-Anwendungen. 164 setObject. 169 Objekte. 182 dynamisch laden. 52 Schlüsselmengen-gesteuerte Cursor Info. 10 Open Client-Anwendungen. 128. 214 Java in der Datenbank. 129 SELECT. 10 Anwendungen. 130 Sprachen Dateinamen. viii SQL Remote bereitstellen. 247 Sichtbare Änderungen Cursor. 28 Info. 268 Serveradressen Embedded SQL-Funktion. Methode verwenden. Objekte. 422 Sicherheit Java in der Datenbank. Datentypen. DBTools-Funktion. 128. Methode Info. 40 SecurityManager. 107 verteilte Datenverarbeitung. 26. 130 Objekte. 140 Speicherung Java in der Datenbank. 319 Embedded SQL-Funktionen. 442 Java in der Datenbank. 10 Embedded SQL-Anwendungen. 172 Serialisierung Java in der Datenbank. 28 Schlüsselwörter SQL und Java in der Datenbank. 10 SQL Anywhere Studio Dokumentation. 73 Schnittstellenbibliothek Dateiname.

300 SQLBindParameter. ODBC-Funktion Info. 196 SQLDriverConnect. 228 sqllen-Felder. 212 Threads. 306 SQL_NEED_DATA ODBC-Rückgabewert. 230 sqldef. 208 SQLConnect. 271 sqldabc. 299. 271 sqlda_string_length. 269 füllen. Feld Info. SQLDA-Feld Info. 229 SQLDA Deskriptoren. 229 sqldaif. 290 SQLCA ändern. Funktion Info. 269 zuweisen. 209 sqld. 306 SQL_SUCCESS_WITH_INFO ODBC-Rückgabewert. 306 SQL_SUCCESS ODBC-Rückgabewert. 297 SQLBrowseConnect. 229 sqldata. SQLDA-Feld Info. 208 mehrere. 288 SQL-Anweisungen ausführen. 208 sqlcaid SQLCA-Feld. ODBC-Funktion. 14 gespeicherte Prozeduren. 253 sqlda_storage. SQLDA-Feld Info. 208 Länge von.h Datentypen. Kommunikationsbereich Info. 208 SQL/92 SQL-Präprozessor. 290 486 . Feld Info. 306 SQL_INVALID_HANDLE ODBC-Rückgabewert. 306 sql_needs_quotes. 304 Info. 287 Parameter binden. 300 SQL_CALLBACK. Funktion Info. ODBC-Funktion Info. 250 SQLAllocHandle. Attribut Info. 269 Hostvariable. Typendeklaration. 211. 294 Info. 295 verwenden. ODBC-Funktion Anweisungen ausführen. 211 Felder. 229 freigeben. 211 sqlcabc SQLCA. ODBC-Funktion Info. 48 Felder. 261 SQL_ERROR ODBC-Rückgabewert. 306 SQL92 SQL-Präprozessor. 261 SQL_CALLBACK_PARM. 208 Info. 208 sqlcode SQLCA. 230 Info. 295 Vorbereitete Anweisungen. Funktion Info. ODBC-Funktion Info. 250 SQL_ATTR_MAX_LENGTH. 232 Zeichenfolgen. 223. 290 SQLCOUNT sqlerror SQLCA-Feldelement. SQLDA-Feld Info. 270 SQL_NO_DATA_FOUND ODBC-Rückgabewert. 394 SQLBindCol. Typendeklaration.S–S SQL.

ODBC-Funktion gespeicherte Prozeduren. 249 SQLPrepare. 306 sqlerror_message. 289 sqltype. Feld Info. 300 sqlind. ODBC-Funktion Info. Feld Info. 184 Befehlszeile. 230 sqlwarn SQLCA. ODBC-Funktion gespeicherte Prozeduren. ODBC-Funktion Info. ODBC-Funktion gebundene Parameter. 304 Info. 209 sqlerrmc SQLCA. ODBC-Funktion Info. 209 SQLCOUNT. 294 SQLExecute. 14 Info. Feld Info. 299 sqlstate SQLCA. Feld Info. 300 SQLFreeHandle. 232 Werte senden. SQLDA-Feld DESCRIBE-Anweisung. 209 SQLIOESTIMATE sqlerror SQLCA-Feldelement. 234 sqlname. ODBC-Funktion Cursor-Merkmale. 14 SQLExtendedFetch. 209 sqlerrml SQLCA. SQLDA-Feld Info. 211 SQLJ. 230 SQLNumResultCols. 209 SQLtransact. SQLDA-Feld Info. 232 Info. Standards Info. 304 Info. SQLDA-Feld DESCRIBE-Anweisung. 271 sqlerrp SQLCA. SQLDA-Feld Info. 249 Info. Funktion Info. 209 SQLIOESTIMATE. 211 SQLError. ODBC-Funktion. 230 SQLIOCOUNT sqlerror SQLCA-Feldelement. Feld Info. 232 Werte abrufen. ODBC-Funktion Info. ODBC-Funktion. Feld Info. ODBC-Funktion Info. 292 SQLSetPos. 297 SQLRETURN Typ des ODBC-Rückgabewertes. 299. ODBC-Funktion. 232 Info. 209 sqlerror SQLCA. 14 SQLGetData. 288 SQLFreeStmt. ODBC-Funktion gespeicherte Prozeduren. 249 Info. 209 SQLExecDirect. 209 SQLIOCOUNT. 230 sqlvar.S–S sqlerrd SQLCA. 182 SQL-Präprozessor ausführen. ODBC-Funktion verwenden. 306 SQLSetConnectAttr. 54 sqllen. Feld Elemente. 230. 302 SQLSetStmtAttr. 235 Werte beschreiben. 230 Inhalt. 229. 209 Standardausgabe Java in der Datenbank. 295 Info. 79 487 . 300 SQLFetch. 304 SQLPP Befehlszeile.

Block Java. 407 Transaktionen Anwendungsentwicklung. 153 Statische Methoden Info. 141 Starten Datenbanken unter Verwendung von jConnect. 105 sybase. 400.sql. 49. 282 TIMESTAMP. 211 Java in der Datenbank. 408 Try. 147 Sybase-Laufzeitklassen für Java Info. 97 Symbole in Handbüchern. Option. 287 Unchained. 52 Isolationsstufe. Paket Laufzeitklassen. 28 STOP JAVA. 51 ODBC. 66 U Umgebungs-Handle ODBC. 124 Threads Embedded SQL. 54 Standardwerte Java in der Datenbank. 430 Registrierungseinstellungen. 109 START JAVA. 223 Statischer Cursor Info. Modus Implementierung. 31 488 . Anweisung verwenden. 405 Transaktionsattribut Komponente. 278 ODBC-Anwendungen. Methoden.0-Funktionen. Datentyp Konvertierung. 97 Sybase Central bereitstellen. 32 Einführung. 50 Transaktionen. 50 Cursor. 49 Autocommit-Modus. Anweisung verwenden. 34 Beispiele für Löschen. xii System Management Server Systemeinführung. 424 T Technische Unterstützung Newsgroups.T–U Standards SQLJ. 424 Systemeinführung ODBC-Einstellungen. 125 -gn. 105 Java-Klassen hinzufügen. 124 ODBC. 392 Transaction coordinator EAServer. 51 steuern.ASA. 428. 101 JAR-Dateien hinzufügen. 293 UNIX-Entwicklung. Paket Laufzeitklassen.. 184 sun. 104 ZIP-Dateien hinzufügen. 73 Typen Objekte. Paket JDBC 2. 68 Statische SQL Info. 36 ODBC. 437 Datenbnak für Java aktivieren. 430 System Management Server.. xv this Java in der Datenbank. 289 verteilt. 97 sybase.sql. 49 Unempfindliche Cursor Beispiele für Aktualisieren. 141 Strukturverdichten Header-Dateien. 428.

152 JDBC. 291 ODBC-Attribute. 326 Version Java in der Datenbank.h Info. 267 jConnect. 399. 75 JDK. 157 JDBC-Standardwerte. 28 Info. 101 URL Datenbank. 115 Upgrade einer Datenbank. 114 positionsbasiert. 402 EAServer. Datentyp Embedded SQL. 36 Unempfindlicher Cursor Info. 281 UNIX Anwendungen mit mehreren Threads. 283 ODBC-Anwendung.Ü–V Embedded SQL. 176 Info. 174 Voraussetzungen. 281 Windows CE. 152 Verbindungen ADO-Verbindungsobjekt. 153 jConnect. Assistant Datenbank für Java aktivieren. 184 Ü Überlauffehler Datentyp-Konvertierung. 372 Unterstützung Newsgroups. 153 jConnect-URL. 400. 164 ODBC. 416 Verteilte Anwendungen Beispiele. 201 Veraltete Java-Klassen Info. 26 Unicode ODBC. 282. 402. 374 Funktionen. 75 Versionen Klassen. 416 Hinweise zu Bereitstellungsmethoden. 161 JDBC-Beispiel. 290 Verbindungs-Handle ODBC. 404 dreischichtige Datenverarbeitung. 24 set-Methoden. 374 Verfügbarkeit Verbindungen. 75 JDBC. 149 JDBC im Server. 174 Verteilte Transaktionen Architektur. 157. 392 V VARCHAR. 405 Wiederherstellung. 415 ODBC. 407 Einbeziehung. 75 489 . 131 Versionsnummer Dateinamen. Anweisung Java in der Datenbank. 406 Verzeichnisstruktur UNIX. 287 Verbindungsobjekt ADO. 415 Visual C++ Unterstützung. 402 Info. 262 Verschlüsselung DBTools-Schnittstelle. xv UPDATE. 280 Unterstützte Plattformen OLE DB. 161 JDBC-Client-Anwendungen. programmieren. 292 ODBC-Funktionen. 415 unixodbc. 284 Verzeichnisstruktur.

156 Zeilenlänge SQL-Präprozessor-Ausgabe. 281. 282 OLE DB. 22 Info. 19 Java in der Datenbank.W– VM Java Virtual Machine. 250 Zeilennummern SQL-Präprozessor.dll. 72 Zwei-Phasen-Commit dreischichtige Datenverarbeitung. 372 Windows-Dienste Beispielcode. 13 ODBC. Methoden. 394 verwenden. 372 unterstützte Versionen. 58 starten. 398 W Watcom C/C++ Unterstützung. 141 stoppen. 32 Einführung. Klausel Cursor. 297 Open Client. 184 Weite Abrufe. 271 DT_STRING wird mit Leerzeichen aufgefüllt. 251 Datentyp. 13 Cursor. 196 Java in der Datenbank. 218 Wert-empfindlicher Cursor Beispiele für Aktualisieren. 402. 78 Zeichensatzkonvertierung JDBC-ODBC-Brücke. 21 Write-Dateien bereitstellen. 406 490 . 40 Wiederherstellung verteilte Transaktionen. 403 und OpenClient. 12 Windows CE dbtool8. 418 Z Zeichenfolgen. 195 WITH HOLD. 218 Weite Einfügungen. 141 void Java in der Datenbank. 34 Beispiele für Löschen. 251 Zip. Objekte. 66. 31 Info. 114 JDBC. 403 Vorbereitete Anweisungen Bindungsparameter. 125 Vorbereiten zum Festschreiben. 312 Java in der Datenbank nicht unterstützt. 171 löschen. 59 ODBC. 71 Zugriffsmodifizierer Java. Dateien Java.