You are on page 1of 506

Adaptive Server Anywhere Handbuch fr Programmierer

Stand: Bestellnummer:

Oktober 2002 03946-01-0802-01

Copyright 19892002 Sybase, Inc. Teil-Copyright 2002 iAnywhere Solutions, Inc. Alle Rechte vorbehalten. Diese Publikation darf ohne vorheriges schriftliches Einverstndnis 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 Eigentmer. 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 mchten .................................................................... xv

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

SQL in Anwendungen verwenden .................................... 9


SQL-Anweisungen in Anwendungen ausfhren ..................... 10 Anweisungen vorbereiten ....................................................... 12 Der Cursor............................................................................... 15 Mit Cursorn arbeiten................................................................ 20 Cursortypen auswhlen .......................................................... 26 Adaptive Server Anywhere-Cursor ......................................... 30 Ergebnismengen beschreiben ................................................ 47 Transaktionen in Anwendungen steuern ................................ 49

Einfhrung in Java fr Datenbanken.............................. 53


Einleitung ................................................................................ 54 Fragen und Antworten zu Java in der Datenbank .................. 57 Ein Java-Seminar.................................................................... 64 Die Laufzeitumgebung fr Java in der Datenbank.................. 75 Praktische Einfhrung: Eine bung mit Java in der Datenbank......................................................................... 84

iii

Java in der Datenbank benutzen .................................... 93


Einleitung ................................................................................ 94 Datenbank fr Java aktivieren ................................................ 97 Java-Klassen in einer Datenbank installieren....................... 103 Spalten fr die Aufnahme von Java-Objekten erstellen................................................................................. 109 Java-Objekte einfgen, aktualisieren und lschen ............... 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 fr Java konfigurieren ............................................ 140

Datenzugriff ber JDBC ................................................ 143


berblick ber JDBC ............................................................ 144 jConnect-JDBC-Treiber verwenden...................................... 150 JDBC-ODBC-Brcke verwenden .......................................... 155 JDBC-Verbindungen herstellen ............................................ 157 JDBC fr den Zugriff auf Daten verwenden.......................... 165 Verteilte Anwendungen erstellen .......................................... 174

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 fr Embedded SQL.......................... 247 SQL-Prprozessor ................................................................ 249 Referenz der Bibliotheksfunktion .......................................... 253 Befehlszusammenfassung fr Embedded SQL.................... 272

ODBC-Programmierung ................................................ 277


Einfhrung in ODBC ............................................................. 278 ODBC-Anwendungen erstellen............................................. 280 ODBC-Beispiele.................................................................... 285

iv

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

Die DBTools-Schnittstelle ............................................. 311


Einfhrung in die DBTools-Schnittstelle................................ 312 DBTools-Schnittstelle verwenden ......................................... 314 DBTools-Funktionen ............................................................. 323 DBTools-Strukturen............................................................... 335 DBTools-Aufzhlungstypen .................................................. 367

Die OLE DB- und ADO-Programmierschnittstellen ..... 371


Einfhrung zu OLE DB.......................................................... 372 ADO-Programmierung mit Adaptive Server Anywhere .............................................................................. 374 Untersttzte OLE DB-Schnittstellen...................................... 382

10

Die Open Client-Schnittstelle........................................ 389


Was Sie fr die Entwicklung von Open ClientAnwendungen brauchen ....................................................... 390 Datentyp-Zuordnungen ......................................................... 391 SQL in Open Client-Anwendungen verwenden .................... 394 Bekannte Open Client-Einschrnkungen 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


Systemeinfhrung - berblick............................................... 412 Installationsverzeichnisse und Dateinamen.......................... 415 InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden........................................................ 420 v

Dialogfreie Installation fr die Systemeinfhrung ................. 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-Prprozessors.................. 445


Fehlermeldungen des SQL-Prprozessors, 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 knnen deren Programmierschnittstellen einsetzen. Das Handbuch ist fr 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 enthlt eine Liste der Handbcher und Hinweise zu ihrer Verwendung.

Dokumentation zu SQL Anywhere Studio


Die Dokumentation zu SQL Anywhere Studio besteht aus folgenden Handbchern:
SQL Anywhere Studio Erste Orientierung Dieses Handbuch enthlt

einen berblick ber die Datenbankverwaltungs- und Synchronisationstechnologien von SQL Anywhere Studio. Es enthlt praktische Einfhrungen zu einzelnen Bestandteilen von SQL Anywhere Studio.
Neues in SQL Anywhere Studio Dieses Handbuch richtet sich an Benutzer frherer Versionen dieser Software. Es enthlt eine Liste neuer Funktionen in dieser und in frheren 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 enthlt eine Kurzeinfhrung in das Datenbankverwaltungssystem Adaptive Server Anywhere und einfhrende Hinweise zum Entwerfen und Aufbauen von Datenbanken sowie zur Arbeit mit Datenbanken.
Adaptive Server Anywhere Datenbankadministration Dieses Handbuch befasst sich mit der Ausfhrung, Verwaltung und Konfiguration von Datenbanken. Adaptive Server Anywhere SQL-Benutzerhandbuch In diesem

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

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

viii

Adaptive Server Anywhere Handbuch fr 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 knnen deren Programmierschnittstellen einsetzen. Adaptive Server Anywhere Fehlermeldungen Dieses Handbuch enthlt eine vollstndige Liste der Fehlermeldungen in Adaptive Server Anywhere sowie Diagnosehinweise. Adaptive Server Anywhere Ergnzung 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 fr den Personenkreis von Interesse sein, der die aktuelle Version von Adaptive Server Anywhere in einer Umgebung ausfhren mchte, die dem C2-Zertifikat entspricht. Nach der Zertifizierung hinzugefgte Sicherheitsfunktionen werden im Handbuch nicht erwhnt.
MobiLink Benutzerhandbuch In diesem Handbuch werden alle

Aspekte des MobiLink-Datensynchronisationssystems fr die mobile Datenverarbeitung erlutert. Mit diesem System knnen 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 fr 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 Datenbertragung ermglicht. UltraLite Benutzerhandbuch In diesem Handbuch wird beschrieben,

wie Datenbankanwendungen fr kleine Gerte wie Organizer mit der UltraLite-Bereitstellungstechnologie fr Adaptive Server AnywhereDatenbanken aufgebaut werden.
UltraLite Users Guide for PenRight! MobileBuilder (nur in englischer Sprache verfgbar) 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 verfgbar.

Es enthlt die kontextsensitive Hilfe fr Sybase Central, Interactive SQL und andere grafische Programme.

ix

Zustzlich 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 enthlt die

vollstndige SQL Anywhere Studio-Dokumentation, einschlielich der gedruckten Handbcher und der kontextsensitiven Hilfe fr die SQL Anywhere-Dienstprogramme. Die Online-Dokumentation wird mit jeder Wartungsversion des Produkts aktualisiert. Dies ist die vollstndigste und aktuellste Informationsquelle. Wenn Sie unter Windows-Betriebssystemen auf die OnlineDokumentation zugreifen wollen, klicken Sie auf StartProgrammeSybase SQL Anywhere 8Online-Dokumentation. Der Zugriff auf den Inhalt erfolgt ber die HTML-Inhaltsangabe, den Index und die Suchfunktion im linken Fensterausschnitt sowie ber Links und Mens im rechten Fensterausschnitt. Unter UNIX-Betriebssystemen geben Sie den folgenden Befehl in einer Befehlszeile ein, damit die Dokumentation aufgerufen wird:
dbbooks

Ausdruckbare Handbcher Die SQL Anywhere-Handbcher werden in Form von PDF-Dateien geliefert, die mit dem Adobe Acrobat Reader eingesehen werden knnen.

Die PDF-Dateien finden sich auf der CD-ROM im Verzeichnis pdf_docs. Whrend der Installation knnen Sie entscheiden, ob sie installiert werden sollen.
Gedruckte Handbcher Die folgenden Handbcher 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 verfgbar.

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/.

Konventionen in dieser Dokumentation


In diesem Abschnitt werden die Konventionen fr die Schreibweise und der grafische Aufbau beschrieben, der in dieser Dokumentation verwendet wird.

Syntaxkonventionen
Folgende Konventionen werden bei SQL-Syntaxbeispielen verwendet:
Schlsselwrter Alle SQL-Schlsselwrter werden wie die Wrter

ALTER TABLE im folgenden Beispiel angezeigt:


ALTER TABLE [ Eigentmer.]Tabellenname

Platzhalter Elemente, die durch entsprechende Identifizierer oder

Ausdrcke ersetzt werden mssen, werden wie die Wrter Eigentmer und Tabellenname im folgenden Beispiel angezeigt:
ALTER TABLE [ Eigentmer.]Tabellenname

Wiederholungen Listen mit sich wiederholenden Elementen werden mit

einem Element der Liste, gefolgt von drei Punkten gezeigt, wie SpaltenIntegrittsregel im folgenden Beispiel:
ADD Spaltendefinition [ Spalten-Integrittsregel, ]

Ein oder mehrere Listenelemente sind zulssig. Wenn mehr als ein Element angegeben wird, muss eine Trennung der Elemente durch Kommas erfolgen.
Fakultative Bestandteile Fakultative Bestandteile einer Anweisung

werden in eckige Klammern gesetzt.


RELEASE SAVEPOINT [ Savepoint-Name ]

Diese eckigen Klammern zeigen an, dass der Savepoint-Name fakultativ ist. Die eckigen Klammern werden nicht eingegeben.
Optionen Wenn aus einer Liste kein oder nur ein Element ausgewhlt

werden darf, werden die Elemente durch Senkrechtstriche voneinander getrennt, und die komplette Liste wird in eckige Klammern gesetzt.
[ ASC | DESC ]

Sie knnen z.B. entweder ASC, DESC oder keines whlen. Die eckigen Klammern werden nicht eingegeben.
Alternativen Wenn nur eine der vorhandenen Optionen gewhlt werden darf, werden die Alternativen in geschweifte Klammern gesetzt. [ QUOTES { ON | OFF } ]

xi

Wenn die Option QUOTES ausgewhlt wird, muss entweder ON oder OFF angegeben werden. Eckige und geschweifte Klammern sind nicht einzugeben.
Eine oder mehrere Optionen Wenn Sie mehr als eine whlen, trennen Sie die Eingaben durch Kommas. { CONNECT, DBA, RESOURCE }

Grafische Symbole
Folgende Symbole werden in dieser Dokumentation verwendet:

xii

Symbol

Bedeutung

Eine Clientanwendung

Ein Datenbankserver, wie etwa Sybase Adaptive Server Anywhere oder Adaptive Server Enterprise

Eine UltraLite-Anwendung und der Datenbankserver. Bei UltraLite sind der Datenbankserver und die Anwendung Teil des gleichen Prozesses.

Eine Datenbank. In einigen abstrakten Diagrammen kann dieses Symbol die Datenbank und gleichzeitig auch den Datenbankserver, der sie steuert, reprsentieren. Replikations- oder Synchronisations-Middleware. Mit Hilfe derartiger Software knnen Daten in mehreren Datenbanken gleichzeitig verwendet werden. Beispiele sind der MobiLink Synchronisationsserver, der SQL Remote-Nachrichtenagent und der Replication Agent (Log Transfer Manager), der in Replication Server eingesetzt wird. Ein Sybase Replication Server

API

Eine Programmierschnittstelle

xiii

Adaptive Server Anywhere-Beispieldatenbank


Viele der in der Dokumentation beschriebenen Beispiele verwenden die Adaptive Server Anywhere-Beispieldatenbank. Die Beispieldatenbank befindet sich in einer Datei mit dem Namen asademo.db im Installationsverzeichnis von SQL Anywhere. Die Beispieldatenbank stellt ein kleines Unternehmen dar. Sie enthlt interne Informationen ber das Unternehmen wie Mitarbeiter (employees), Abteilungen (departments) und Finanzdaten (finances) sowie Produktinformationen (products) und Verkaufsinformationen (sales orders, customers, contacts). Alle Daten in der Datenbank sind frei erfunden. In der nachstehend abgebildeten Strukturdarstellung werden die Tabellen der Beispieldatenbank und ihre Beziehungen zueinander erlutert.
asademo.db
product
id name description size color quantity unit_price <pk> integer char(15) char(30) char(18) char(6) integer numeric(15,2)

sales_order_items
id line_id id = prod_id prod_id quantity ship_date <pk,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,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,fk> char(4) char(2) char(2) numeric(9)

department
dept_id dept_name dept_head_id <pk> integer char(40) <fk> integer

xiv

Wenn Sie mehr wissen und uns Ihre Anregungen mitteilen mchten
Wir wrden gerne Ihre Meinung kennen und sind an Ihren Vorschlgen und Anregungen zu dieser Dokumentation interessiert. Sie knnen uns Ihre Anregungen zu dieser Dokumentation und der Software bermitteln, indem Sie Newsgroups nutzen, die zur Diskussion ber SQL Anywhere-Technologien eingerichtet wurden. Sie finden diese Newsgroups auf dem Newsserver forums.sybase.com. Dazu gehren: sybase.public.sqlanywhere.general. sybase.public.sqlanywhere.linux. sybase.public.sqlanywhere.mobilink. sybase.public.sqlanywhere.product_futures_discussion. sybase.public.sqlanywhere.replication. sybase.public.sqlanywhere.ultralite.

Newsgroup-Verpflichtungsausschluss

Sybase ist weder verpflichtet, Lsungen, Informationen oder Ideen in seinen Newsgroups bereitzustellen, noch ist Sybase verpflichtet, mehr bereitzustellen als einen Systemadministrator, der den Service berwacht und seine Abwicklung sowie die Verfgbarkeit gewhrleistet. Die technischen Mitarbeiter von iAnywhere Solutions stehen, ebenso wie andere Mitarbeiter, fr den Newsgroup-Service bereit, sofern sie Zeit dazu haben. Sie stellen ihre Hilfe freiwillig zur Verfgung und sind mglicherweise nicht regelmig verfgbar, um Lsungen und Informationen bereitzustellen. Ihre Einsatzfhigkeit ist abhngig von ihrer aktuellen Arbeitsauslastung.

xv

xvi

K A P I T E L

berblick ber die Programmierschnittstelle

ber dieses Kapitel

Dieses Kapitel ist eine Einfhrung in die einzelnen Programmierschnittstellen fr Adaptive Server Anywhere. Alle ClientAnwendungen verwenden eine dieser Schnittstellen fr 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

Die ODBC-Programmierschnittstelle

Die ODBC-Programmierschnittstelle
ODBC (Open Database Connectivity) ist eine Standardschnittstelle auf Aufrufebene (Call Level Interface, CLI), die von Microsoft entwickelt wurde. Sie basiert auf der SQL Access Group CLI Spezifikation. ODBCAnwendungen knnen mit jeder Datenquelle ausgefhrt werden, die einen ODBC-Treiber bereitstellt. Sie mssen ODBC verwenden, wenn Ihre Anwendung auf andere Datenquellen portierbar sein soll, die mit ODBCTreibern arbeiten. Auch wenn Sie die Arbeit mit einer API bevorzugen, sollten Sie ODBC verwenden. ODBC ist eine Schnittstelle auf niedriger Ebene - etwa auf demselben Niveau wie Embedded SQL. Fast alle Funktionen von Adaptive Server Anywhere sind mit dieser Schnittstelle verfgbar. ODBC ist unter Windows Betriebssystemen auer Windows CE als DLL verfgbar. Unter UNIX steht der Treiber als Bibliothek zur Verfgung. Die wichtigste Dokumentation fr ODBC ist der Microsoft ODBC Software Development Kit. Das vorliegende Handbuch enthlt einige zustzliche Hinweise, die sich an Entwickler richten, die ODBC-Anwendungen fr Adaptive Server Anywhere bereitstellen.

$ ODBC wird im Abschnitt "ODBC-Programmierung" auf Seite 277


beschrieben.

Kapitel 1 berblick ber die Programmierschnittstelle

Die Programmierschnittstelle OLE DB


OLE DB ist eine Gruppe von Component Object Model-Schnittstellen (COM), die von Microsoft entwickelt wurden und Anwendungen einen gleichfrmigen Zugriff auf Daten bieten, die in unterschiedlichen Informationsquellen gespeichert sind, und darber hinaus die Mglichkeit bieten, zustzliche Datenbankdienste zu implementieren. Diese Schnittstellen untersttzen so viele DBMS-Funktionen, wie sie fr die gemeinsame Nutzung des Datenspeichers erforderlich sind. ADO ist ein Objektmodell, das ermglicht, ber Programme und OLE DBSystemschnittstellen auf eine groe Anzahl von Datenquellen zuzugreifen, diese zu ndern und zu aktualisieren. ADO wurde ebenfalls von Microsoft entwickelt. Die meisten Entwickler, die die OLE DBProgrammierschnittstelle verwenden, tun dies in dem sie die ADO API einsetzen und nicht direkt die OLE DB API. Adaptive Server Anywhere umfasst einen OLE DB-Provider fr OLE DBund ADO-Programmierer. Die primre Dokumentation fr das Programmieren mit OLE DB und ADO ist das Microsoft Developer Network. Das vorliegende Handbuch enthlt einige zustzliche Hinweise, die sich an Entwickler richten, die OLE DBund ADO-Anwendungen fr Adaptive Server Anywhere bereitstellen.

$ Weitere Hinweise finden Sie unter "Die OLE DB- und ADOProgrammierschnittstellen" auf Seite 371

Die Embedded SQL-Programmierschnittstelle

Die Embedded SQL-Programmierschnittstelle


Embedded SQL ist ein System, in dem SQL-Befehle direkt in eine C- oder C++-Quelldatei eingebettet sind. Ein Prprozessor bersetzt diese Anweisungen in Aufrufe einer Laufzeitbibliothek. Embedded SQL ist ein ISO/ANSI- und IBM-Standard. Embedded SQL kann auf andere Datenbanken und andere Umgebungen portiert werden und ist in allen Betriebsumgebungen funktional quivalent. Sie stellt alle im Produkt verfgbaren Funktionen bereit. Die Arbeit mit Embedded SQL ist einfach und geradlinig, wenn auch eine gewisse Eingewhnung erforderlich ist, Embedded SQL Anweisungen (und nicht Funktionsaufrufe) in einem C-Programmcode zu verwenden.

$ Embedded SQL wird unter "Programmieren mit Embedded SQL" auf


Seite 181 beschrieben.

Kapitel 1 berblick ber die Programmierschnittstelle

Die JDBC-Programmierschnittstelle
JDBC ist eine Schnittstelle auf Aufrufebene fr Java-Anwendungen. Der Treiber wurde von Sun Microsystems entwickelt und bietet JavaProgrammierern eine einheitliche Schnittstelle zu einer Vielzahl von relationalen Datenbanken, sowie eine gemeinsame Basis, auf der Tools und Schnittstellen auf hherer Ebene aufgebaut werden knnen. JDBC ist jetzt ein Standardbestandteil von Java und wurde in den JDK aufgenommen. SQL Anywhere enthlt einen einen reinen Java-JDBC-Treiber namens Sybase jConnect an. Dieser enthlt auerdem einen JDBC-ODBC-Brcke. Beide werden im Abschnitt "Datenzugriff ber JDBC" auf Seite 143 beschrieben. Hinweise zur Auswahl eines Treibers finden Sie unter "JDBCTreiber whlen" auf Seite 145. Zustzlich zum Einsatz von JDBC als clientseitige Anwendungsprogrammierschnittstelle knnen Sie JDBC innerhalb des Datenbankservers verwenden, um Java-Daten in der Datenbank abzurufen. Aus diesem Grund wird JDBC als Teil von Java in der Datenbankdokumentation dokumentiert.

$ JDBC wird in diesem Handbuch nicht beschrieben. Eine Beschreibung


des JDBC-Treibers entnehmen Sie dem Kapitel "Datenzugriff ber JDBC" auf Seite 143.

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. Einsatzbereich des Open Clients Der Einsatz der Open Client-Schnittstelle ist zu berlegen, wenn Ihnen die Kompatibilitt von Adaptive Server Enterprise wichtig ist oder wenn Sie andere Sybase-Produkte verwenden, die die Open Client-Schnittstelle bentigen, zum Beispiel Replication Server.

$ Eine Beschreibung der Open Client-Schnittstelle entnehmen Sie dem


Abschnitt "Die Open Client-Schnittstelle" auf Seite 389.

$ Weitere Hinweise ber die Open Client-Schnittstelle finden Sie unter


"Adaptive Server Anywhere als Open Server" auf Seite 117 der Dokumentation ASA Datenbankadministration.

Die Open Client-Architektur


Das Konzept "Open Client" kann man sich als System mit zwei Komponenten vorstellen: Programmierschnittstellen und Netzwerkdiensten. Client-Library und DB-Library Open Client bietet zwei Kern-Programmierschnittstellen fr das Schreiben von Clientanwendungen: DB-Library und Client-Library. Die Open Client DB-Library bietet Untersttzung fr ltere Open Client Anwendungen und ist eine von der Client-Library vollstndig getrennte Programmierschnittstelle. DB-Bibliothek ist dokumentiert im Open Client DB-Library/C Reference Manual, das zum Lieferumfang des Produkts Sybase Open Client gehrt. Client-Library-Programme sind auch von der CS-Library abhngig, die Routinen sowohl fr den Einsatz in Client-Library- als auch Server-LibraryAnwendungen bereitstellt. Client-Library-Anwendungen knnen auch Routinen der Bulk-Library benutzen, um die HochgeschwindigkeitsDatenbertragung zu erleichtern. Die CS-Library und die Bulk-Library sind in Sybase Open Client enthalten. Dieses Produkt kann separat erworben werden.

Kapitel 1 berblick ber die Programmierschnittstelle

Netzwerkdienste

Open Client-Netzwerkdienste enthalten die Sybase Net-Library, die die Untersttzung fr bestimmte Netzwerkprotokolle wie TCP/IP und DECnet bereithlt. Die Net-Library-Schnittstelle ist fr Anwendungsprogrammierer unsichtbar. Auf manchen Plattformen bentigt eine Anwendung unter Umstnden einen anderen Net-Library-Treiber fr unterschiedliche SystemNetzwerkkonfigurationen. Je nach Ihrer Hostplattform wird der Net-LibraryTreiber entweder durch die Konfiguration der Sybase-Produkte des Systems bestimmt, oder durch die Kompilierung und Verknpfung Ihrer Programme.

$ Hinweise zur Treiberkonfiguration finden Sie in der Dokumentation


Open Client/Server Configuration Guide.

$ Hinweise zum Aufbau von Client-Library-Programmen finden Sie in


der Dokumentation Open Client/Server Programmers Supplement.

Die Open Client-Programmierschnittstelle

K A P I T E L

SQL in Anwendungen verwenden

ber dieses Kapitel

Viele Aspekte der Entwicklung von Datenbankanwendungen hngen vom Entwicklungstool, von der Datenbank-Schnittstelle und von der Programmiersprache ab. Einige Probleme und Grundstze sind jedoch allgemein gltig und wirken sich auf mehrere Aspekte der Entwicklung von Datenbankanwendungen aus. In diesem Kapitel werden einige Grundstze und Techniken beschrieben, die fr die meisten oder alle Schnittstellen gelten. Auerdem enthlt das Kapitel Verweise auf weiterfhrende Informationen. Das Kapitel ist keine detaillierte Anweisung fr die Programmierung mit einer bestimmten Schnittstelle.

Inhalt

Thema SQL-Anweisungen in Anwendungen ausfhren Anweisungen vorbereiten Der Cursor Mit Cursorn arbeiten Cursortypen auswhlen Adaptive Server Anywhere-Cursor Ergebnismengen beschreiben Transaktionen in Anwendungen steuern

Seite 10 12 15 20 26 30 47 49

SQL-Anweisungen in Anwendungen ausfhren

SQL-Anweisungen in Anwendungen ausfhren


Wie Sie SQL-Anweisungen in Ihre Anwendung einbauen, hngt vom Entwicklungstool und der Programmierschnittstelle ab, die Sie verwenden.
ODBC Wenn Sie direkt in die ODBC-Programmierschnittstelle

schreiben, erscheinen Ihre SQL-Anweisungen in Funktionsaufrufen. Beispiel: Der folgende C-Funktionsaufruf fhrt eine DELETEAnweisung aus:
SQLExecDirect( stmt, "DELETE FROM employee WHERE emp_id = 105", SQL_NTS );

JDBC Wenn Sie die JDBC-Programmierschnittstelle verwenden,

knnen Sie SQL-Anweisungen ausfhren, indem Sie Methoden des Statement-Objekts aufrufen. Zum Beispiel:
stmt.executeUpdate( "DELETE FROM employee WHERE emp_id = 105" );

Embedded SQL Wenn Sie Embedded SQL verwenden, erhalten die

SQL-Anweisungen der C-Sprachen das Schlsselwort EXEC SQL als Prfix. Der Code wird dann im Prprozessor verarbeitet, bevor er kompiliert wird. Zum Beispiel:
EXEC SQL EXECUTE IMMEDIATE DELETE FROM employee WHERE emp_id = 105;

Sybase Open Client Wenn Sie die Sybase Open Client- Schnittstelle verwenden, erscheinen Ihre SQL-Anweisungen in Funktionsaufrufen. Die folgenden beiden Aufrufe fhren zum Beispiel eine DELETEAnweisung aus: ret = ct_command(cmd, CS_LANG_CMD, "DELETE FROM employee WHERE emp_id=105" CS_NULLTERM, CS_UNUSED); ret = ct_send(cmd);

Anwendungs-Entwicklungstools Anwendungs-Entwicklungstools wie die Mitglieder der Sybase Enterprise-Familie bieten ihre eigenen SQLObjekte, die entweder ODBC (PowerBuilder) oder JDBC (Power J) verwenden.

10

Kapitel 2 SQL in Anwendungen verwenden

$ Genauere Hinweise zur Aufnahme von SQL-Anweisungen in Ihre


Anwendungen finden Sie in der Dokumentation Ihres Entwicklungstools. Wenn Sie ODBC oder JDBC verwenden, finden Sie weitere Hinweise im Software Development Kit fr diese Schnittstellen.

$ Eine genaue Beschreibung der Programmierung mit Embedded SQL


finden Sie unter "Programmieren mit Embedded SQL" auf Seite 181. Anwendungen im Server Auf vielerlei Weise funktionieren gespeicherte Prozeduren und Trigger als Anwendungen oder Teile von Anwendungen, die im Server laufen. Sie knnen viele der hier beschriebenen Techniken auch in gespeicherten Prozeduren verwenden. Gespeicherte Prozeduren benutzen Anweisungen, die Embedded SQL sehr hnlich sind.

$ Weitere Hinweise zu gespeicherten Prozeduren und Triggern finden Sie


unter "Prozeduren, Trigger und Anweisungsfolgen verwenden" auf Seite 565 der Dokumentation ASA SQL-Benutzerhandbuch. Java-Klassen in der Datenbank knnen die JDBC-Schnittstelle genauso benutzen wie Java-Anwendungen dies auerhalb des Servers tun. In diesem Kapitel werden einige Aspekte von JDBC beschrieben. Weitere Hinweise zur Arbeit mit JDBC finden Sie unter "Datenzugriff ber JDBC" auf Seite 143.

11

Anweisungen vorbereiten

Anweisungen vorbereiten
Jedes Mal, wenn eine Anweisung an eine Datenbank geschickt wird, muss der Server die Anweisung zunchst vorbereiten. Zur Vorbereitung knnen folgende Schritte gehren: Die Wiederverwendung von vorbereiteten Anweisungen kann die Performance verbessern Syntaktische Analyse der Anweisung und Umwandlung in eine interne Form. Prfung der Richtigkeit aller Referenzen auf Datenbankobjekte, z.B. Prfung, ob in der Abfrage genannte Spalten existieren. Optimierer fr Abfragen veranlassen, einen Zugriffsplan zu erstellen, falls die Anweisung Joins oder Unterabfragen umfasst. Ausfhrung der Anweisung, nachdem alle diese Schritte durchgefhrt wurden.

Wenn Sie dieselbe Anweisung immer wieder verwenden, etwa das Einfgen von mehreren Zeilen in eine Tabelle, kommt es zu bedeutenden und unntigen Overheads durch die wiederholte Vorbereitung der Anweisung. Um dies zu vermeiden, bieten einige Datenbank-Programmierschnittstellen eine Mglichkeit zur Verwendung von vorbereiteten Anweisungen. Eine vorbereitete Anweisung ist eine Anweisung, die eine Reihe von Platzhaltern enthlt. Wenn Sie die Anweisung ausfhren wollen, mssen Sie den Platzhaltern nur Werte zuweisen, anstatt die gesamte Anweisung erneut vorzubereiten. Der Einsatz von vorbereiteten Anweisungen ist besonders dann ntzlich, wenn viele hnliche Aktionen ausgefhrt werden, wie etwa das Einfgen von vielen Zeilen. 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.


Wiederholtes Ausfhren der vorbereiteten Anweisung In diesem

Schritt liefern Sie Werte, die jedes Mal benutzt werden sollen, wenn die Anweisung ausgefhrt wird. Die Anweisung braucht nicht jedes Mal vorbereitet zu werden. 3
Anweisung lschen In diesem Schritt geben Sie die Ressourcen frei, die fr die vorbereitete Anweisung in Beschlag genommen wurden. Einige Programmierschnittstellen verarbeiten diesen Schritt automatisch.

12

Kapitel 2 SQL in Anwendungen verwenden

Bereiten Sie keine Anweisungen vor, die nur einmal verwendet werden.

Im Allgemeinen sollten Sie Anweisungen nicht vorbereiten, wenn sie nur einmal ausgefhrt werden sollen. Bei getrennter Vorbereitung und Durchfhrung kommt es zu leichten Einbuen bei der Performance, und auerdem werden dadurch unntig komplizierte Schritte in die Anwendung eingefgt. Bei manchen Schnittstellen mssen Sie allerdings eine Anweisung vorbereiten, um sie mit einem Cursor zu verbinden.

$ Hinweise zu Cursorn finden Sie unter "Der Cursor" auf Seite 15.
Die Aufrufe fr die Vorbereitung und Ausfhrung von Anweisungen sind nicht Teil der SQL und unterscheiden sich daher je nach verwendeter Schnittstelle. Jede Programmierschnittstelle des Adaptive Server Anywhere bietet eine Methode fr die Verwendung von vorbereiteten Anweisungen.

So verwenden Sie vorbereitete Anweisungen


In diesem Abschnitt wird ein kurzer berblick ber die Verwendung von vorbereiteten Anweisungen gegeben. Die allgemeine Vorgehensweise ist identisch, aber die Details unterscheiden sich je nach Schnittstelle. Ein Vergleich der Verwendung von vorbereiteten Anweisungen in den einzelnen Schnittstellen kann diesen Punkt vielleicht klarer darstellen.
v So verwenden Sie eine vorbereitete Anweisung (generisch):

1 2 3 4 5 6

Bereiten Sie die Anweisung vor. Setzen Sie Bindungsparameter, die benutzt werden, um Werte in der Anweisung zu halten. Weisen Sie den Bindungsparametern in der Anweisung Werte zu. Fhren Sie die Anweisung aus. Wiederholen Sie ntigenfalls Schritte 3 und 4. Lschen Sie die Anweisung, wenn Sie fertig sind. Dieser Schritt ist in JDBC nicht erforderlich, da der Abfalldatenmechanismus von JDBC dies erledigt.

v So verwenden Sie eine vorbereitete Anweisung (Embedded SQL):

1 2 3

Bereiten Sie die Anweisung mit dem Befehl EXEC SQL PREPARE vor. Weisen Sie den Parametern in der Anweisung Werte zu. Fhren Sie die Anweisung mit dem Befehl EXE SQL EXECUTE aus.

13

Anweisungen vorbereiten
4 Geben Sie die mit der Anweisung verbundenen Ressourcen frei, indem Sie den Befehl EXEC SQL DROP benutzen.

v So verwenden Sie eine vorbereitete Anweisung (ODBC):

1 2 3 4

Bereiten Sie die Anweisung mit SQLPrepare vor. Binden Sie die Anweisungsparameter mit SQLBindParameter. Fhren Sie die Anweisung mit SQLExecute aus. Lschen Sie die Anweisung mit SQLFreeStmt.

$ Weitere Hinweise finden Sie unter "Vorbereitete Anweisungen


ausfhren" auf Seite 297 und in der Dokumentation zum ODBC SDK.
v So verwenden Sie eine vorbereitete Anweisung (JDBC):

Bereiten Sie die Anweisung mit der Methode prepareStatement des Verbindungsobjekts vor. Daraus wird ein PreparedStatement-Objekt erzeugt. Setzen Sie die Anweisungsparameter mit den entsprechenden setTypeMethoden des PreparedStatement-Objekts. Hier ist Type der Datentyp, der zugewiesen wird. Fhren Sie die Anweisung mit der geeigneten Methode fr das PreparedStatement-Objekt aus. Fr Einfgungen, Aktualisierungen und Lschungen ist dies die Methode executeUpdate.

$ Weitere Hinweise zur Verwendung von vorbereiteten


Anweisungen in JDBC finden Sie unter "Vorbereitete Anweisungen fr effizienteren Zugriff verwenden" auf Seite 171.
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. Setzen Sie die Anweisungsparameter ct_param. Fhren Sie die Anweisung mit ct_dynamic mit CS_EXECUTE als Typparameter aus. Geben Sie die mit der Anweisung verbundenen Ressourcen frei, indem Sie ct_dynamic mit einem CS_DEALLOC-Typparameter verwenden. Weitere Hinweise ber die Verwendung von vorbereiteten Anweisungen in Open Client finden Sie unter "SQL in Open Client-Anwendungen verwenden" auf Seite 394.

14

Kapitel 2 SQL in Anwendungen verwenden

Der Cursor
Wenn Sie eine Abfrage in einer Anwendung ausfhren, besteht die Ergebnismenge aus einer Reihe von Zeilen. Im Allgemeinen wissen Sie nicht, wie viele Zeilen die Anwendung empfangen wird, bevor die Abfrage ausgefhrt worden ist. Mit einem Cursor knnen Sie Ergebnismengen von Abfragen in Anwendungen verarbeiten. Wie Sie Cursor einsetzen, und welche Cursorarten verfgbar sind, hngt von der Programmierschnittstelle ab, die Sie benutzen. JDBC 1.0 bietet nur eine Basisverarbeitung von Ergebnismengen, whrend ODBC und Embedded SQL ber viele unterschiedliche Cursorarten verfgen. Mit einem Cursor in Open Client kann man sich in einer Ergebnismenge nur vorwrts bewegen. Sie knnen mit einem Cursor folgende Aufgaben innerhalb einer Programmierschnittstelle durchfhren: Die Ergebnisse einer Abfrage mittels Schleifen bearbeiten. Einfgungen, Aktualisierungen und Lschungen auf den darunterliegenden Daten an einem beliebigen Punkt in einer Ergebnismenge durchfhren

Zustzlich ermglichen Ihnen einige Programmierschnittstellen die Verwendung von Sonderfunktionen, um die Art zu optimieren, wie Ergebnismengen an Ihre Anwendung zurckgegeben werden, was betrchtliche Performance-Vorteile fr Ihre Anwendung bietet.

$ Weitere Hinweise zur den verfgbaren Cursorarten in den einzelnen


Programmierschnittstellen finden Sie unter "Cursorverfgbarkeit" auf Seite 26.

Was sind Cursor?


Ein Cursor ist ein Name, der einer Ergebnismenge zugeordnet ist. Die Ergebnismenge erhalten Sie durch eine SELECT-Anweisung oder den Aufruf einer gespeicherten Prozedur. Ein Cursor ist ein Handle auf der Ergebnismenge. Zu jedem Zeitpunkt hat der Cursor eine genau definierte Position innerhalb der Ergebnismenge. Mit einem Cursor knnen Sie die Daten zeilenweise untersuchen und gegebenenfalls bearbeiten. In Adaptive Server Anywhere untersttzen Cursor Vorwrts- und Rckwrts-Bewegungen durch die Abfrageergebnisse. Cursorpositionen Cursor knnen an den folgenden Stellen positioniert werden: Vor der ersten Zeile der Ergebnismenge. 15

Der Cursor
Auf einer Zeile in der Ergebnismenge. Nach der letzten Zeile der Ergebnismenge.

Cursorposition und Ergebnismenge werden im Datenbankserver aufrechterhalten. Zeilen werden vom Client zur Anzeige oder Verarbeitung einzeln oder in Gruppen abgerufen. Dem Client muss nicht die gesamte Ergebnismenge bermittelt werden.

Vorteile der Cursorbenutzung


Sie mssen nicht unbedingt Cursor in Datenbankanwendungen verwenden, aber ihr Einsatz bietet eine Reihe von Vorteilen. Diese Vorteile beruhen darauf, dass die gesamte Ergebnismenge an den Client zur Ansicht und Verarbeitung bermittelt werden muss, wenn Sie keine Cursor verwenden:
Clientseitiger Speicher Bei umfangreichen Ergebnismengen kann das

Halten der gesamten Ergebnismenge auf dem Client zu zustzlichem Speicherbedarf fhren.

16

Kapitel 2 SQL in Anwendungen verwenden

Antwortzeit Cursor knnen die ersten Zeilen liefern, bevor die gesamte

Ergebnismenge zusammengestellt wird. Wenn Sie keine Cursor verwenden, muss die gesamte Ergebnismenge bermittelt werden, bevor eine Zeile von Ihrer Anwendung angezeigt werden kann.
Parallelittskontrolle Wenn Sie Ihre Daten aktualisieren und keine

Cursor in Ihrer Anwendung verwenden, mssen Sie separate SQLAnweisungen an den Datenbankserver senden, um die nderungen anzuwenden. Dadurch knnen Probleme mit der Parallelitt entstehen, falls sich die Ergebnismenge seit der Abfrage durch den Client gendert hat. Das wiederum kann mglicherweise zu Aktualisierungsverlusten fhren. Corsor sind wie Zeiger auf die darunter liegenden Daten und geben dadurch entsprechende Parallelittsbeschrnkungen fr die durchgefhrten nderungen vor.

Schritte der Cursorbenutzung


Die Verwendung eines Cursors in Embedded SQL unterscheidet sich von der Verwendung eines Cursors in anderen Schnittstellen.
v So verwenden Sie einen Cursor (Embedded SQL):

Bereiten Sie eine Anweisung vor. Cursor verwenden blicherweise einen Anweisungs-Handle statt einer Zeichenfolge. Sie mssen eine Anweisung vorbereiten, damit ein Handle verfgbar ist.

$ Hinweise ber das Vorbereiten einer Anweisung finden Sie unter


"Anweisungen vorbereiten" auf Seite 12. 2 Deklarieren Sie den Cursor. Jeder Cursor bezieht sich auf eine einzelne SELECT- oder CALLAnweisung. Wenn Sie einen Cursor deklarieren, geben Sie den Namen des Cursors und die Anweisung an, auf die er sich bezieht.

$ Weitere Hinweise finden Sie unter "DECLARE CURSORAnweisung [ESQL] [GP]" auf Seite 412 der Dokumentation ASA SQLReferenzhandbuch. 3 ffnen Sie den Cursor.

$ Weitere Hinweise finden Sie unter "OPEN-Anweisung [ESQL]


[GP]" auf Seite 523 der Dokumentation ASA SQL-Referenzhandbuch.

17

Der Cursor
Bei der CALL-Anweisung wird durch das ffnen des Cursors die Abfrage bis zu dem Punkt ausgefhrt, an dem die erste Zeile bezogen werden kann. 4 Rufen Sie die Ergebnisse ab. Obwohl eine einfache Abruf-Operation den Cursor in die nchste Zeile der Ergebnismenge bewegt, ermglicht Adaptive Server Anywhere auch kompliziertere Bewegungen in der Ergebnismenge. Die verfgbaren Abruf-Operationen hngen davon ab, wie Sie den Cursor deklarieren.

$ Weitere Hinweise finden Sie unter "FETCH-Anweisung [ESQL]


[GP]" auf Seite 458 der Dokumentation ASA SQL-Referenzhandbuch und "Daten abrufen" auf Seite 214. 5 Schlieen Sie den Cursor Wenn Sie die Arbeit mit dem Cursor abgeschlossen haben, schlieen Sie ihn. Das lst etwaige Sperren auf den darunterliegenden Daten.

$ Weitere Hinweise finden Sie unter "CLOSE-Anweisung [ESQL]


[GP]" auf Seite 285 der Dokumentation ASA SQL-Referenzhandbuch. 6 Lschen Sie die Anweisung. Um den Speicher freizugeben, der mit dem Cursor und der ihm zugeordneten Anweisung verbunden war, mssen Sie die Anweisung freigeben.

$ Weitere Informationen finden Sie unter "DROP STATEMENTAnweisung [ESQL]" auf Seite 439 der Dokumentation ASA SQLReferenzhandbuch.
v So verwenden Sie einen Cursor (ODBC, JDBC, Open Client):

Bereiten Sie eine Anweisung vor und fhren Sie sie aus: Fhren Sie eine Anweisung mit der normalen Methode fr die Schnittstelle aus. Sie knnen die Anweisung vorbereiten und dann ausfhren, oder die Anweisung direkt ausfhren.

berprfen Sie, ob die Anweisung eine Ergebnismenge zurckgibt. Ein Cursor wird implizit geffnet, wenn eine Anweisung ausgefhrt wird, die eine Ergebnismenge erstellt. Beim ffnen eines Cursors wird er vor die erste Zeile der Ergebnismenge gesetzt.

Rufen Sie die Ergebnisse ab. Obwohl eine einfache Abruf-Operation den Cursor in die nchste Zeile der Ergebnismenge bewegt, ermglicht Adaptive Server Anywhere auch kompliziertere Bewegungen in der Ergebnismenge.

18

Kapitel 2 SQL in Anwendungen verwenden


4 Schlieen Sie den Cursor Wenn Sie die Arbeit mit dem Cursor abgeschlossen haben, schlieen Sie ihn, damit die ihm zugewiesenen Ressourcen freigegeben werden. 5 Geben Sie die Anweisung frei. Wenn Sie eine vorbereitete Anweisung verwendet haben, geben Sie sie frei, um den benutzten Speicher wieder verfgbar zu machen. Prefetch von Zeilen In manchen Fllen kann die Interface-Bibliothek PerformanceOptimierungen im Hintergrund durchfhren (z.B. Prefetch von Ergebnissen), sodass diese Schritte in der Clientanwendung mglicherweise nicht den Vorgngen in der Software entsprechen.

19

Mit Cursorn arbeiten

Mit Cursorn arbeiten


In diesem Abschnitt wird beschrieben, wie bestimmte Cursorvorgnge ausgefhrt werden.

Cursor positionieren
Wird ein Cursor geffnet, ist er vor der ersten Zeile positioniert. Sie knnen den Cursor an eine absolute Position in Verhltnis zum Anfang oder zum Ende der Abfrageergebnisse positionieren oder ihn relativ zur aktuellen Cursor-Position verschieben. Wie Sie im Einzelnen den Cursor verschieben und welche Operationen mglich sind, hngt von der Programmierschnittstelle ab. Die Anzahl der Zeilenpositionen, die Sie mit einem Fetch-Vorgang abrufen knnen, wird durch die Gre einer Ganzzahl bestimmt. Mit einem FetchVorgang knnen Sie Zeilen bis zu Nummer 2147483646 abrufen, wobei es sich um die grtmgliche Ganzzahl minus 1 handelt. Wenn Sie negative Werte verwenden (Zeilen in Bezug auf das Ende), knnen Sie FetchVorgnge nach unten bis zum kleinsten negativen Wert, der in einer Ganzzahl mglich ist, plus 1 ausfhren. Sie knnen spezielle positionsbasierte Aktualisierungs- oder Lschungsoperationen verwenden, um die Zeile an der aktuellen Cursorposition zu aktualisieren oder zu lschen. Ist der Cursor vor der ersten Zeile oder nach der letzten Zeile positioniert, wird der Fehler No current row of cursor zurckgeben.

20

Kapitel 2 SQL in Anwendungen verwenden

Probleme mit der Cursorpositionierung

Einfgungen und manche Aktualisierungsvorgnge mit nichtempfindlichen Cursorn knnen Probleme mit der Positionierung von Cursorn verursachen. Adaptive Server Anywhere platziert eingefgte Zeilen an unvorhersehbaren Positionen innerhalb eines Cursors, falls die SELECT-Anweisung keine ORDER BY-Klausel hat. In einigen Fllen erscheint die eingefgte Zeile berhaupt nicht, bis der Cursor geschlossen und wieder geffnet wurde. Bei Adaptive Server Anywhere passiert dies, wenn eine Arbeitstabelle erstellt werden musste, um den Cursor zu ffnen (unter "Arbeitstabellen in der Abfrageverarbeitung verwenden" auf Seite 178 der Dokumentation ASA SQL-Benutzerhandbuch finden Sie eine diesbezgliche Beschreibung). Die UPDATE-Anweisung kann bewirken, dass sich eine Zeile im Cursor verschiebt. Das passiert, wenn der Cursor eine ORDER BY-Klausel hat, die einen vorhandenen Index benutzt (es wird keine Arbeitstabelle erstellt). Mit der Verwendung eines statisch abrollenden Cursors werden diese Probleme vermieden, allerdings ist mehr Speicher und Verarbeitungsaufwand erforderlich.

Cursor beim ffnen konfigurieren


Sie knnen die folgenden Aspekte des Cursorverhaltens konfigurieren, wenn Sie einen Cursor ffnen:
Isolationsstufe Sie knnen die Isolationsstufen der Vorgnge fr einen

Cursor explizit so setzen, dass sie von der aktuellen Isolationsstufe der Transaktion verschieden sind. Dazu stellen Sie die ISOLATION_LEVEL-Option ein.

$ Weitere Informationen finden Sie unter "ISOLATION_LEVELOption" auf Seite 637 der Dokumentation ASA Datenbankadministration.
Offen halten Standardmig werden Cursor in Embedded SQL am Ende

einer Transaktion geschlossen. Wenn Sie einen Cursor mit der WITH HOLD-Option ffnen, knnen Sie ihn offen halten, bis die Verbindung beendet wird oder bis Sie ihn explizit schlieen. ODBC, JDBC und Open Client lassen Cursor beim Ende von Transaktionen standardmig geffnet.

21

Mit Cursorn arbeiten

Zeilen durch einen Cursor abrufen


Die einfachste Art, eine Ergebnismenge aus einer Abfrage mit einem Cursor zu verarbeiten, ist eine Schleife zum Absuchen aller Zeilen in der Ergebnismenge, bis keine Zeilen mehr vorhanden sind.
v So fhren Sie einen Schleifendurchlauf auf Zeilen einer Ergebnismenge durch:

Deklarieren und ffnen Sie den Cursor (Embedded SQL), oder fhren Sie eine Anweisung aus, die eine Ergebnismenge zurckgibt (ODBC, JDBC, Open Client). Setzen Sie die Fetch-Vorgnge fr die nchste Zeile fort, bis der Fehler Zeile nicht gefunden (Row Not Found) erscheint. Schlieen Sie den Cursor

2 3

Die Ausfhrung des zweiten Schrittes hngt davon ab, welche Schnittstelle Sie verwenden. Zum Beispiel:
ODBC SQLFetch, SQLExtendedFetch oder SQLFetchScroll verschieben den Cursor in die nchste Zeile und geben die Daten zurck.

$ Weitere Hinweise zur Verwendung eines Cursors in ODBC finden


Sie unter "Mit Ergebnismengen arbeiten" auf Seite 299.
Embedded SQL Die FETCH-Anweisung fhrt dieselbe Operation aus.

$ Weitere Hinweise ber die Verwendung von Cursorn in Embedded


SQL finden Sie unter "Cursor in Embedded SQL verwenden" auf Seite 215.
JDBC Die next-Methode des ResultSet-Objekts bewegt den Cursor

weiter und gibt die Daten zurck.

$ Weitere Hinweise zur Verwendung des ResultSet-Objekts in


JDBC finden Sie unter "Abfragen mit JDBC" auf Seite 169.
Open Client Die ct_fetch-Funktion verschiebt den Cursor in die nchste

Zeile und gibt die Daten zurck.

$ Weitere Hinweise zur Verwendung eines Cursors in Open ClientAnwendungen finden Sie unter "Cursor verwenden" auf Seite 395.

Mehrere Zeilen abrufen


In diesem Abschnitt wird besprochen, wie Sie mehrere Zeilen mit einem Fetch-Vorgang abrufen knnen. 22

Kapitel 2 SQL in Anwendungen verwenden


Der mehrzeilige Abruf darf nicht mit dem Vorab-Abrufen von Zeilen verwechselt werden, was im nchsten Abschnitt beschrieben wird. Mehrzeilen-Abrufe werden von der Anwendung durchgefhrt, whrend ein Vorab-Abrufen fr die Anwendung nicht erkennbar ist und eine hnliche Performance-Steigerung bietet. Mehrzeilen-FetchVorgnge Einige Schnittstellen bieten Methoden zum gleichzeitigen Abrufen mehrerer Zeilen in die nchsten Felder eines Rasters. Im Allgemeinen gilt: Je weniger getrennte Fetch-Vorgnge Sie ausfhren, desto weniger einzelne Anforderungen muss der Server bewltigen, und desto besser wird die Performance. Eine modifizierte FETCH-Anweisung, die mehrere Zeilen abruft, wird auch ein weiter Abruf genannt. Ein Cursor, der MehrzeilenAbrufe ausfhrt, wird manchmal auch als Block-Cursor (Blockcursor) oder fat cursor (Fetter Cursor) bezeichnet. In ODBC knnen Sie die Anzahl der Zeilen einstellen, die bei jedem Aufruf von SQLFetchScroll oder SQLExtendedFetch zurckgegeben werden, indem Sie das Attribut SQL_ROWSET_SIZE setzen. In Embedded SQL verwendet die FETCH-Anweisung eine ARRAYKlausel, um die Anzahl der Zeilen zu steuern, die durch einen FetchVorgang gleichzeitig abgerufen werden. Open Client und JDBC untersttzen mehrzeilige Fetch-Vorgnge nicht. Sie verwenden Prefetch-Vorgnge.

Mehrzeilen-FetchVorgnge verwenden

Fetch mit abrollendem Cursor


ODBC und Embedded SQL bieten Methoden fr den Einsatz abrollender beziehungsweise dynamisch abrollender Cursortypen. Diese Methoden ermglichen das gleichzeitige Vorwrtsbewegen oder Rckwrtsbewegen ber mehrere Zeilen in einer Ergebnismenge. Die JDBC- und Open Client-Schnittstellen untersttzen keine abrollenden Cursor. Prefetch-Vorgnge sind auf Vorgnge mit einem abrollenden Cursor nicht anwendbar. Zum Beispiel werden beim Abrufen einer Zeile in entgegengesetzter Richtung nicht mehrere vorherige Zeilen abgerufen.

23

Mit Cursorn arbeiten

Zeilen mit einen Cursor ndern


Cursor knnen mehr als nur Ergebnisse aus einer Abfrage lesen. Sie knnen auch Daten in der Datenbank verndern, whrend Sie einen Cursor verarbeiten. Diese Vorgnge werden im Allgemeinen als positionsbasierte oder positionierte Aktualisierungs- und Lschvorgnge oder PUT-Vorgnge (wenn es sich um ein INSERT handelt) bezeichnet. Nicht alle Abfrage-Ergebnismengen ermglichen positionsbasiertes Aktualisieren oder Lschen. Wenn Sie eine Abfrage in einer nicht aktualisierbaren Ansicht ausfhren, werden in den Basistabellen keine nderungen durchgefhrt. Auch wenn die Abfrage einen Join enthlt, mssen Sie angeben, aus welcher Tabelle Sie lschen wollen oder welche Spalten Sie aktualisieren wollen, wenn Sie die Vorgnge ausfhren. Einfgungen durch einen Cursor knnen nur durchgefhrt werden, wenn nicht eingefgte Spalten in der Tabelle NULLWERTE zulassen oder Standardwerte haben. ODBC, Embedded SQL und Open Client ermglichen die Datennderung mit einem Cursor, JDBC 1.1 hingegen nicht. Mit dem Open Client knnen Sie Zeilen lschen und aktualisieren, aber Zeilen nur in einer EinTabellenabfrage einfgen. Aus welcher Tabelle werden Zeilen gelscht? Wenn Sie ein positionsbasiertes Lschen durch einen Cursor versuchen, wird die Tabelle, aus der Zeilen gelscht werden, wie folgt festgelegt: 1 2 Wenn keine FROM-Klausel in der DELETE-Anweisung eingeschlossen ist, muss der Cursor nur fr eine Tabelle gesetzt sein. Wenn der Cursor fr eine Join-Abfrage (einschlielich zum Benutzen einer Ansicht mit enthaltenem Join) gesetzt ist, muss die FROM-Klausel verwendet werden. Nur die aktuelle Zeile der angegebenen Tabelle wird gelscht. Die anderen Tabellen des Joins sind nicht betroffen. Wenn eine FROM-Klausel enthalten ist und kein Tabelleneigentmer angegeben wurde, ist der Tabellenangabewert der erste, der zu den Korrelationsnamen passt.

$ Weitere Hinweise finden Sie unter "FROM-Klausel" auf Seite 467


der Dokumentation ASA SQL-Referenzhandbuch. 4 5 Wenn ein Korrelationsname existiert, ist der Tabellenangabename mit dem Korrelationsnamen identifiziert. Wenn ein Korrelationsname nicht vorhanden ist, muss der Tabellenangabewert eindeutig als Tabellenname im Cursor identifizierbar sein.

24

Kapitel 2 SQL in Anwendungen verwenden


6 Wenn eine FROM-Klausel enthalten ist und ein Tabelleneigentmer angegeben wurde, muss der Tabellenangabewert als Tabellenname im Cursor eindeutig identifizierbar sein. Die positionsbasierte DELETE-Anweisung kann fr einen Cursor verwendet werden, der auf eine Ansicht geffnet ist, solange die Ansicht aktualisierbar ist.

Cursorvorgnge abbrechen
Sie knnen eine Anforderung durch eine Schnittstellenfunktion abbrechen. In Interactive SQL knnen Sie eine Anforderung durch Klicken auf die Schaltflche "SQL-Anweisung unterbrechen" in der Symbolleiste abbrechen (oder durch den Befehl "Stop" im SQL-Men). Wenn Sie eine Anforderung abbrechen, die eine Cursoroperation durchfhrt, ist die Position des Cursors unbestimmt. Nach dem Abbrechen der Anforderung mssen Sie die absolute Position des Cursors ermitteln oder ihn schlieen.

25

Cursortypen auswhlen

Cursortypen auswhlen
Dieser Abschnitt beschreibt Zuordnungen zwischen Adaptive Server Anywhere-Cursorn und den Optionen, die Ihnen die Programmierschnittstellen bieten, die von Adaptive Server Anywhere untersttzt werden.

$ Hinweise zu Adaptive Server Anywhere-Cursorn finden Sie unter


"Adaptive Server Anywhere-Cursor" auf Seite 30.

Cursorverfgbarkeit
Nicht alle Schnittstellen bieten Untersttzung fr alle Cursortypen. ODBC und OLE DB (ADO) untersttzen alle Cursortypen.

$ Weitere Hinweise finden Sie unter "Mit Ergebnismengen arbeiten"


auf Seite 299. Embedded SQL untersttzt alle Cursortypen. Fr JDBC: jConnect 4.x stellt nur asensitive (nicht empfindliche) Cursor zur Verfgung. jConnect 5.x untersttzt alle Cursortypen, bei abrollbaren Cursorn kommt es jedoch zu erheblichen Performance-Einbuen. Die JDBC-ODBC-Brcke untersttzt alle Cursortypen.

Sybase Open Client untersttzt lediglich asensitive (nicht empfindliche) Cursor. Auerdem kommt es zu erheblichen Performance-Einbuen, wenn aktualisierbare, nicht eindeutige Cursor benutzt werden.

Cursoreigenschaften
Sie fordern einen Cursortyp entweder explizit oder implizit von der Programmierschnittstelle an. Unterschiedliche Schnittstellenbibliotheken bieten eine unterschiedliche Auswahl von Cursortypen an. JDBC und ODBC schreiben zum Beispiel unterschiedliche Cursortypen vor. Jeder Cursortyp wird duch eine Reihe von Eigenschaften definiert:

26

Kapitel 2 SQL in Anwendungen verwenden

Eindeutigkeit Wenn ein Cursor als eindeutig deklariert wird, zwingt

dies die Abfrage, alle Spalten zurckzugeben, die fr die eindeutige Identifizierung der einzelnen Zeilen erforderlich sind. Oft bedeutet dies, dass alle Spalten im Primrschlssel zurckgegeben werden. Alle erforderlichen, aber nicht angegebenen Spalten werden der Ergebnismenge hinzugefgt. Der Standardcursortyp ist "Nicht eindeutig".
Aktualisierbarkeit Ein als schreibgeschtzt deklarierter Corsor kann nicht fr eine positionierte Aktualisierung oder Lschung verwendet werden. Der Standardcursortyp ist "Aktualisierbar". Abrollfhigkeit Sie knnen Cursor so deklarieren, dass Sie sich

unterschiedlich verhalten, wenn Sie sich durch die Ergebnismenge bewegen. Manche Cursor knnen nur die aktuelle oder die nchste Zeile abrufen. Andere knnen sich vorwrts und rckwrts in der Ergebnismenge bewegen.
Empfindlichkeit nderungen an der Datenbank knnen durch einen

Cursor sichtbar sein, mssen es aber nicht. Diese Eigenschaften haben mglicherweise signifikante Auswirkungen auf Performance und Datenbankserver-Speicherzuordnung. Adaptive Server Anywhere stellt Ihnen Cursor mit unterschiedlichen Zusammensetzungen dieser Eigenschaften zur Verfgung. Wenn Sie einen Corsor eines gegebenen Typs anfordern, versucht Adaptive Server Anywhere, diese Eigenschaften so gut wie mglich zuzuordnen. Wie Adaptive Server Anywhere-Cursor den in den Programmierschnittstellen festgelegten Cursorn im Einzelnen entsprechen, ist das Thema der folgenden Abschnitte. Unter Umstnden ist es nicht mglich, allen Eigenschaften zu entsprechen. Unempfindliche Cursor in Adaptive Server Anywhere zum Beispiel mssen schreibgeschtzt sein, aus den weiter unten angefhrten Grnden. Wenn Ihre Anwendung einen aktualisierbaren unempfindlichen Cursor anfordert, wird statt dessen ein anderer Cursortyp (Wert-empfindlich) geliefert.

Adaptive Server Anywhere-Cursor anfordern


Wenn Sie einen Cursortyp von Ihrer Clientanwendung aus anfordern, liefert Adaptive Server Anywhere einen Cursor. Adaptive Server Anywhere-Cursor werden nicht durch den in der Programmierschnittstelle festgelegten Typ definiert, sondern durch die Empfindlichkeit der Ergebnismenge auf nderungen in den darunter liegenden Daten. Abhngig vom verlangten Cursortyp liefert Adaptive Server Anywhere einen Cursor mit einem Verhalten, das dem Typ entspricht. 27

Cursortypen auswhlen
Die Empfindlichkeit der Adaptive Server Anywhere-Cursorn wird entsprechend der Cursortyp-Anfrage des Clients gesetzt.

ODBC und OLE DB


Die nachstehende Tabelle beschreibt die Cursorempfindlichkeit, die bei verschiedenen abrollbaren ODBC-Cursortypen eingestellt wird.
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. Hinweise ber das Anfordern eines Cursortyps in ODBC finden Sie unter "CursorEigenschaften whlen" auf Seite 299. Ausnahmen Wenn Sie einen STATIC-Cursor als aktualisierbar anfordern, wird statt dessen ein Wert-empfindlicher Cursor geliefert und eine Warnung ausgegeben. Wenn ein DYNAMIC- oder MIXED-Cursor angefordert wird und die Abfrage nicht ohne Arbeitstabellen ausgefhrt werden kann, wird statt dessen ein nicht-empfindlicher Cursor geliefert und eine Warnung ausgegeben.

Embedded SQL
Um einen Cursor von einer Embedded SQL-Anwendung anzufordern, geben Sie den Cursortyp in der DECLARE-Anweisung an. Die nachstehende Tabelle beschreibt die Cursorempfindlichkeit, die als Antwort auf unterschiedliche Anforderungen eingestellt wird.
Cursortyp NO SCROLL DYNAMIC SCROLL SCROLL INSENSITIVE SENSITIVE Adaptive Server Anywhere-Cursor Asensitiv (Nicht empfindlich) Asensitive (Nicht empfindlich) Wertempfindlich Insensitive (Unempfindlich) Sensitive (Empfindlich)

28

Kapitel 2 SQL in Anwendungen verwenden

Ausnahmen

Wenn Sie einen DYNAMIC SCROLL- oder NO SCROLL-Cursor als UPDATABLE anfordern, wird ein empfindlicher oder wertempfindlicher Cursor geliefert. Es ist nicht ausgemacht, welcher der Beiden geliefert wird. Diese Ungewissheit entspricht der Definition von nicht-empfindlichem Verhalten. Wenn Sie einen INSENSITIVE-Cursor als UPDATABLE anfordern, wird ein wertempfindlicher Cursor geliefert. Wenn Sie einen DYNAMIC SCROLL-Cursor anfordern, die PREFETCHDatenbankoption auf OFF eingestellt ist und der Ausfhrungsplan der Abfrage keine Arbeitstabellen verlangt, wird mglicherweise ein empfindlicher Cursor geliefert. Wieder entspricht diese Ungewissheit der Definition von nicht-empfindlichem Verhalten.

JDBC
Es steht nur ein Typ von Cursorn fr JDBC-Anwendungen zur Verfgung. Dies ist ein nicht-empfindlicher Cursor. In JDBC knnen Sie eine ExecuteQuery-Anweisung ausfhren, um einen Cursor zu ffnen.

Open Client
Es steht nur ein Typ von Cursorn fr JDBC-Anwendungen zur Verfgung. Das ist ein nicht-empfindlicher Cursor.

Lesezeichen und Cursor


ODBC bietet Lesezeichen an bzw. Werte zum Identifizieren von Zeilen in einem Cursor. Adaptive Server Anywhere untersttzt Lesezeichen fr alle Arten von Cursorn, mit Ausnahme von dynamischen Cursorn.

Block-Cursor
ODBC stellt einen Cursortyp namens Block-Cursor zur Verfgung. Wenn Sie einen solchen Block-Cursor verwenden, knnen Sie SQLFetchScroll oder SQLExtendedFetch benutzen, um einen Zeilenblock und nicht eine einzelne Zeile abzurufen. Block-Cursor verhalten sich genauso wie Embedded SQL ARRAY-Abrufe.

29

Adaptive Server Anywhere-Cursor

Adaptive Server Anywhere-Cursor


Sobald ein Cursor geffnet ist, hat er eine zugeordnete Ergebnismenge. Der Cursor bleibt eine Zeit lang geffnet. Whrend dieser Zeit kann die dem Cursor zugeordnete Ergebnismenge gendert werden, entweder durch den Cursor selbst oder, abhngig von den Anforderungen der Isolationsstufe, durch andere Transaktionen. Manche Cursor ermglichen es, nderungen an den darunter liegenden Daten sichtbar zu machen, whrend bei Anderen diese nderungen nicht auszumachen sind. Das unterschiedliche Verhalten von Cursorn in Bezug auf nderungen an den darunter liegenden Daten wird die Empfindlichkeit des Cursors genannt. Adaptive Server Anywhere stellt Cursor mit einer Vielzahl von Empfindlichkeitseigenschaften zur Verfgung. Dieser Abschnitt beschreibt, was Empfindlichkeit ist, sowie die Empfindlichkeitseigenschaften von Cursorn. Dabei wird vorausgesetzt, dass Sie mit dem Abschnitt "Was sind Cursor?" auf Seite 15 vertraut sind. nderungen bei Mitgliedschaft, Reihenfolge und Werten nderungen an den darunter liegenden Daten knnen sich folgendermaen auf die Ergebnismenge eines Cursors auswirken:
Mitgliedschaft Die Menge der Zeilen in der Ergebnismenge, die durch

ihre Primrschlsselwerte gekennzeichnet sind.


Reihenfolge Die Reihenfolge der Zeilen in der Ergebnismenge. Wert Die Werte der Zeilen in der Ergebnismenge.

Nehmen Sie zum Beispiel die folgende einfache Tabelle mit Mitarbeiterdaten (emp_id ist die Primrschlsselspalte):
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 Primrschlssels zurck.
SELECT emp_id, emp_lname FROM employee ORDER BY emp_id

30

Kapitel 2 SQL in Anwendungen verwenden


Die Mitgliedschaft der Ergebnismenge knnte durch das Hinzufgen einer neuen Zeile oder das Lschen einer Zeile gendert werden. Die Werte knnten durch eine Namensnderung in der Tabelle gendert werden. Die Reihenfolge knnte gendert werden, indem der Primrschlssel eines Mitarbeiters gendert wird. Sichtbare und unsichtbare nderungen Abhngig von den Anforderungen der Isolationsstufe knnen Mitgliedschaft, Reihenfolge und Werte der Ergebnismenge eines Cursors gendert werden, nachdem der Cursor geffnet wurde. Es hngt vom Typ des verwendeten Cursors ab, ob sich die Ergebnismenge, wie sie von der Anwendung gesehen wird, ndert, um diese nderungen darzustellen. nderungen an den darunter liegenden Daten knnen durch den Cursor sichtbar oder unsichtbar sein. Eine sichtbare nderung ist eine, die sich in der Ergebnismenge des Cursors wiederspiegelt. nderungen an den darunter liegenden Daten, die nicht in der Ergebnismenge, wie sie vom Cursor gesehen wird, wiedergespiegelt werden, sind unsichtbar.

berblick ber die Cursor-Empfindlichkeit


Adaptive Server Anywhere-Cursor werden anhand ihrer Empfindlichkeit gegenber nderungen an den darunter liegenden Daten eingeteilt. Im Besonderen wird die Cursor-Empfindlichkeit anhand der Sichtbarkeit von nderungen definiert.
Unempfindliche Cursor Die Ergebnismenge ist unvernderlich, wenn der Cursor geffnet ist. nderungen an den darunter liegenden Daten sind nicht sichtbar.

$ Weitere Hinweise finden Sie unter "Unempfindliche Cursor" auf


Seite 36.
Empfindliche Cursor Die Ergebnismenge kann sich ndern, nachdem der Cursor geffnet wurde. Alle nderungen an den darunter liegenden Daten sind sichtbar.

$ Weitere Hinweise finden Sie unter "Empfindliche Cursor" auf


Seite 37.
Nicht-empfindliche Cursor nderungen knnen in der Mitgliedschaft,

der Reihenfolge oder den Werten der Ergebnismenge, wie sie durch den Cursor gesehen wird, wiedergespiegelt werden, mssen es aber nicht.

$ Weitere Hinweise finden Sie unter "Nicht-empfindliche Cursor"


auf Seite 39.
Wert-empfindliche Cursor nderungen in der Reihenfolge oder den

Werten der darunter liegenden Daten sind sichtbar. Die Mitgliedschaft der Ergebnismenge ist unvernderlich, wenn der Cursor geffnet ist. 31

Adaptive Server Anywhere-Cursor

$ Weitere Hinweise finden Sie unter "Wert-empfindliche Cursor" auf


Seite 40. Die unterschiedlichen Anforderungen an Cursor bewirken unterschiedliche Beschrnkungen bei der Ausfhrung, was sich wiederum auf die Performance auswirkt. Weitere Hinweise finden Sie unter "CursorEmpfindlichkeit und Performance" auf Seite 43.

Beispiel fr Cursor-Empfindlichkeit: Eine gelschte Zeile


Dieses Beispiel verwendet eine einfache Abfrage, um zu illustrieren, wie verschiedene Cursor auf eine Zeile in der Ergebnismenge reagieren, die gelscht wird. Es gibt die folgende Abfolge von Ereignissen: 1 Eine Anwendung ffnet einen Cursor auf der folgenden Abfrage auf der Beispieldatenbank.
SELECT emp_id, 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). Die Anwendung ruft die nchste Zeile durch den Cursor ab (105). Eine weitere Anwendung lscht Mitarbeiter 102 (Whitney) und schreibt die nderung fest.

In dieser Situation hngen die Ergebnisse der Cursor-Aktionen von der Cursor-Empfindlichkeit ab.
Unempfindliche Cursor Das DELETE wird weder in der Mitgliedschaft

noch in den Werten der Ergebnissen, wie sie durch den Cursor gesehen werden, wiedergespiegelt:

32

Kapitel 2 SQL in Anwendungen verwenden

Manahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf)

Ergebnis Gibt die ursprngliche Kopie der Zeile zurck (102). Gibt die ursprngliche Kopie der Zeile zurck (102). Gibt die ungenderte Zeile zurck (105).

Empfindliche Cursor Die Mitgliedschaft der Ergebnismenge hat sich insofern gendert, dass jetzt Zeile 105 die erste Zeile in der Ergebnismenge ist: Manahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Ergebnis Gibt den Fehler Zeile nicht gefunden zurck. Es gibt keine vorherige Zeile. Gibt Zeile 105 zurck. Gibt Zeile 160 zurck.

Wert-empfindliche Cursor Die Mitgliedschaft der Ergebnismenge ist

unvernderlich, und daher ist Zeile 105 weiterhin die zweite Zeile in der Ergebnismenge. Das DELETE wird in den Werten des Cursors wiedergespiegelt und erzeugt ein tatschliches "Loch" in der Ergebnismenge.
Manahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Ergebnis Gibt Keine aktuelle Cursorzeile zurck. Wo vorher die erste Zeile war, steht jetzt im Cursor eine Lcke. Gibt Keine aktuelle Cursorzeile zurck. Wo vorher die erste Zeile war, steht jetzt im Cursor eine Lcke. Gibt Zeile 105 zurck.

33

Adaptive Server Anywhere-Cursor

Nicht-empfindliche Cursor Die Mitgliedschaft und Werte der

Ergebnismenge sind in Bezug auf die nderungen unbestimmt. Die Antwort auf einen Abruf der vorherigen Zeile, der ersten Zeile oder der zweiten Zeile hngt von der entsprechenden Optimierungsmethode fr die Abfrage ab. Die Antwort hngt davon ab, 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, dass fr viele Anwendungen die Empfindlichkeit unwichtig ist. Besonders wenn Sie einen schreibgeschtzten Vorwrts-Cursor verwenden, sind keine der darunter liegenden nderungen sichtbar. Auch wenn Sie auf einer hohen Isolationsstufe ausfhren, sind darunter liegende nderungen nicht zulssig.

Beispiel fr Cursor-Empfindlichkeit: Eine aktualisierte Zeile


Dieses Beispiel verwendet eine einfache Abfrage, um zu illustrieren wie verschiedene Cursortypen auf eine Zeile in der Ergebnismenge reagieren, die aktualisiert wird und dadurch die Reihenfolge in der Ergebnismenge verndert. Es gibt die folgende Abfolge von Ereignissen: 1 Eine Anwendung ffnet einen Cursor auf der folgenden Abfrage auf der Beispieldatenbank.
SELECT emp_id, 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). Die Anwendung ruft die nchste Zeile durch den Cursor ab (105). Eine weitere Transaktion aktualisiert die Mitarbeiter-ID des Mitarbeiters 102 (Whitney) auf 165 und schreibt die nderung fest.

In dieser Situation hngen die Ergebnisse der Cursor-Aktionen von der Cursor-Empfindlichkeit ab.

34

Kapitel 2 SQL in Anwendungen verwenden

Unempfindliche Cursor Das UPDATE wird weder in der Mitgliedschaft noch in den Werten der Ergebnisse, wie sie durch den Cursor gesehen werden, wiedergespiegelt: Manahme Vorherige Zeile abrufen Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf) Ergebnis Gibt die ursprngliche Kopie der Zeile zurck (102). Gibt die ursprngliche Kopie der Zeile zurck (102). Gibt die ungenderte Zeile zurck (105).

Empfindliche Cursor Die Mitgliedschaft der Ergebnismenge hat sich insofern gendert, dass jetzt Zeile 105 die erste Zeile in der Ergebnismenge ist: Manahme Vorherige Zeile abrufen Ergebnis Gibt den Fehler Zeile nicht gefunden zurck. Die Mitgliedschaft der Ergebnismenge hat sich gendert und 105 ist jetzt die erste Zeile. Der Cursor wird auf die Position vor der ersten Zeile verschoben. Gibt Zeile 105 zurck. Gibt Zeile 160 zurck.

Erste Zeile abrufen (absoluter Abruf) Zweite Zeile abrufen (absoluter Abruf)

Auerdem wird beim Abrufen durch einen empfindlichen Cursor die Warnung SQLE_ROW_UPDATED_WARNING ausgegeben, wenn die Zeile seit dem letzten Lesen gendert wurde. Die Warnung wird nur einmal ausgegeben. Aufeinander folgende FETCH-Vorgnge fr dieselbe Zeile lsen keine Warnung aus. hnlich gibt auch eine positionsbasierte UPDATE- oder DELETEAnweisung durch den Cursor auf einer Zeile, die seit dem letzten Abruf gendert wurde, die Fehlermeldung SQLE_ROW_UPDATED_SINCE_READ aus. Eine Anwendung muss das Abrufen einer Zeile nochmals durchfhren, damit UPDATE oder DELETE bei einem empfindlichen Cursor funktionieren. Eine Aktualisierung einer Spalte bewirkt die Warnung oder den Fehler, auch wenn die Spalte vom Cursor nicht referenziert wird. Beispiel: Ein Cursor auf einer Abfrage, der emp_lname zurckgibt, wrde die Aktualisierung melden, auch wenn nur die Spalte salary gendert worden wre. 35

Adaptive Server Anywhere-Cursor

Wert-empfindliche Cursor Die Mitgliedschaft der Ergebnismenge ist

unvernderlich, und daher ist Zeile 105 weiterhin die zweite Zeile in der Ergebnismenge. Das DELETE wird in den Werten des Cursors wiedergespiegelt und erzeugt ein tatschliches "Loch" in der Ergebnismenge.
Manahme Vorherige Zeile abrufen Ergebnis Gibt den Fehler Zeile nicht gefunden zurck. Die Mitgliedschaft der Ergebnismenge hat sich gendert und 105 ist jetzt die erste Zeile. Der Cursor wird ber dem Loch positioniert: Er befindet sich vor Zeile 105. Gibt den Fehler Zeile nicht gefunden zurck. Die Mitgliedschaft der Ergebnismenge hat sich gendert und 105 ist jetzt die erste Zeile. Der Cursor wird ber dem Loch positioniert: Er befindet sich vor Zeile 105. Gibt Zeile 105 zurck.

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, der ersten Zeile oder der zweiten Zeile hngt von der entsprechenden Optimierungsmethode fr die Abfrage ab, ob die Methode die Erstellung einer Arbeitstabelle erfordert und ob die abgerufene Zeile vom Client vorab abgerufen wurde.
Keine Warnungen oder Fehler in Massenvorgngen

Warnungs- und Fehlerbedingungen fr Aktualisierungen kommen in Massenvorgngen nicht vor (Option -b fr Datenbankserver).

Unempfindliche Cursor
Diese Cursor haben unempfindliche Mitgliedschaft, Reihenfolge und Werte. Keine nderungen, die nach dem ffnen des Cursors durchgefhrt werden, sind sichbar. Unempfindliche Cursor werden nur fr schreibgeschtzte Cursortypen verwendet.
Standards

Unempfindliche Cursor entsprechen der ISO/ANSI-Standarddefinition von unempfindlichen Cursorn beziehungsweise den statischen ODBC-Cursorn.

36

Kapitel 2 SQL in Anwendungen verwenden

Programmierschnittstellen

Schnittstelle ODBC, OLE DB und ADO

Cursortyp Static

Kommentar Wenn ein aktualisierbarer statischer Cursor angefordert wird, wird statt dessen ein Wert-empfindlicher Cursor verwendet.

Embedded SQL

INSENSITIVE oder NO SCROLL Nicht untersttzt Nicht untersttzt

JDBC Open Client Beschreibung

Unempfindliche Cursor geben immer Zeilen zurck, die den Auswahlkriterien der Abfrage entsprechen, und zwar in der durch eine ORDER BY-Klausel festgelegte Reihenfolge. Die Ergebnismenge eines unempfindlichen Cursors wird vollstndig als Arbeitstabelle materialisiert, wenn der Cursor geffnet wird. Das hat folgende Konsequenzen: Wenn die Ergebnismenge sehr umfangreich ist, sind die Festplatten- und Speicheranforderungen zum Verwalten des Ergebnisses mglicherweise von Bedeutung. Keine Zeile wird an die Anwendung zurckgegeben, bevor nicht die gesamte Ergebnismenge als eine Arbeitstabelle zusammengestellt ist. Bei komplexen Abfragen kann das zu einer Verzgerung fhren, bevor die erste Zeile an die Anwendung zurckgegeben wird. Nachfolgende Zeilen knnen direkt von der Arbeitstabelle abgerufen werden, und werden daher rasch ausgegeben. Die Client-Bibliothek kann mehrere Zeilen gleichzeitig vorab abrufen, was die Performance weiter steigert. Unempfindliche Cursor sind von ROLLBACK oder ROLLBACK TO SAVEPOINT nicht betroffen.

Empfindliche Cursor
Diese Cursor haben empfindliche Mitgliedschaft, Reihenfolge und Werte. Empfindliche Cursor knnen fr schreibgeschtzte oder aktualisierbare Cursortypen verwendet werden.
Standards

Empfindliche Cursor entsprechen der ISO/ANSI-Standarddefinition von empfindlichen Cursorn beziehungsweise den dynamischen ODBC-Cursorn. 37

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, wenn keine Arbeitstabelle erforderlich ist und PREFETCH auf OFF eingestellt ist.

Beschreibung

Alle nderungen sind durch den Cursor sichtbar, sowohl die nderungen durch den Cursor als auch die durch andere Transaktionen. Hhere Isolationsstufen knnen auf Grund von Sperren manche nderungen verbergen, die von anderen Transaktionen durchgefhrt werden. Alle nderungen von Mitgliedschaft, Reihenfolge und Spaltenwerten des Cursors sind sichtbar. Beispiel: Wenn ein empfindlicher Cursor einen Join enthlt und einer der Werte von einer der darunter liegenden Tabelle gendert wird, dann zeigen alle Ergebniszeilen, die aus dieser Basiszeile zusammengesetzt sind, den neuen Wert. Die Mitgliedschaft und Reihenfolge der Ergebnismenge knnen sich bei jedem Abruf ndern. Empfindliche Cursor geben immer Zeilen zurck, die den Auswahlkriterien der Abfrage entsprechen, und zwar in der durch eine ORDER BY-Klausel festgelegte Reihenfolge. Aktualisierungen knnen sich auf die Mitgliedschaft, Reihenfolge und Werte der Ergebnismenge auswirken. Die Anforderungen von empfindlichen Cursorn bewirken bei der Implementierung von empfindlichen Cursorn folgende Einschrnkungen: Zeilen knnen nicht vorab abgerufen werden, weil die nderungen an solchen Zeilen durch den Cursor nicht sichtbar wren. Das kann sich auf die Performance auswirken. Empfindliche Cursor mssen so implementiert werden, dass keine Arbeitstabellen zusammengestellt werden, weil nderungen an den in der Arbeitstabelle gespeicherten Zeilen durch den Cursor nicht sichtbar wren. Die Bedingung, keine Arbeitstabelle zu verwenden, schrnkt die Auswahl der Join-Methode durch den Optimierer ein und kann sich daher auf die Performance auswirken. Bei einigen Abfragen ist es unvermeidlich, dass der Optimierer einen Plan erstellt, der eine Arbeitstabelle enthlt, und somit keinen empfindlichen Cursor erlaubt.

38

Kapitel 2 SQL in Anwendungen verwenden


Arbeitstabellen werden blicherweise zum Sortieren und Gruppieren von Zwischenergebnissen verwendet. Eine Arbeitstabelle ist zum Sortieren nicht erforderlich, wenn auf die Zeilen durch einen Index zugegriffen werden kann. Es ist nicht immer mglich vorherzusagen, welche Abfragen Arbeitstabellen verwenden, aber sie werden von folgenden Abfragen verwendet: UNION-Abfragen, auch wenn UNION ALL nicht unbedingt Arbeitstabellen verwenden. Anweisungen mit einer ORDER BY-Klausel, wenn es keinen Index auf der ORDER BY-Spalte gibt. Jede Abfrage, die mit einem Hash-Join optimiert ist. Viele Abfragen, die DISTINCT- oder GROUP BY-Klauseln betreffen.

In diesen Fllen gibt Adaptive Server Anywhere entweder eine Fehlermeldung an die Anwendung zurck, oder er ndert den Cursortyp in einen nicht-empfindlichen Cursor und gibt eine Warnmeldung aus.

$ Weitere Hinweise zur Abfragenoptimierung und Verwendung von


Arbeitstabellen finden Sie unter "Abfragen optimieren und ausfhren" auf Seite 345 der Dokumentation ASA SQL-Benutzerhandbuch.

Nicht-empfindliche Cursor
Diese Cursor haben keine genau definierte Empfindlichkeit in ihrer Mitgliedschaft, ihrer Reihenfolge oder ihren Werten. Die Flexibilitt, die sie in Bezug auf Empfindlichkeit haben, ermglicht es, nicht-empfindliche Cursor fr die Performance zu optimieren. Nicht-empfindliche Cursor werden nur fr schreibgeschtzte Cursortypen verwendet.
Standards

Nicht-empfindliche Cursor entsprechen der ISO/ANSI-Standarddefinition von nicht-empfindlichen Cursorn beziehungsweise den ODBC-Cursorn mit unbestimmter Empfindlichkeit.
Schnittstelle ODBC, OLE DB und ADO Embedded SQL Cursortyp Unspecified sensitivity DYNAMIC SCROLL

Programmierschnittstellen

39

Adaptive Server Anywhere-Cursor

Beschreibung

Die Anforderung eines nicht-empfindlichen Cursors schrnkt die Auswahl der Methoden kaum ein, die Adaptive Server Anywhere verwenden kann, um die Abfrage zu optimieren und Zeilen an die Anwendung zurckzugeben. Aus diesen Grnden erhalten Sie mit nicht-empfindlichen Cursorn die beste Performance. Vor allem steht es dem Optimierer frei, jede Manahme zur Materialisierung von Zwischenergebnissen, wie z.B. Arbeitstabellen, anzuwenden, und Zeilen knnen vom Client vorab abgerufen werden. Adaptive Server Anywhere kann die Sichtbarkeit von nderungen in den darunter liegenden Basiszeilen nicht garantieren. Einige nderung knnen sichtbar sein, andere nicht. Die Mitgliedschaft und Reihenfolge knnen sich mit jedem Abruf ndern. Besonders Aktualisierungen in Basiszeilen knnen dazu fhren, dass nur einige der aktualisierten Spalten im Ergebnis des Cursors wiedergespiegelt werden. Nicht-empfindliche Cursor sind keine Garantie dafr, dass Zeilen zurckgegeben werden, die der Auswahl und Reihenfolge der Abfrage entsprechen. Die Zeilenmitgliedschaft steht zum Zeitpunkt des ffnens des Cursors fest, aber nachfolgende nderungen an den darunter liegenden Werten werden in den Ergebnissen wiedergespiegelt. Nicht-empfindliche Cursor geben immer Zeilen zurck, die den WHEREund ORDER BY-Klauseln des Kunden zu dem Zeitpunkt entsprachen, an dem die Cursor-Mitgliedschaft etabliert wurde. Wenn sich Spaltenwerte nach dem ffnen des Cursors ndern, werden mglicherweise Zeilen zurckgegeben, die nicht mehr den WHERE- und ORDER BY-Klauseln entsprechen.

Wert-empfindliche Cursor
Diese Cursor sind in Bezug auf ihre Mitgliedschaft unempfindlich, dafr sind sie empfindlich, was die Reihenfolge und Werte der Ergebnismenge betrifft. Wert-empfindliche Cursor knnen fr schreibgeschtzte oder aktualisierbare Cursortypen verwendet werden.
Standards Programmierschnittstellen

Wert-empfindliche Cursor entsprechen keiner ISO/ANSI-Standarddefintion. Sie entsprechen den Schlsselmengen-gesteuerten ODBC-Cursorn.
Schnittstelle ODBC, OLE DB und ADO Embedded SQL JDBC Open Client Cursortyp Schlsselmengen-basiert SCROLL Schlsselmengen-basiert Schlsselmengen-basiert

40

Kapitel 2 SQL in Anwendungen verwenden

Beschreibung

Wenn eine Anwendung eine Zeile abruft, die aus einer darunter liegenden genderten Basiszeile besteht, dann muss der Anwendung der aktualisierte Wert sowie die SQL_ROW_UPDATED-Statusmeldung bermittelt werden. Wenn die Anwendung versucht, eine Zeile abzurufen, die aus einer darunter liegenden Basiszeile zusammengesetzt war, welche gelscht worden ist, muss eine SQL_ROW_DELETED-Statusmeldung an die Anwendung bermittelt werden. Eine nderung am Primrschlsselwert entfernt die Zeile aus der Ergebnismenge (dies wird als Lschen, gefolgt von Einfgen, behandelt). Ein Sonderfall tritt auf, wenn eine Zeile in der Ergebnismenge gelscht wird (durch den Cursor oder von auswrts), und eine neue Zeile mit demselben Schlsselwert eingefgt wird. Das fhrt dazu, dass die neue Zeile die alte Zeile in der ursprnglichen Position ersetzt. Es gibt keine Garantie, dass die Zeilen in der Ergebnismenge dem Reihenfolgen- oder Auswahlkriterium der Abfrage entsprechen. Da die Zeilenmitgliedschaft zum Zeitpunkt des ffnens festgelegt wird, fhren nachfolgende nderungen, durch die eine Zeile nicht mehr der WHEREoder ORDER BY-Klausel entspricht, nicht dazu, dass sich die Mitgliedschaft oder Position einer Zeile ndert. Alle Werte sind in Bezug auf nderungen, die durch den Cursor durchgefhrt werden,empfindlich. Die Empfindlichkeit der Mitgliedschaft gegenber nderungen, die durch den Cursor ausgefhrt werden, wird durch die ODBC-Option SQL_STATIC_SENSITIVITY gesteuert. Wenn diese Option auf ON eingestellt ist, fgen Einfgungen durch den Cursor die Zeile dem Cursor hinzu. Ansonsten ist sie nicht in der Ergebnismenge enthalten. Lschungen durch den Cursor entfernen die Zeile aus der Ergebnismenge, wodurch ein Lcke vermieden wird, und geben die SQL_ROW_DELETEDStatusmeldung zurck. Wert-empfindliche Cursor verwenden eine Schlsselmengen-Tabelle. Wenn der Cursor geffnet wird, fllt Adaptive Server Anywhere eine Arbeitstabelle mit Kenndaten fr jede Zeile an, die zur Ergebnismenge beitrgt. Wenn Sie die Ergebnismenge durchblttern, wird die Schlsselmengen-Tabelle zur Identifizierung der Mitgliedschaft der Ergebnismenge verwendet, aber die Daten werden, falls erforderlich, von den darunter liegenden Tabellen bezogen. Die Eigenschaft der festen Mitgliedschaft von Wert-empfindlichen Cursorn ermglicht es Ihrer Anwendung, sich an die Zeilenpositionen innerhalb eines Cursors erinnern, und stellt sicher, dass diese Positionen nicht gendert werden. Weitere Hinweise finden Sie unter "Beispiel fr CursorEmpfindlichkeit: Eine gelschte Zeile" auf Seite 32. 41

Adaptive Server Anywhere-Cursor


Wenn eine Zeile seit dem ffnen des Cursors aktualisiert beziehungsweise mglicherweise aktualisiert wurde, gibt Adaptive Server Anywhere die Warnung SQLE_ROW_UPDATED_WARNING zurck, wenn die Zeile abgerufen wird. Die Warnung wird nur einmal ausgegeben: Ein weiteres Abrufen der Zeile generiert keine Warnmeldung. Eine Aktualisierung einer beliebigen Spalte in der Zeile verursacht diese Warnung sogar, wenn die aktualisierte Spalte nicht durch den Cursor referenziert wird. Ein Cursor auf emp_lname und emp_fname wrde beispielsweise die Aktualisierung melden, selbst wenn nur die birthdateSpalte gendert worden wre. Diese Warn- und Fehlerbedingungen bei Aktualisierung treten nicht im Massenoperationsmodus (Option -b fr Datenbankserver) auf, wenn die Zeilensperre deaktiviert ist. Siehe "Performance-berlegungen beim Bewegen von Daten" auf Seite 470 der Dokumentation ASA SQL-Benutzerhandbuch.

$ Weitere Hinweise finden Sie unter "Zeile wurde seit dem letzten
Lesen aktualisiert" auf Seite 324 der Dokumentation ASA Fehlermeldungen Der Versuch, eine positionsbasierte UPDATE- oder DELETEAnweisung auf einer Zeile auszufhren, die seit dem letzten Abruf gendert wurde, gibt den SQLE_ROW_UPDATED_SINCE_READFehler aus und bricht die Anweisung ab. Eine Anwendung muss die Zeile noch einmal mit FETCH ABRUFEN, bevor das UPDATE oder DELETE zugelassen wird. Eine Aktualisierung einer beliebigen Spalte in der Zeile verursacht diesen Fehler. Dies ist sogar dann der Fall, wenn die aktualisierte Spalte nicht durch den Cursor referenziert wird. Der Fehler tritt nicht im Massenvorgangsmodus auf.

$ Weitere Hinweise finden Sie unter "Zeile seit dem letzten Lesen
gendert - Vorgang abgebrochen" auf Seite 323 der Dokumentation ASA Fehlermeldungen. Wenn eine Zeile, entweder durch den Cursor oder durch eine andere Transaktion, nach dem ffnen des Cursors gelscht wurde, entsteht im Cursor eine Lcke. Die Mitgliedschaft des Cursors steht fest, daher ist die Position einer Zeile reserviert, aber der DELETE-Vorgang wird im genderten Wert fr die Zeile wiedergespiegelt. Wenn Sie die Zeile an dieser Lcke abrufen, wird mit der Fehlermeldung Keine aktuelle Cursorzeile (SQL state 24503) darauf hingewiesen, dass es keine aktuelle Zeile gibt, und der Cursor wird auf der Lcke belassen. Sie knnen Lcken vermeiden, indem Sie empfindliche Cursor verwenden, da sich deren Mitgliedschaft zusammen mit den Werten verndert.

42

Kapitel 2 SQL in Anwendungen verwenden

$ Weitere Hinweise finden Sie unter "Keine aktuelle Cursorzeile" auf


Seite 207 der Dokumentation ASA Fehlermeldungen. Sie knnen fr Wert-empfindliche Cursor Zeilen nicht vorab abrufen. Diese Einschrnkung kann sich manchmal auf die Performance auswirken.

Cursor-Empfindlichkeit und Performance


Es besteht eine Wechselwirkung zwischen Performance und anderen CursorEigenschaften. Besonders wenn Sie einen Cursor aktualisierbar machen, fhrt das zu Beschrnkungen der Abfrageverarbeitung und -zustellung, was die Performance vermindert. Auch knnen Anforderungen an die CursorEmpfindlichkeit die Performance einschrnken. Um zu verstehen, wie sich die Aktualisierbarkeit und Empfindlichkeit von Cursorn auf die Performance auswirkt, ist es hilfreich zu wissen, wie die Ergebnisse, die durch einen Cursor sichtbar sind, von der Datenbank an die Client-Anwendung bermittelt werden. Im Einzelnen knnen Ergebnisse aus Performance-Grnden an zwei dazwischengeschalteten Standorten gespeichert werden:
Arbeitstabellen Sowohl Zwischen- als auch Endergebnisse knnen als Arbeitstabellen gespeichert werden. Wert-empfindliche Cursor verwenden eine Arbeitstabelle fr Primrschlsselwerte. AbfrageEigenschaften knnen ebenfalls dazu fhren, dass der Optimierer in seinem gewhlten Ausfhrungsplan Arbeitstabellen verwendet. Prefetch-Vorgang Der Client kann Zeilen vorab in einen clientseitigen Puffer abrufen, um separate Anfragen an der Datenbankserver fr jede Zeile zu vermeiden.
ODBC-Treiber in der Netzwerk-Bibliothek DatenbankServer

ClientAnwendung

Vorab abgerufene Zeilen Arbeitstabelle

Die Empfindlichkeit und Aktualisierbarkeit beschrnken die Verwendung von zwischengeschalteten Standorten. 43

Adaptive Server Anywhere-Cursor


Einem aktualisierbaren Cursor ist es nicht gestattet, Arbeitstabellen zu verwenden oder mit PREFETCH Ergebnisse vorab abzurufen. Wre dies mglich, wre er fr verlorene Aktualisierungen anfllig. Dieses Problem wird im folgenden Beispiel erlutert: 1 Eine Anwendung ffnet auf der Beispieldatenbank in der folgenden Abfrage einen Cursor.
SELECT id, 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. Eine weitere Transaktion aktualisiert die Zeile mit der folgenden Anweisung:
UPDATE product SET quantity = quantity - 10 WHERE id = 300

4 5

Die Anwendung aktualisiert die Zeile durch den Cursor auf einen Wert von (quantity - 5 ). Der korrekte Endwert fr die Zeile sollte 13 sein. Wenn der Cursor die Zeile vorab abgerufen htte, wrde der neue Wert fr die Zeile 23 lauten und die Aktualisierung der anderen Transaktion verloren gehen.

hnliche Einschrnkungen sind magebend fr die Empfindlichkeit. Weitere Hinweise finden Sie unter den Beschreibungen der einzelnen Cursortypen.

Zeilen-Prefetch
Prefetch-Vorgnge und Mehrzeilen-Fetch-Vorgnge unterscheiden sich voneinander. Prefetch-Vorgnge knnen ohne explizite Anweisungen aus der Clientanwendung ausgefhrt werden. Prefetch-Vorgnge rufen Zeilen aus dem Server in einen Puffer auf dem Client ab, machen diese Zeilen aber fr die Clientanwendung erst verfgbar, wenn die entsprechende Zeile von der Anwendung abgerufen wird.

44

Kapitel 2 SQL in Anwendungen verwenden


Standardmig fhrt die Clientbibliothek von Adaptive Server Anywhere Prefetch-Vorgnge fr mehrere Zeilen aus, wenn eine Anwendung eine einzelne Zeile abruft. Die Clientbibliothek von Adaptive Server Anywhere speichert die zustzlichen Zeilen in einem Puffer. Prefetch-Vorgnge verbessern die Performance durch die Reduktion des Client/Server-Verkehrs und erhhen den Durchsatz, indem ohne separate Anforderung fr einzelne Zeilen oder Zeilenblcke viele Zeilen verfgbar gemacht werden.

$ Weitere Hinweise zur Steuerung der Prefetch-Funktionen finden Sie


unter "PREFETCH-Option" auf Seite 659 der Dokumentation ASA Datenbankadministration. PrefetchFunktionen aus einer Anwendung steuern Durch die PREFETCH-Option wird gesteuert, ob Prefetch-Vorgnge durchgefhrt werden oder nicht. Sie knnen die PREFETCH-Option fr eine einzelne Verbindung auf ON oder OFF setzen. Standardmig wird sie auf ON gesetzt. In Embedded SQL knnen Sie die PREFETCH-Vorgnge auf Cursorbasis steuern, wenn Sie einen Cursor bei einem FETCH-Vorgang ffnen, indem Sie die BLOCK-Klausel verwenden. Die Anwendung kann eine maximale Anzahl von Zeilen festlegen, die in einem einzelnen FETCH-Vorgang vom Server enthalten sein drfen, indem die BLOCK-Klausel angegeben wird. Beispiel: Wenn Sie 5 Zeilen gleichzeitig abrufen und anzeigen, knnen Sie BLOCK 5 verwenden. Wenn Sie BLOCK 0 festlegen, wird jeweils 1 Datensatz abgerufen, und ein FETCH RELATIVE 0 ruft die Zeile nochmals vom Server ab. Obwohl Sie die PREFETCH-Vorgnge auch durch einen Verbindungsparameter fr die Anwendung ausschalten knnen, ist es effektiver, BLOCK=0 zu verwenden.

$ Weitere Hinweise finden Sie unter "PREFETCH-Option" auf


Seite 659 der Dokumentation ASA Datenbankadministration. In Open Client knnen Sie das PREFETCH-Verhalten mit ct_cursor und CS_CURSOR_ROWS nach der Deklaration, aber vor dem ffnen des Cursors steuern.

Cursor-Empfindlichkeit und Isolationsstufen


Sowohl Cursor-Empfindlichkeit als auch Isolationsstufen betreffen das Problem der Parallelitt, allerdings auf unterschiedliche Weise.

45

Adaptive Server Anywhere-Cursor


Indem Sie eine Isolationsstufe fr eine Transaktion auswhlen (hufig auf der Verbindungsebene), legen Sie fest, wann Sperren auf Zeilen in der Datenbank plaziert werden. Sperren verhindern, dass andere Transaktionen auf die Werte in der Datanbank zugreifen oder sie verndern. Indem Sie eine Cursor-Empfindlichkeit auswhlen legen Sie fest, welche nderungen fr die Anwendung, die den Cursor verwendet, sichtbar sind. Indem Sie die Cursor-Empfindlichkeit einstellen legen Sie nicht fest, wann Sperren auf Zeilen in der Datenbank gelegt werden, und Sie schrnken auch nicht die nderungen ein, die an der Datenbank selbst durchgefhrt werden.

46

Kapitel 2 SQL in Anwendungen verwenden

Ergebnismengen beschreiben
Einige Anwendungen bauen SQL-Anweisungen auf, die in der Anwendung nicht ausgefhrt werden knnen. Anweisungen hngen manchmal von einer Antwort des Benutzers ab, sodass die Anwendung erst dann erfhrt, welche Daten abzurufen sind, z.B. wenn eine Berichtsanwendung dem Benutzer die Mglichkeit gibt, die anzuzeigenden Spalten auszuwhlen. In einem solchen Fall bentigt 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 einschlielich 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 verknpft, obwohl manche Schnittstellen die Verwendung von Deskriptoren vor dem Benutzer verbergen. Normalerweise gilt: Anweisungen, die Deskriptoren bentigen, sind entweder SELECTAnweisungen oder gespeicherte Prozeduren, die Ergebnismengen zurckgeben. Ein Deskriptor wird bei einem cursorbasierten Vorgang folgendermaen eingesetzt: 1 2 3 Weisen Sie den Deskriptor zu. Dies kann implizit erfolgen, die explizite Zuweisung ist aber in manchen Schnittstellen zulssig. 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 fr die Anweisung und ffnen Sie ihn (Embedded SQL), oder fhren 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. Schlieen Sie den Cursor. Lschen Sie die Anweisung . Einige Schnittstellen fhren dies automatisch durch. In Embedded SQL enthlt 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 knnen diese Felder mit SQLSetDescRec, SQLSetDescField, SQLGetDescRec und SQLGetDescField verarbeiten. Alternativ knnen Sie SQLDescribeCol und SQLColAttributes verwenden, um Spalteninformationen zu beziehen. In Open Client knnen Sie ct_dynamic fr die Vorbereitung einer Anweisung und ct_describe zur Beschreibungder Ergebnismenge der Anweisung verwenden. Sie knnen aber auch ct_command benutzen, um eine SQL-Anweisung ohne vorherige Vorbereitung zu senden und dann ct_results benutzen, um die zurckgegebenen 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 knnen 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 fr die Ergebnismenge.

$ Weitere Hinweise zu Eingabe- und Ausgabeparametern fr 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 ausgefhrt 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 knnen 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 durchfhrt oder der Datenbankserver eine automatische Festschreibung vollzieht, wie zum Beispiel beim Ausfhren 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 knnen, mssen 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 anhngen. 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 Transaktionsintegritt 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 hngt von der verwendeten Programmierschnittstelle ab. Die Implementierung von AUTOCOMMIT kann, abhngig 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):

Standardmig arbeitet ODBC im AUTOCOMMIT-Modus. Die Art, wie Sie AUTOCOMMIT ausschalten, hngt 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):

Standardmig 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):

Standardmig operiert eine Verbindung, die durch Open Client hergestellt wird, im AUTOCOMMIT-Modus. Sie knnen 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):

Standardmig 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. Abhngig von der verwendeten Schnittstelle und davon, wie Sie das AUTOCOMMIT-Verhalten steuern, verhlt 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 ausgefhrten SQL-Anweisung. Adaptive Server Anywhere verwendet clientseitiges AUTOCOMMIT fr 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 fr 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. Fr den Client ist eine gespeicherte Prozedur eine einzelne Anweisung, und daher sendet AUTOCOMMIT eine einzelne COMMIT-Anweisung, nachdem die gesamte Prozedur ausgefhrt 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 knnen die Isolationsstufe einer aktuellen Verbindung mit der Datenbankoption ISOLATION_LEVEL einstellen.

51

Transaktionen in Anwendungen steuern


Einige Schnittstellen, wie ODBC, ermglichen das Setzen der Isolationsstufe fr eine Verbindung beim Aufbau. Diese Isolationsstufe kann spter mit der Datenbankoption ISOLATION_LEVEL zurckgesetzt werden.

Cursor und Transaktionen


Im Allgemeinen wird ein Cursor geschlossen, wenn ein COMMIT ausgefhrt wird. Es gibt zwei Ausnahmen fr dieses Verhalten. Die Datenbankoption CLOSE_ON_ENDTRANS ist auf OFF gesetzt. Ein Cursor wird mit WITH HOLD geffnet, was der Standard bei Open Client und JDBC ist.

Trifft einer dieser beiden Flle zu, bleibt der Cursor bei COMMIT geffnet. ROLLBACK und Cursor Beim Zurcksetzen einer Transaktion wird der Cursor geschlossen, auer wenn er mit WITH HOLD geffnet wurde. Dem Inhalt eines Cursors knnen Sie nach einem Zurcksetzen nicht vertrauen. Der projektierte ISO SQL3-Standard legt fest, dass bei einem Zurcksetzen alle Cursor geschlossen werden sollen. Sie knnen dieses Verhalten erzwingen, indem Sie die Option ANSI_CLOSE_CURSORS_AT_ROLLBACK auf ON setzen. Savepoints Wenn eine Transaktion bis zu einem Savepoint zurckgesetzt wird und ANSI_CLOSE_CURSORS_AT_ROLLBACK auf ON gesetzt ist, wird jeder nach dem SAVEPOINT geffnete Cursor geschlossen (sogar die Cursor, die mit WITH HOLD geffnet wurden). Sie knnen die Isolationsstufe fr eine Verbindung whrend 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

Einfhrung in Java fr Datenbanken

ber dieses Kapitel

In diesem Kapitel wird erklrt, warum es sinnvoll ist, Java in einer Datenbank zu verwenden. Der Adaptive Server Anywhere ist eine Laufzeit-Umgebung fr Java. Java bietet eine natrliche Erweiterung fr SQL und verwandelt Adaptive Server Anywhere in eine Plattform fr Unternehmensanwendungen der nchsten Generation.

Inhalt

Thema Einleitung Fragen und Antworten zu Java in der Datenbank Ein Java-Seminar Die Laufzeitumgebung fr Java in der Datenbank Praktische Einfhrung: Eine bung mit Java in der Datenbank

Seite 54 57 64 75 84

53

Einleitung

Einleitung
Adaptive Server Anywhere ist eine Laufzeit-Umgebung fr Java. Das bedeutet, dass Java-Klassen im Datenbankserver ausgefhrt werden knnen. Durch die Integration einer Laufzeit-Umgebung fr Java-Klassen in den Datenbankserver werden neue, vielfltige Wege fr die Verwaltung und Speicherung von Daten und Logik erffnet. Java in der Datenbank bietet folgende Mglichkeiten: Sie knnen Java-Komponenten in den verschiedenen Schichten Ihrer Anwendung verwenden (Client, mittlere Schicht oder Server) und berall einsetzen, wo es fr Sie am sinnvollsten ist. Adaptive Server Anywhere wird damit zu einer Plattform fr verteilte Informationsverarbeitung. Java bietet mehr Mglichkeiten als gespeicherte Prozeduren fr die Integration von Logik in die Datenbank. Java-Klassen werden zu reichhaltigen, benutzerdefinierten Datentypen. Die Methoden der Java-Klassen bieten neue Funktionen fr den Zugriff aus SQL. Java kann in der Datenbank benutzt werden, ohne dass die Integritt, 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 fr 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 fr ein breites Spektrum von Java-Entwicklern geschrieben und untersttzt daher alle, von erfahrenen Entwicklern bis zu fachlich nicht vorgebildeten Lesern, die die Sprache, ihre Mglichkeiten, ihre Syntax und ihre Einsatzmglichkeiten nicht kennen. 54

Kapitel 3 Einfhrung in Java fr Datenbanken


Leser, fr die Java nichts Neues mehr ist, finden in diesem Kapitel wertvolle Hinweise fr den Einsatz von Java in einer Datenbank. Adaptive Server Anywhere erweitert nicht nur die Mglichkeiten der Datenbank mit Java, sondern auch die Mglichkeiten von Java mit der Datenbank. JavaDokumentation In der nachstehenden Tabelle finden Sie Hinweise zur Dokumentation zum Thema Java in der Datenbank.
Titel "Einfhrung in Java fr 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 fr 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, einschlielich verteilter Informationsverarbeitung Testen und Fehlersuche von Java-Code fr den Einsatz in der Datenbank

Das Referenzhandbuch enthlt Informationen zu den SQL-Erweiterungen, die Java in der Datenbank untersttzen. Online-Handbuch fr Java API-Klassen, Felder und Methoden. Nur als Windows-Hilfedatei verfgbar. 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 fr die Java-Dokumentationen, die Sie je nach Ihren Interessen und Vorkenntnissen benutzen knnen. Die Tabelle ist nur als Richtlinie gedacht und soll Ihre Bemhungen, mehr ber Java in der Datenbank zu lernen, untersttzen.

55

Einleitung

Gesuchtes Thema Sie bentigen eine Einfhrung in objektorientiertes Programmieren Sie bentigen eine Erklrung 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 fr Java in der Datenbank" auf Seite 75 "Praktische Einfhrung: 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 fr Java vorbereiten. Sie brauchen eine komplette Liste der untersttzten Java APIs. Sie versuchen, eine Java API-Klasse zu verwenden und bentigen JavaReferenzinformationen. Sie wollen ein Beispiel fr verteilte Informationsverarbeitung sehen.

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

56

Kapitel 3 Einfhrung in Java fr Datenbanken

Fragen und Antworten zu Java in der Datenbank


In diesem Abschnitt werden die Hauptmerkmale von Java in der Datenbank beschrieben.

Die wichtigsten Funktionen von Java in der Datenbank


Detaillierte Erluterungen aller nachstehenden Punkte sind in den folgenden Abschnitten zu finden.
Sie knnen Java auf dem Datenbankserver ausfhren Eine interne

Java Virtual Machine (VM) fhrt den Java-Code auf dem Datenbankserver aus.
Sie knnen Java aus SQL aufrufen Sie knnen Java-Funktionen

(Methoden) aus SQL-Anweisungen ausfhren. Java-Methoden bieten eine leistungsfhigere Sprache als in SQL geschriebene gespeicherte Prozeduren, wenn Sie Ihrer Datenbank logische Elemente hinzufgen wollen.
Sie knnen aus Java auf Daten zugreifen Ein interner JDBC-Treiber

ermglicht den Zugriff auf Daten aus Java.


Sie knnen die Fehlersuche fr Java in der Datenbank vornehmen

Sie knnen den Sybase Java Debugger verwenden, um Ihre JavaKlassen in der Datenbank zu testen und auf Fehler zu durchsuchen.
Sie knnen Java-Klassen als Datentypen verwenden Jede in einer Datenbank installierte Java-Klasse wird als Datentyp verfgbar, der fr eine Spalte in einer Tabelle oder einer Variablen verwendet werden kann. Sie knnen Java-Objekte in Tabellen speichern Eine Instanz einer

Java-Klasse (ein Java-Objekt) kann als Wert in einer Tabelle gespeichert werden. Java-Objekte knnen in eine Tabelle eingefgt, SELECTAnweisungen in den Feldern und Methoden von in Tabellen gespeicherten Objekten ausgefhrt, und Java-Objekte aus einer Tabelle abgerufen werden. Mit diesen Mglichkeiten wird Adaptive Server Anywhere zu einer objekt-relationalen Datenbank, die Objekte untersttzt, gleichzeitig aber die bestehenden relationalen Funktionen nicht beeintrchtigt.
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.

57

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. Um Java in einer Datenbank auszufhren, schreiben Sie die Java-Instruktionen auerhalb der Datenbank in kompilierte Klassen (Bytecode), bei denen es sich um Binrdateien mit Java-Instruktionen handelt. Sie installieren diese kompilierten Klassen dann in einer Datenbank. Nach der Installation knnen Sie diese Klassen im Datenbankserver ausfhren. Adaptive Server Anywhere ist eine Laufzeit-Umgebung fr Java-Klassen, keine Java-Entwicklungsumgebung. Sie brauchen eine JavaEntwicklungsumgebung, wie Sybase PowerJ oder Java Development Kit von Sun Microsystems, um Java-Codes zu schreiben und zu kompilieren.

$ Weitere Hinweise finden Sie unter "Java-Klassen in einer Datenbank


installieren" auf Seite 103.

Java in einer Datenbank ausfhren


Adaptive Server Anywhere enthlt eine Java Virtual Machine (VM), die in der Datenbankumgebung luft. Die Sybase Java VM interpretiert kompilierte Java-Instruktionen und fhrt sie im Datenbankserver aus. Zustzlich zur VM wurde der SQL-Abfrageprozessor im Datenbankserver erweitert, so dass er in der VM Aufrufe durchfhren kann, um JavaInstruktionen auszufhren. Er kann auch Abfragen von der VM verarbeiten, um den Datenzugriff aus Java zu aktivieren. Unterschiede zu einer eigenstndigen VM Es gibt einen Unterschied zwischen dem Ausfhren von Java-Codes mit einer Standard-VM wie Sun Java VM java.exe und dem Ausfhren von Java-Codes in einer Datenbank. Die Sun VM wird von einer Befehlszeile aus gestartet, whrend die Java VM von Adaptive Server Anywhere jederzeit verfgbar ist, um einen Java-Vorgang auszufhren, wenn dies als Teil der Ausfhrung einer SQL-Anweisung erforderlich ist. Auf den Sybase Java-Interpreter knnen Sie extern nicht zugreifen. Er wird nur benutzt, wenn die Ausfhrung einer SQL-Anweisung einen JavaVorgang erforderlich macht. Der Datenbankserver startet die VM automatisch, wenn sie bentigt wird: Sie brauchen keine ausdrcklichen Bedienungsmanahmen auszufhren, um die VM zu starten oder zu stoppen.

58

Kapitel 3 Einfhrung in Java fr Datenbanken

Vorteile von Java


Java bietet eine Reihe von Merkmalen, die fr den Einsatz in Datenbanken besonders gut geeignet sind: Przise Fehlerprfung bei der Kompilierung Integrierte Fehlerbehandlung mit einer gut definierten Methode fr die Fehlerbehandlung Integrierte Sammlung von Abfalldaten (Speicher wird freigesetzt) Eliminierung vieler fehleranflliger Programmiertechniken Leistungsfhige Sicherheitsfunktionen Java-Code wird interpretiert, daher werden keine Vorgnge ausgefhrt, die von der VM nicht akzeptiert werden

Plattformen, die Java in der Datenbank untersttzen


Java in der Datenbank wird auf Windows CE nicht untersttzt. Wohl aber unter Windows-Betriebssystemen, UNIX und NetWare.

Java und SQL zusammen einsetzen


Ein Grundsatz fr das Konzept von Java in der Datenbank besteht darin, dass damit eine natrliche, offene Erweiterung fr bestehende SQL-Funktionen gegeben ist.
Java-Vorgnge werden aus SQL aufgerufen Sybase hat den Bereich der SQL-Ausdrcke erweitert, sodass Eigenschaften und Methoden von Java-Objekten einbezogen werden knnen und damit der Einbau von Java-Vorgngen in eine SQL-Anweisung mglich ist. Java-Klassen werden Domnen Sie speichern Java-Klassen mit

denselben SQL-Anweisungen wie fr normale SQL-Datentypen. Sie knnen viele der Klassen verwenden, die Teil der Java API sind, so wie sie mit dem Java Development Kit von Sun Microsystems geliefert werden. Sie knnen auch Klassen verwenden, die von Java-Entwicklern erstellt und kompiliert wurden.

59

Fragen und Antworten zu Java in der Datenbank

Beschreibung der Java API


Die Java-Programmierschnittstelle (Java Application Programmers Interface, API) ist eine Gruppe von Klassen, die von Sun Microsystems erstellt wurde. Sie bietet eine Reihe von Basisfunktionen, die von JavaEntwicklern benutzt und erweitert werden knnen. Sie bilden den Kern aller Einsatzmglichkeiten von Java. Die Java API bietet aus sich heraus zahlreiche Mglichkeiten und Funktionen. Ein Groteil der Java API kann in jede Datenbank integriert werden, die fr die Arbeit mit Java-Programmcode eingerichtet wurde. Dazu gehrt die Mehrzahl der nicht-visuellen Klassen aus der Java API, die Entwicklern, welche schon mit dem Java Development Kit (JDK) von Sun Microsystems arbeiten, bekannt sein drften.

$ Weitere Hinweise ber untersttzte Java-APIs finden Sie unter


"Untersttzte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch.

Zugriff auf Java aus SQL


Die Java API kann nicht nur in Klassen verwendet werden, sondern auch in gespeicherten Prozeduren und SQL-Anweisungen. Sie knnen die Java APIKlassen als Erweiterungen zu den verfgbaren Funktionen behandeln, die von SQL zur Verfgung gestellt werden. Beispiel: Die SQL-Funktion PI(*) gibt den Wert fr pi zurck. Die Java APIKlasse java.lang.Math hat ein paralleles Feld namens PI, das denselben Wert zurckgibt. Die Klasse java.lang.Math hat aber auch ein Feld namens E, das die Basis von natrlichen Logarithmen zurckgibt, sowie eine Methode, die die Restoperation auf zwei Argumente gem dem Standard IEEE 754 durchfhrt. Andere Bestandteile der Java API bieten weitere, zustzliche Mglichkeiten. Beispiel: java.util.Stack generiert eine Warteschlange nach dem Last-InFirst-Out-Prinzip, die eine Liste sortiert speichern kann, java.util.HashTable wird benutzt, um Werte Schlsseln zuzuordnen, java.util.StringTokenizer unterteilt eine Zeichenfolge in einzelne Worteinheiten.

$ Weitere Hinweise finden Sie unter "Java-Objekte einfgen,


aktualisieren und lschen" auf Seite 111.

60

Kapitel 3 Einfhrung in Java fr Datenbanken

Untersttzte Java-Klassen
Die Datenbank untersttzt nicht alle Java API-Klassen. Einige Klassen, beispielsweise das Paket java.awt, das Bestandteile der Benutzerschnittstelle fr Anwendungen enthlt, ist in einem Datenbankserver nicht sinnvoll. Andere Klassen, einschlielich Teile der Klasse java.io, bernehmen Schreibfunktionen auf der Festplatte, was in einer DatenbankserverUmgebung ebenfalls nicht untersttzt wird.

$ Weitere Hinweise ber untersttzte und nicht untersttzte Klassen


finden Sie unter "Untersttzte Java-Pakete" auf Seite 87 der Dokumentation ASA SQL-Referenzhandbuch und "Nicht-untersttzte Java-Pakete und Klassen" auf Seite 88 der Dokumentation ASA SQL-Referenzhandbuch.

Eigene Java-Klassen in Datenbanken einsetzen


Sie knnen Ihre eigenen Java-Klassen in einer Datenbank installieren. Beispiel: Ein Entwickler knnte die benutzerdefinierte Klasse "Mitarbeiter" oder "Verpackung" konzipieren, in Java schreiben und mit einem JavaCompiler kompilieren. Von einem Benutzer erstellte Java-Klassen knnen Informationen ber den Gegenstand der Klasse und Rechnerlogik enthalten. Nachdem sie in einer Datenbank installiert wurden, stellt Adaptive Server Anywhere diese Klassen in allen Teilen und Vorgngen der Datenbank zur Verfgung und fhrt ihre Funktionen (in der Form von Klassen- oder Instanzenmethoden) genauso schnell und einfach aus wie gespeicherte Prozeduren.
Java-Klassen und gespeicherte Prozeduren unterscheiden sich

Java-Klassen unterscheiden sich von gespeicherten Prozeduren. Whrend gespeicherte Prozeduren in SQL geschrieben sind, bieten Java-Klassen eine leistungsfhigere Sprache und knnen aus Clientanwendungen genau so leicht aufgerufen werden wie gespeicherte Prozeduren. Wenn eine Java-Klasse in einer Datenbank installiert wird, steht sie als neue Domne zur Verfgung. Eine Java-Klasse kann in jeder Situation verwendet werden, in der integrierte SQL-Datentypen benutzt werden knnen: Als Spaltentyp in einer Tabelle oder als Variablentyp. Beispiel: Wenn eine Klasse namens Adresse in einer Datenbank installiert wurde, kann eine Spalte in einer Tabelle namens Adr den Typ Adresse haben, was bedeutet, dass nur auf der Klasse Adresse basierende Objekte als Zeilenwerte fr diese Spalte gespeichert werden knnen.

$ Weitere Hinweise finden Sie unter "Java-Klassen in einer Datenbank


installieren" auf Seite 103. 61

Fragen und Antworten zu Java in der Datenbank

Mit Java auf Daten zugreifen


Die JDBC-Schnittstelle ist ein Industriestandard, der speziell fr den Zugriff auf Datenbanksysteme entwickelt wurde. Die JDBC-Klassen sollen folgende Aufgaben ermglichen: Verbindung mit einer Datenbank, Anforderung von Daten mit SQL-Anweisungen und Rcklieferung von Ergebnismengen, die in der Clientanwendung verarbeitet werden knnen. Normalerweise werden die JDBC-Klassen von einer Clientanwendung verwendet, und der Datenbank-Systemlieferant stellt einen JDBC-Treiber zur Verfgung, mit dem JDBC-Klassen eine Verbindung herstellen knnen. Sie knnen sich aus einer Clientanwendung mit Adaptive Server Anywhere ber JDBC verbinden, indem Sie jConnect oder eine JDBC/ODBC-Brcke benutzen. Adaptive Server Anywhere bietet auch einen internen JDBCTreiber, der es in einer Datenbank installierten Java-Klassen ermglicht, JDBC-Klassen zu verwenden, die SQL-Anweisungen ausfhren.

$ Weitere Hinweise finden Sie unter "Datenzugriff ber JDBC" auf


Seite 143.

Klassen vom Client auf einen Server verschieben


Sie knnen Java-Klassen erstellen, die zwischen verschiedenen Ebenen einer Unternehmensanwendung verschoben werden knnen. Dieselbe Java-Klasse kann in die Clientanwendung, eine mittlere Schicht oder die Datenbank integriert werden - also an der Stelle, an der sie am sinnvollsten eingesetzt werden kann. Eine Klasse, die Geschftslogik, Daten oder eine Kombination von beiden enthlt, kann auf jede Ebene des Unternehmenssystems, auch auf den Server, verschoben werden, so dass Sie die vorhandenen Ressourcen optimal einsetzen knnen. Die Betreiber von unternehmensweiten Systemen knnen daher mit einer einzigen Programmiersprache in einer mehrschichtigen Architektur mit bisher nie gekannter Flexibilitt eigene Anwendungen entwickeln.

Verteilte Anwendungen erstellen


Sie knnen eine Anwendung erstellen, bei der einige Teile in der Datenbank arbeiten, andere auf dem Client-System. Sie knnen Java-Objekte vom Server an den Client bergeben und umgekehrt, genauso wie Sie SQL-Daten wie Zeichendaten und numerische Werte bergeben knnen.

$ Weitere Hinweise finden Sie unter "Verteilte Anwendungen erstellen"


auf Seite 174. 62

Kapitel 3 Einfhrung in Java fr Datenbanken

Einschrnkungen fr Java in der Datenbank


Adaptive Server Anywhere ist eine Laufzeit-Umgebung fr Java-Klassen, keine Java-Entwicklungsumgebung. Sie knnen folgende Aufgaben in einer Datenbank nicht durchfhren: Klasse-Quelldaten bearbeiten (*.java-Dateien). Java-Klassen-Quelldateien kompilieren (*.java-Dateien). Java APIs ausfhren, die nicht untersttzt werden, wie z.B. Applets und visuelle Klassen Java-Methoden ausfhren, die die Ausfhrung nativer Methoden voraussetzen. Alle Benutzerklassen, die in einer Datenbank installiert sind, mssen 100% Java sein.

Die in Adaptive Server Anywhere benutzten Klassen mssen mit einem Java-Entwicklungstool geschrieben und kompiliert werden. Danach werden sie in einer Datenbank installiert, um dort getestet, auf Fehler geprft und vom Endbenutzer benutzt zu werden.

63

Ein Java-Seminar

Ein Java-Seminar
In diesem Abschnitt werden die wichtigsten Java-Konzepte vorgestellt. Nachdem Sie sich diesen Abschnitt durchgelesen haben, sollten Sie in der Lage sein, Java-Code zu prfen, wie z.B. einfache Klassendefinitionen oder den Aufruf einer Methode, bzw. gegebenenfalls verstehen, warum etwaige Probleme auftreten.
Java-Beispielverzeichnis

Alle Klassen, die als Beispiele in diesem Dokument verwendet werden, sind im Verzeichnis mit den Java-Beispielen zu finden, nmlich im Unterverzeichnis Samples\ASA\Java zum Verzeichnis von Adaptive Server Anywhere. Zwei Dateien stehen fr jedes Java-Klassen-Beispiel: Java-Quellcode und kompilierte Klasse. Sie knnen die kompilierte Version der Beispiele von Java-Klassen in einer Datenbank sofort und ohne nderung installieren.

Erklrung von Java-Klassen


Eine Java-Klasse kombiniert Daten und Funktionen: Die Mglichkeit zur Speicherung von Informationen und die Fhigkeit zur Durchfhrung von Rechenvorgngen. Eine Klasse kann man als eine Entitt, also eine abstrakte Darstellung von Dingen sehen. Eine "Rechnungsklasse knnte beispielsweise so entworfen werden, dass sie eine normale Rechnung imitiert, wie sie im tglichen Geschftsverkehr verwendet wird. Eine Rechnung enthlt bestimmte Informationen (z.B. die verrechneten Artikel, die Rechnungsadresse, Rechnungsdatum, Zahlbetrag und Flligkeit) - dasselbe gilt fr die Instanz einer Rechnungsklasse. Klassen speichern Daten in Feldern. Eine Klasse beschreibt nicht nur Daten, sondern kann auch Berechnungen vornehmen und logische Vorgnge durchfhren. Die Rechnungsklasse knnte beispielsweise die Steuer fr eine Liste von Rechnungsposten fr jedes Rechnungsobjekt errechnen und der Zwischensumme hinzufgen, um damit die Gesamtrechnungssumme auszuwerfen, ohne dass ein Eingriff des Benutzers erforderlich wre. Eine solche Klasse wrde auch dafr sorgen, dass alle bentigten Informationselemente in die Rechnung eingefgt werden, und knnte sogar automatisch anzeigen, ob die Zahlung fllig ist oder schon teilweise geleistet wurde. Berechnungen und andere logische Vorgnge werden durch die Methoden einer Klasse ausgefhrt.

64

Kapitel 3 Einfhrung in Java fr Datenbanken

Beispiel

Der folgende Java-Code deklariert eine Klasse namens "Invoice". Diese Klassendeklaration wrde in einer Datei namens Invoice.java gespeichert und dann mit einem Java-Compiler in eine Java-Klasse kompiliert.
Java-Klassen kompilieren

Beim Kompilieren des Quellcodes fr eine Java-Klasse wird eine neue Datei mit demselben Namen wie die Quelldatei erzeugt, jedoch mit einer anderen Erweiterung. Durch das Kompilieren von Invoice.java wird dabei eine Datei namens Invoice.class erstellt, die in einer Java-Anwendung verwendet und durch eine Java VM ausgefhrt werden kann. Das Sun JDK Tool fr das Kompilieren der Klassendeklarationen ist javac.exe.
public class Invoice { // Bis jetzt kann diese Klasse nichts und hat auch keine Daten }

Auf das Schlsselwort class folgt der Name der Klasse. Es gibt eine geffnete und eine geschlossene geschweifte Klammer. Alles, was dazwischen liegt, also z.B. Felder und Methoden, wird zu einem Teil der Klasse. Grundstzlich gibt es keinen Java-Code auerhalb von Klassen. Sogar die Java-Prozedur, die von einem Java-Interpreter automatisch ausgefhrt wird, um andere Objekte zu erstellen - die Hauptmethode (main), die oft der Beginn Ihrer Anwendung ist - befindet sich selbst wieder innerhalb einer Klassendeklaration.

Unterklassen in Java
Sie knnen Klassen als Unterklassen (subclasses) anderer Klassen definieren. Eine Klasse, die als Unterklasse einer anderen Klasse fungiert, kann die Felder und Methoden ihrer bergeordneten Klasse verwenden: Dies wird als Vererbung bezeichnet. Sie knnen zustzliche Methoden und Felder definieren, die nur fr die Unterklasse gelten, und die Bedeutung der geerbten Felder und Methoden verndern. Java ist eine Programmiersprache mit einer Einzelhierarchie. Das bedeutet, dass alle Klassen, die Sie erstellen oder benutzen, von einer Klasse erben. Das bedeutet weiterhin, dass die Klassen der niedrigsten Ebene (also in der Hierarchie weiter oben angesiedelt) vorhanden sein mssen, bevor Klassen der oberen Ebene benutzt werden knnen. Die Basisgruppe der erforderlichen Klassen fr Java-Anwendungen wird als Laufzeit-JavaKlassen oder Java-API bezeichnet. 65

Ein Java-Seminar

Erklrung der Java-Objekte


Eine Klasse definiert, was ein Objekt tun kann, genauso wie ein Rechnungsformular festlegt, welche Informationen die Rechnung enthalten sollte. Klassen enthalten keine spezifischen Informationen ber Objekte. Vielmehr erstellt oder instanziert Ihre Anwendung Objekte auf Grundlage der Klasse (Vorlage), und die Objekte enthalten die Daten bzw. fhren Berechnungen aus. Das instanzierte Objekt ist eine Instanz der Klasse. Beispiel: Ein Rechungsobjekt ist eine Instanz der Rechnungsklasse. Die Klasse definiert, was das Objekt leisten kann, aber das Objekt ist die Verwirklichung der Klasse, die erst Sinn und praktische Verwendbarkeit der Klasse ermglicht. Im Beispiel mit dem Rechnungsformular definiert es, was alle Rechnungen enthalten mssen, die auf diesem Rechnungsformular aufgebaut werden. Es gibt ein Formular und 0 bis unendlich viele Rechnungen, die aufgrund dieses Formulars erstellt werden. Das Formular enthlt die Definition, aber die Rechnung beinhaltet dann den tatschlichen Nutzen. Das Rechnungsobjekt, das aus der Klasse erstellt wird, enthlt die Daten, wird gespeichert, abgerufen, bearbeitet, und so weiter. Genauso wie ein Rechnungsformular verwendet wird, um viele Rechnungen zu erstellen, wobei jede Rechnung in den Details von jeder anderen Rechnung abweicht, so knnen aus einer Klasse viele Objekte abgeleitet werden. Methoden und Felder Eine Methode ist der Teil einer Klasse, der Arbeit leistet, eine Funktion, die fr die Klasse eine Berechnung durchfhrt oder mit anderen Objekten interagiert. Methoden knnen Argumente aufnehmen und einen Wert an die aufrufende Funktion zurckgeben. Wenn kein Rckgabewert bentigt wird, kann eine Methode void (leer) zurckgegeben werden. Klassen knnen jede beliebige Anzahl von Methoden haben. Ein Feld ist Teil einer Klasse, das Informationen enthlt. Wenn ein Objekt des Typs JavaClass erstellt wird, enthalten die Felder in der JavaClass einen ausschlielich fr dieses Objekt bestimmten Zustand.

Klassenkonstruktoren
Sie erstellen ein Objekt, indem Sie einen Klassen-Konstruktor aufrufen. Ein Konstruktor ist eine Methode mit den folgenden Eigenschaften: Eine Konstruktormethode hat denselben Namen wie die Klasse und keinen deklarierten Datentyp. Beispiel: Ein einfacher Konstruktor fr die Klasse "Produkt" wrde wie folgt deklariert werden:
Produkt () {

66

Kapitel 3 Einfhrung in Java fr Datenbanken


...Konstruktorcode wird hier eingegeben... }

Wenn Sie keine Konstruktormethode in Ihre Klassendefinition aufnehmen, wird eine Standardmethode benutzt, die mit dem JavaBasisobjekt mitgeliefert wurde. Sie knnen mehr als einen Konstruktor fr jede Klasse mit unterschiedlichen Argumenttypen- und Argumentzahlen liefern. Beim Aufruf eines Konstruktors wird derjenige benutzt, der die richtige Argumentzahl und die passenden Argumenttypen aufweist.

Erklrung von Feldern


Es gibt zwei Kategorien von Java-Feldern:
Instanzfelder Jedes Objekt hat seine eigene Gruppe von Instanzfeldern,

die bei der Erstellung des Objekts geschaffen wurden. Sie enthalten Informationen, die speziell fr diese Instanz gelten. Beispiel: Ein Feld lineItem1Description in der Klasse "Invoice" enthlt die Beschreibung fr einen Rechnungsposten einer bestimmten Rechnung. Sie knnen auf Instanzfelder nur ber eine Objektreferenz zugreifen.
Klassenfelder Ein Klassenfeld enthlt Informationen, die von einer bestimmten Instanz unabhngig sind. Ein Klassenfeld wird erstellt, wenn die Klasse zum ersten Mal geladen wird, und es werden keine weiteren Instanzen geschaffen, gleichgltig wie viele Objekte erzeugt werden. Auf Klassenfelder kann ber den Klassennamen oder die Objektreferenz zugegriffen werden.

Um ein Feld in einer Klasse zu deklarieren, legen Sie seinen Typ fest und setzen danach seinen Namen und ein Semikolon. Um ein Klassenfeld zu erstellen, benutzen Sie das Java-Schlsselwort static in der Deklaration. Felder werden im Hauptteil einer Klasse, und nicht in einer Methode deklariert. Die Deklaration einer Variablen in einer Methode macht sie zu einem Teil der Methode, nicht der Klasse. Beispiele Die folgende Deklaration der Klasse "Invoice" hat vier Felder, die den Informationen entsprechen, welche auf zwei Buchungszeilen in einer Rechnung stehen knnten.

67

Ein Java-Seminar
public class Invoice { // Felder einer Rechnung mit Rechnungsdaten public String lineItem1Description; public int lineItem1Cost; public String lineItem2Description; public int lineItem2Cost; }

Erklrung von Methoden


Es gibt zwei Kategorien von Java-Methoden:
Instanzmethoden Eine totalSum-Methode in der Klasse "Invoice"

muss die Steuer ausrechnen und hinzuaddieren, damit alle Kosten enthalten sind. Sie ist aber nur sinnvoll, wenn Sie im Zusammenhang mit einem Invoice-Objekt aufgerufen wird, bei dem die einzelnen Rechnungsposten zustzliche Steuer- oder Kostenposten enthalten. Die Berechnung kann nur fr ein Objekt ausgefhrt werden, da das Objekt die beiden Rechnungszeilen enthlt, nicht die Klasse.
Klassenmethoden Klassenmethoden (auch als statische Methoden bekannt) knnen aufgerufen werden, ohne dass erst ein Objekt erstellt werden muss. Nur der Name der Klasse und der Methode sind erforderlich, um eine Klassenmethode aufzurufen.

hnlich wie bei Instanzmethoden akzeptieren die Klassenmethoden Argumente und Rckgabewerte. In der Regel fhren Klassenmethoden eine Art von Dienstprogramm oder Informationsfunktion aus, die mit der Allgemeinfunktion der Klasse in Beziehung stehen. Klassenmethoden knnen auf Instanzenfelder nicht zugreifen. Um eine Methode zu deklarieren, geben Sie ihren Rckgabetyp, ihren Namen und alle von ihr bernommenen Parameter an. Wie eine Klassendeklaration benutzt die Methode eine geffnete und geschlossene geschweifte Klammer, um den Hauptteil der Methode zu definieren, in den der Programmcode gesetzt wird.

68

Kapitel 3 Einfhrung in Java fr Datenbanken


public class Invoice { // Felder public String lineItem1Description; public double lineItem1Cost; public String lineItem2Description; public double lineItem2Cost; //Eine Methode public double totalSum() { double runningsum; runningsum = lineItem1Cost + lineItem2Cost; runningsum = runningsum * 1,16; return runningsum; } }

Im Hauptteil der Methode totalSum wird eine Variable namens runningsum deklariert. Sie wird zunchst verwendet, um die Zwischensumme der ersten und der zweiten Zeile aufzunehmen. Diese Zwischensumme wird dann mit 16 Prozent (z.B. Mehrwertsteuer) multipliziert, um die Gesamtsumme zu erhalten. Die lokale Variable (die im Hauptteil der Methode bekannt ist), wird dann an die aufrufende Funktion zurckgegeben. Wenn die Methode totalSum aufgerufen wird, gibt sie die Summe der zwei Zeilen plus die Steuer auf diese Summe zurck. Beispiel Die Methode parseInt der Klasse java.lang.Integer, die mit Adaptive Server Anywhere mitgeliefert wird, ist ein Beispiel fr eine Klassenmethode. Wenn ihr ein Zeichenfolgenargument bergeben wird, gibt die Methode parseInt eine Ganzzahl-Version der Zeichenfolge zurck. Beispiel: Gegeben sei der Zeichenfolgenwert "1". Die Methode parseInt gibt den Ganzzahlwert 1 zurck, ohne eine Instanz der Klasse java.lang.Integer erstellen zu mssen. Das Beispiel wird im nachstehenden Java-Codefragment veranschaulicht:
String num = "1"; int i = java.lang.Integer.parseInt( num );

Beispiel

Die folgende Version der Rechnungsklasse enthlt nun eine Instanzmethode und eine Klassenmethode. Die Klassenmethode namens rateOfTaxation gibt die Steuerrate zurck, die von der Klasse benutzt wird, um die Gesamtsumme der Rechnung zu kalkulieren.

69

Ein Java-Seminar
Dass die Methode rateOfTaxation zur Klassenmethode (und nicht zur Instanzmethode oder zu einem Feld) gemacht wurde, liegt darin, dass andere Klassen und Prozeduren den Wert benutzen knnen, der von dieser Methode zurckgegeben wird, ohne erst eine Instanz der Klasse erstellen zu mssen. Nur der Name der Klasse und der Methode sind erforderlich, um den Steuersatz auszugeben, der von dieser Klasse verwendet wird. Dadurch dass der Steuersatz rateOfTaxation zu einer Methode, und nicht zu einem Feld gemacht wird, kann der Anwendungsentwickler den Steuersatz ndern, ohne dass dies Auswirkungen auf Objekte, Anwendungen oder Prozeduren htte, die den Rckgabewert dieser Methode verwenden. Zuknftige Versionen der Klasse "Invoice" knnen den Rckgabewert der Klassenmethode rateOfTaxation auf einer komplizierteren Berechnung basieren lassen, ohne dass andere Methoden beeintrchtigt werden, die den Rckgabewert verwenden.
public class Invoice { // Felder public String lineItem1Description; public double lineItem1Cost; public String lineItem2Description; public double lineItem2Cost; // Eine Instanzenmethode public double totalSum() { double runningsum; double taxfactor = 1 + Invoice.rateOfTaxation(); runningsum = lineItem1Cost + lineItem2Cost; runningsum = runningsum * taxfactor; return runningsum; } // Eine Klassenmethode public static double rateOfTaxation() { double rate; rate = .16; return rate; } }

Objektorientierte und prozedurale Sprachen


Wenn Sie mehr Erfahrung mit prozeduralen Sprachen wie C oder der Sprache fr gespeicherte Prozeduren haben als mit objektorientierten Sprachen, finden Sie in diesem Abschnitt eine Errterung der hnlichkeiten und Unterschiede zwischen prozeduralen und objektorientierten Sprachen.

70

Kapitel 3 Einfhrung in Java fr Datenbanken

Java basiert auf Klassen

Die wichtigste strukturelle Einheit eines Codes in Java ist eine Klasse. Eine Java-Klasse ist im Prinzip eine Sammlung von Prozeduren und Variablen, die gruppiert wurden, weil sie alle zu einer bestimmten, identifizierbaren Kategorie gehren. Die Art und Weise, wie eine Klasse benutzt wird, unterscheidet aber die objektorientierten Sprachen von prozeduralen Sprachen. Eine in einer prozeduralen Sprache geschriebene Anwendung wird ausgefhrt, indem sie einmal in den Speicher geladen wird und eine genau vorgegebene Abwicklungsfolge einhlt. In objektorientierten Sprachen wie Java wird eine Klasse wie eine Vorlage benutzt: Eine Definition einer potenziellen Programmausfhrung. Mehrere Kopien der Klasse knnen je nach Anforderung erstellt und dynamisch geladen werden, wobei jede Instanz der Klasse eigene Daten, Werte und Ablaufprozeduren enthalten kann. Jede geladene Klasse wird unabhngig von anderen im Speicher geladenen Klassen behandelt und ausgefhrt. Eine Klasse, die zum Ausfhren in den Speicher geladen wurde, wird als instanziert bezeichnet. Eine instanzierte Klasse wird "Objekt" genannt: Dabei handelt es sich um eine Anwendung, die von der Klasse abgeleitet wurde, die vorbereitet wurde, um eindeutige Werte zu enthalten bzw. um zu bewirken, dass ihre Methoden unabhngig von anderen Klasseninstanzen ausgefhrt werden.

Ein Glossar der Java-Begriffe


Im folgenden Abschnitt werden einige Begriffe im Zusammenhang mit JavaKlassen erklrt. Dies ist natrlich keine erschpfende Behandlung der JavaSprache, sondern soll das Konzept der Java-Klassen in Adaptive Server Anywhere vorstellen.

$ Weitere Hinweise ber die Sprache Java finden Sie in der OnlineDokumentation Thinking in Java von Bruce Eckel. Sie gehrt zum Lieferumfang von Adaptive Server Anywhere, und Sie finden sie in der Datei Samples\ASA\Java\Tjava.pdf. Pakete Ein Paket ist eine Gruppe von Klassen, die einen gemeinsamen Zweck oder eine gemeinsame Kategorie haben. Ein Mitglied eines Pakets hat spezielle Berechtigungen fr den Zugriff auf Daten und Methoden bei anderen Mitgliedern des Pakets, und daher gibt es den Zugriffsmodifizierer protected.

71

Ein Java-Seminar
Ein Paket ist in Java das, was sonst unter einer Bibliothek oder Library bekannt ist. Es handelt sich dabei um eine Sammlung von Klassen, die mit der import-Anweisung verfgbar gemacht werden knnen. Die folgende Java-Anweisung importiert die Dienstprogramm-Bibliothek aus der JavaAPI:
import java.util.*

Pakete werden normalerweise in JAR-Dateien gespeichert, mit der Erweiterung .jar oder .zip. "Public" und "Private" Ein Zugriffsmodifizierer (im Wesentlichen die Schlsselwrter public, private oder protected vor jeder Deklaration) bestimmt die Sichtbarkeit eines Feldes, einer Methode oder einer Klasse fr andere Java-Objekte. Mit public bezeichnete Klassen, Methoden oder Felder sind berall sichtbar. Mit private bezeichnete Klassen, Methoden oder Felder sind nur in Methoden sichtbar, die in dieser Klasse definiert wurden. Mit protected bezeichnete Methoden oder Felder sind fr Methoden sichtbar, die innerhalb dieser Klasse, in Unterklassen dieser Klassen oder in anderen Klassen des selben Pakets definiert wurden. Die Standardsichtbarkeit (Paket) bedeutet, dass die Methoden oder Felder innerhalb der Klasse oder fr andere Klassen im Paket sichtbar sind.

Konstruktoren

Ein Konstruktor ist eine spezielle Methode einer Java-Klasse, die aufgerufen wird, wenn eine Instanz der Klasse erstellt wird. Klassen knnen ihre eigenen Konstruktoren definieren, darunter mehrfache, einander aufhebende Konstruktoren. Welcher Konstruktor verwendet wird, hngt davon ab, welche Argumente beim Versuch der Erstellung des Objekts verwendet wurden. Wenn der Typ, die Anzahl und die Reihenfolge der Argumente, die fr die Erstellung einer Instanz der Klasse verwendet werden, zu einem der Konstruktoren der Klasse passen, wird dieser Konstruktor verwendet, um das Objekt zu erstellen.

Sammlung der Abfalldaten

Die Abfalldatensammlung entfernt automatisch alle Objekte, fr die keine Referenzen bestehen, mit Ausnahme der Objekte, die als Werte in einer Tabelle gespeichert sind. In Java gibt es keine Destruktorenmethode wie in C++. Java-Klassen knnen ihre eigene Abschluss-Methode ("finalize") fr das Aufrumen definieren, nachdem ein Objekt nach der Abfalldatensammlung entfernt wurde.

72

Kapitel 3 Einfhrung in Java fr Datenbanken

Schnittstellen oder Interfaces

Java-Klassen knnen nur von einer Klasse erben. Java benutzt Interfaces (Schnittstellen) anstelle von mehrfacher Vererbung. Eine Klasse kann mehrere Schnittstellen implementieren. Jede Schnittstelle definiert eine Reihe von Methoden und Methodenprofilen, die von der Klasse implementiert werden mssen, damit die Klasse kompiliert werden kann. Eine Schnittstelle definiert, welche Methoden und statischen Felder die Klasse deklarieren muss. Die Implementierung der Methoden und Felder, die in einer Schnittstelle deklariert werden, erfolgt in der Klasse, die die Schnittstelle benutzt: Die Schnittstelle definiert, was die Klasse deklarieren muss, und es obliegt der Klasse, festzulegen, wie die Implementierung vor sich geht.

Fehlerbehandlung in Java
Der Fehlerbehandlungscode ist in Java von der normalen Verarbeitung getrennt. Fehler generieren ein Ausnahmebedingungsobjekt, das den Fehler darstellt. Dies wird als throwing an exception (Ausnahmefehler auslsen) bezeichnet. Eine ausgelste Ausnahmebedingung beendet ein Java-Programm, wenn sie nicht in der Anwendung abgefangen und entsprechend verarbeitet wird. Sowohl Java-API-Klassen, als auch benutzerdefinierte Klassen knnen einen Ausnahmefehler auswerfen. Benutzer knnen ihre eigenen Ausnahmeklassen erstellen, die ihre eigenen benutzerdefinierten Klassen auswerfen knnen. Wenn im Hauptteil der Methode, in der der Ausnahmefehler auftrat, keine Ausnahmeroutine vorgesehen ist, wird die Suche nach einer Ausnahmeroutine ber den kompletten Aufrufstack fortgesetzt. Wenn die Spitze des Aufrufstacks erreicht ist und noch immer keine Ausnahmeroutine gefunden wurde, wird die Standard-Ausnahmeroutine des Java-Interpreters aufgerufen und das Programm beendet. In Adaptive Server Anywhere gilt: Wenn eine SQL-Anweisung eine JavaMethode aufruft, wird ein SQL-Fehler generiert. Fehlertypen in Java Alle Fehler in Java werden aus zwei Arten von Fehlerklassen abgeleitet: Ausnahme (Exception) und Fehler (Error). Normalerweise werden Fehler vom Typ "Exception" durch Fehlerroutinen im Hauptteil der Methode verarbeitet. Fehler vom Typ "Error" sind fr interne Fehler und Fehlerbedingungen wegen Ressourcenmangel im Java-Laufzeitsystem vorgesehen. Ausnahmebedingungsfehler werden ausgeworfen und abgefangen. Die Verarbeitungsroutinen bei Ausnahmefehlern werden durch die Codeblcke try, catch und finally gekennzeichnet. 73

Ein Java-Seminar
Ein try-Block fhrt einen Programmcode aus, der einen Fehler generieren kann. Ein catch-Block ist ein Codeteil, der ausgefhrt wird, wenn ein Fehler whrend der Ausfhrung eines try-Blocks generiert (ausgeworfen) wird. Ein finally-Block definiert einen Codeblock, der unabhngig davon ausgefhrt wird, ob ein Fehler generiert und abgefangen wurde. Typischerweise wird er fr Aufrumroutinen verwendet. Er wird fr Code benutzt, der unter keinen Umstnden ausgelassen werden darf. Ausnahmebedingungsfehler werden in zwei Typen unterteilt: Laufzeitfehler und Nicht-Laufzeitfehler. Fehler, die vom Laufzeitsystem generiert wurden, sind als implizite Ausnahmefehler bekannt, da sie nicht explizit als Teil jeder Klassen- oder Methodendeklaration verarbeitet werden mssen. Beispiel: Der Ausnahmefehler "array out of bounds" kann auftreten, wenn ein Array benutzt wird, der Fehler muss aber nicht Teil der Deklaration der Klasse oder Methode sein, die dieses Array benutzen. Alle anderen Ausnahmebedingungen sind explizit. Wenn die aufgerufene Methode einen Ausnahmefehler auswerfen kann, muss der Fehler explizit von der Klasse abgefangen werden, die die Auswurfmethode fr den Fehler benutzt, oder diese Klasse muss explizit den Fehler selbst auswerfen, indem die Ausnahmebedingung, die generiert werden knnte, in ihrer Klassendeklaration identifiziert wird. Im Wesentlichen heit das: Explizite Ausnahmebedingungen mssen explizit behandelt werden. Eine Methode muss alle expliziten Fehler deklarieren, die sie auswirft, oder alle expliziten Fehler abfangen, die mglicherweise ausgeworfen werden. Nicht-Laufzeitfehler werden zum Kompilierungszeitpunkt geprft. Laufzeitfehler werden normalerweise durch Programmierungsfehler verursacht. Java erkennt viele dieser Fehler whrend der Kompilierung, bevor der Code ausgefhrt wird. Fr jede Java-Methode wird ein alternativer Ausfhrungspfad definiert, sodass alle Java-Methoden abgeschlossen werden knnen, auch wenn der normale Abschluss nicht mglich ist. Wenn der Typ des ausgeworfenen Fehlers nicht erfasst ist, wird er an den nchsten Code-Block oder die nchste Methode im Stack weitergereicht.

74

Kapitel 3 Einfhrung in Java fr Datenbanken

Die Laufzeitumgebung fr Java in der Datenbank


In diesem Abschnitt wird die Sybase-Laufzeitumgebung fr Java beschrieben, und wie sie sich von einer Standard-Java-Laufzeitumgebung unterscheidet.

Untersttzte Versionen von Java und JDBC


Die Sybase Java VM bietet die Auswahl zwischen den Programmierschnittstellen JDK 1.1, JDK 1.2, und JDK 1.3. Die tatschlich gelieferte Version ist JDK 1.1.8. und 1.3. Zwischen Version 1.0 des JDK und Version 1.1 wurden einige neue APIs eingefhrt. Auerdem wurden einige APIs entfernt. Die Verwendung bestimmter APIs wird nicht lnger empfohlen, und die Untersttzung dieser APIs knnte in kommenden Versionen nicht mehr gesichert sein. Eine Java-Klassendatei, die nicht mehr empfohlene API verwendet, generiert beim Kompilieren eine Warnung, kann aber auf einer Java Virtual Machine ausgefhrt werden, die gem den Standards der Version 1.1 programmiert wurde, wie z.B. der Sybase VM. Der interne JDBC-Treiber untersttzt JDBC Version 2.

$ Weitere Hinweise zu den untersttzten JDK APIs finden Sie unter


"Untersttzte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch.

$ Hinweise zum Erstellen einer Datenbank, die Java untersttzt, finden


Sie unter "Datenbank fr Java aktivieren" auf Seite 97.

Die Laufzeit-Java-Klassen
Die Laufzeit-Java-Klassen sind die Klassen der niedrigen Stufe, die fr eine Datenbank verfgbar gemacht werden, wenn Sie erstellt oder fr Java aktiviert wird. Diese Klassen enthalten eine Teilmenge der Java-API. Diese Klassen sind Teil des Sun Java Development Kit. Die Laufzeit-Klassen bieten Funktionen, auf denen Anwendungen aufbauen knnen. Die Laufzeit-Klassen sind fr Klassen in der Datenbank immer verfgbar.

75

Die Laufzeitumgebung fr Java in der Datenbank


Sie knnen die Laufzeit-Java-Klassen in Ihre eigenen benutzerdefinierten Klassen einbeziehen: Entweder, indem sie deren Funktionen erben oder indem Sie sie bei einer Berechnung oder einem Vorgang in einer Methode verwenden. Beispiele Einige Java-API-Klassen, die in den Laufzeit-Java-Klassen enthalten sind:
Primitive Java-Datentypen Alle "primitiven" (nativen) Datentypen in Java haben eine entsprechende Klasse. Um Objekte dieser Typen zu erstellen, haben die Klassen zustzliche, oft sehr ntzliche Funktionen.

Der Java-Datentyp int hat eine entsprechende Klasse in java.lang.Integer.


Das Dienstprogramm-Paket Das Paket java.util.* enthlt eine Reihe

von sehr hilfreichen Klassen, deren Funktionen keine Entsprechung in den SQL-Funktionen haben, welche in Adaptive Server Anywhere verfgbar sind. Zu diesen Klassen gehren:
Hashtable Eine Zuordnung von Schlsseln und Werten. StringTokenizer Diese Klasse zerlegt eine Zeichenfolge in

Einzelwrter.
Vector Diese Klasse enthlt ein Array von Objekten, deren Gre sich dynamisch ndern kann. Stack Diese Klasse enthlt einen Last-in-First-out-Stack von Objekten.

JDBC fr SQL-Vorgnge Das Paket java.SQL.* enthlt die Klassen die

von Java-Objekten bentigt werden, um Daten mit SQL-Anweisungen aus der Datenbank zu extrahieren. Anders als benutzerdefinierte Klassen werden die Laufzeitklassen in der Datenbank nicht gespeichert. Sie werden vielmehr im Unterverzeichnis java des Adaptive Server Anywhere-Installationsverzeichnisses gespeichert.

Benutzerdefinierte Klassen
Benutzerdefinierte Klassen werden in einer Datenbank mit der Anweisung INSTALL installiert. Nach ihrer Installation stehen sie anderen Klassen in der Datenbank zur Verfgung. Wenn es sich um ffentliche Klassen handelt, stehen Sie fr SQL als Domnen zur Verfgung.

$ Hinweise zur Installation von Klassen finden Sie unter "Java-Klassen in


einer Datenbank installieren" auf Seite 103.

76

Kapitel 3 Einfhrung in Java fr Datenbanken

Java-Methoden und Felder identifizieren


Der Punkt in SQL In SQL-Anweisungen identifiziert der Punkt Spalten von Tabellen, wie zum Beispiel in der folgenden Abfrage:
SELECT employee.emp_id FROM employee

Der Punkt kennzeichnet auch die Eigentmerschaft in qualifizierten Objektnamen:


SELECT emp_id FROM DBA.employee

Der Punkt in Java

In Java ist der Punkt ein Operator, der die Methoden aufruft oder auf die Felder einer Java-Klasse oder eines Java-Objekts zugreift. Er ist auch Teil eines Bezeichners, der benutzt wird, um Klassennamen zu kennzeichnen, wie im voll qualifizierten Klassennamen java.util.Hashtable. Im nachstehenden Java-Codefragment ist der Punkt in der ersten Zeile ein Bezeichner. In der zweiten Zeile des Programmcodes ist er ein Operator.
java.util.Random rnd = new java.util.Random(); int i = rnd.nextInt();

Aufruf von JavaMethoden aus SQL

In SQL kann der Punktoperator durch eine doppelte geschlossene spitze Klammer (>>) ersetzt werden. Der Punktoperator ist fr Java passender, kann aber bei bestehenden SQL-Namen zu Verwechslungen fhren. Die Verwendung von >> beseitigt diese Zweideutigkeit.
>> 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. In einer Java-Klasse ist die doppelte geschlossene spitze Klammer kein Ersatz fr den Punktoperator und hat eine vollstndig andere Bedeutung in ihrer Rolle als rechter Bitverschiebungs-Operator. Die folgende SQL-Anweisungsfolge ist beispielsweise gltig:
CREATE VARIABLE rnd java.util.Random; SET rnd = NEW java.util.Random(); SELECT rnd>>nextInt();

Das Ergebnis der SELECT-Anweisung ist eine zufallsgenerierte Ganzzahl. Unter Verwendung der Variablen, die im vorhergehenden SQL-Beispiel erstellt wurde, zeigt die folgende SQL-Anweisung die richtige Verwendung einer Klassenmethode:
SELECT java.lang.Math>>abs( rnd>>nextInt() );

77

Die Laufzeitumgebung fr Java in der Datenbank

Java bercksichtigt Gro/Kleinschreibung


Java-Syntax funktioniert so, wie Sie es von ihr erwarten, und SQL-Syntax wird durch das Vorhandensein von Java-Klassen nicht verndert. Dies bleibt auch so, wenn dieselbe SQL-Anweisung sowohl Java, als auch SQL-Syntax enthlt. Dies ist eine einfache Feststellung, aber mit weit reichenden Auswirkungen. Java bercksichtigt die Gro/Kleinschreibung. Die Java-Klasse FindOut ist nicht dasselbe wie die Klasse Findout. SQL bercksichtigt die Gro-/Kleinschreibung bei Schlsselwrtern und Bezeichnern nicht. Die Bercksichtigung von Gro-/Kleinschreibung durch Java wird auch beibehalten, wenn der Java-Code in eine SQL-Anweisung eingebettet ist, die die Gro-/Kleinschreibung nicht bercksichtigt. Die Java-Teile der Anweisung mssen die Gro/Kleinschreibung bercksichtigen, auch wenn die Teile vor und nach der Java-Syntax ohne Bercksichtigung der Schreibweise programmiert werden knnen. Beispielsweise werden die nachstehenden SQL-Anweisungen erfolgreich ausgefhrt, da die Schreibweise der Java-Objekte, Klassen und Operatoren respektiert wird, auch wenn im restlichen Teil der SQL-Anweisung die Gro-/Kleinschreibung nicht einheitlich ist.
SeLeCt java.lang.Math.random();

Datentypen

Wenn eine Java-Klasse als Datentyp fr eine Spalte verwendet wird, erfolgt dies in Form eines benutzerdefinierten SQL-Datentyps. Trotzdem wird die Gro/Kleinschreibung immer bercksichtigt. Diese Konvention verhindert Zweideutigkeiten mit Java-Klassen, die sich nur durch die Gro-/Kleinschreibung voneinander unterscheiden.

Zeichenfolgen in Java und SQL


Mit Anfhrungszeichen werden Zeichenfolgenliterale in Java gekennzeichnet, wie im folgenden Java-Programmfragment gezeigt wird:
String str = "Dies ist eine Zeichenfolge"

In SQL werden Zeichenfolgen hingegen mit Apostrophen gekennzeichnet, und Anfhrungszeichen kennzeichnen einen Bezeichner, wie in der folgenden SQL-Anweisung:
INSERT INTO TABLE DBA.t1 VALUES( Hallo )

In Java-Quellcode mssen Sie immer Anfhrungszeichen verwenden, in SQL-Anweisungen hingegen Apostrophe. Die folgenden SQL-Anweisungen sind beispielsweise gltig. 78

Kapitel 3 Einfhrung in Java fr Datenbanken


CREATE VARIABLE str char(20); set str = new java.lang.String( Brandneues Objekt )

Das folgende Java-Codefragment ist auch gltig, wenn es in einer JavaKlasse verwendet wird.
String str = new java.lang.String( "Brandneues Objekt" );

Ausgabe in die Befehlszeile


Die Ausgabe in die Standardausgabe ist eine Technik fr die schnelle Prfung von Variablenwerten und Ausfhrungsergebnissen an bestimmten Stellen im Programmcode. Bei Erkennung der Methode in der zweiten Zeile des folgenden Java-Codefragments wird das Zeichenfolgenargument, das von der Methode akzeptiert wird, in die Standardausgabe geschrieben.
String str = "Hallo Welt"; System.out.println( str );

In Adaptive Server Anywhere ist das Serverfenster die Standardausgabe, so dass die Zeichenfolge dort erscheint. Die Ausfhrung 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 enthlt, die zur folgenden Deklaration passt, wird sie von den meisten Java-Laufzeitumgebungen, wie zum Beispiel vom Sun Java-Interpreter, automatisch ausgefhrt. Normalerweise wird diese statische Methode nur ausgefhrt, wenn sie die Klasse ist, die vom JavaInterpreter aufgerufen wurde.
public static void main( String args[ ] ) { }

Die Hauptklasse ist eine ntzliche Klasse fr das Austesten der Funktionen von Java-Objekten: Sie knnen immer sicher sein, dass diese Methode als erste aufgerufen wird, wenn Sie das Sun Java Laufzeitsystem starten. In Adaptive Server Anywhere ist das Java-Laufzeitsystem jederzeit verfgbar. Die Funktionen der Objekte und Methoden knnen mit SQLAnweisungen unmittelbar und dynamisch getestet werden. In vielerlei Hinsicht ist diese Methode fr das Testen von Java-Klassen-Funktionen viel flexibler.

79

Die Laufzeitumgebung fr Java in der Datenbank

Bereich und Dauerhaftigkeit (Persistenz)


SQL-Variable sind nur so dauerhaft wie die Verbindung. Dies ist nicht anders als bei frheren Versionen von Adaptive Server Anywhere und wird auch nicht davon berhrt, ob die Variable eine Java-Klasse oder ein nativer SQL-Datentyp ist. Die Dauerhaftigkeit (oder "Persistenz") von Java-Klassen entspricht der der Tabellen in einer Datenbank: Tabellen existieren in einer Datenbank so lange, bis sie gelscht werden, gleichgltig ob sie Daten enthalten oder niemals benutzt werden. Java-Klassen, die in einer Datenbank installiert wurden, sind hnlich: Man kann sie benutzen, bis sie explizit durch eine REMOVE-Anweisung entfernt werden.

$ Weitere Hinweise zum Entfernen von Klassen finden Sie unter


"REMOVE-Anweisung" auf Seite 547 der Dokumentation ASA SQLReferenzhandbuch. Eine Klassenmethode in einer installierten Java-Klasse kann jederzeit aus einer SQL-Anweisung aufgerufen werden. Sie knnen die folgende Anweisung berall ausfhren, wo Sie SQL-Anweisungen ausfhren knnen.
Select java.lang.Math.abs(-342)

Ein Java-Objekt ist nur in zwei Formen verfgbar: als Wert einer Variablen oder als Wert in einer Tabelle.

Java-Escapezeichen in SQL-Anweisungen
Im Java-Programmcode knnen Sie Escapezeichen verwenden, um bestimmte Sonderzeichen in Zeichenfolgen einzufgen. Ein Beispiel ist der folgende Programmcode, der ein Zeichen fr Neue Zeile und ein Tabulatorzeichen vor einem Satz einfhrt, der ein Apostroph enthlt.
String str = "\n\t\Eine Zeichenfolge ist\s, die mir fehlt";

Die Verwendung von Java-Escapezeichen ist im Adaptive Server Anywhere nur erlaubt, wenn sie von Java-Klassen benutzt werden. Aus SQL mssen hingegen die Regeln befolgt werden, die fr Zeichenfolgen in SQL gelten: Beispiel: Um einen Zeichenfolgenwert an ein Feld zu bergeben, das eine SQL-Anweisung benutzt, kann folgende Anweisung benutzt werden, das Java-Escapezeichen hingegen nicht.
set obj.str = \nDie Zeichenfolge ists, die fehlte!;

$ Weitere Hinweise ber die Regeln fr SQL-Zeichenfolgen finden Sie


unter "Zeichenfolgen" auf Seite 10 der Dokumentation ASA SQLReferenzhandbuch. 80

Kapitel 3 Einfhrung in Java fr Datenbanken

Schlsselwortkonflikte
SQL-Schlsselwrter knnen im Konflikt mit Namen von Java-Klassen, einschlielich API-Klassen stehen. Dies tritt ein, wenn der Name einer Klasse, wie z.B. der Klasse "Date", die ein Teil des Pakets java.util.* ist, referenziert wird. SQL reserviert das Wort Date fr den Einsatz als Schlsselwort, auch wenn es gleichzeitig der Name einer Java-Klasse ist. Wenn solche Zweideutigkeiten auftreten, knnen Sie Anfhrungszeichen verwenden, um anzuzeigen, dass Sie das betreffende Wort nicht mehr als fr SQL reserviertes Wort verwenden. Beispiel: Die folgende SQL-Anweisung verursacht einen Fehler, da "Date" ein Schlsselwort und seine Verwendung fr SQL reserviert ist.
-- Diese Anweisung ist unzulssig CREATE VARIABLE dt java.util.Date

Die folgenden beiden Anweisungen funktionieren hingegen richtig, weil das Wort "Date" in Anfhrungszeichen steht.
CREATE VARIABLE dt java.util."Date"; SET dt = NEW java.util."Date"(1997, 11, 22, 16, 11, 01)

Die Variable dt enthlt jetzt das Datum: November 22, 1997, 4:11 p.m.

Import-Anweisungen verwenden
Es ist allgemein blich, in einer Java-Klassen-Deklaration eine ImportAnweisung fr den Zugriff auf andere, externe Klassen einzubeziehen. Sie knnen importierte Klassen mit unqualifizierten Klassennamen referenzieren. Beispiel: Sie knnen die Stack-Klasse des Pakets java.util auf zwei Arten referenzieren: Explizit mit dem Namen java.util.Stack Oder mit dem Namen Stack, und Einschluss der folgenden ImportAnweisung:
import java.util.*;

Die Klassen weiter oben in der Hierarchie mssen ebenfalls installiert sein.

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.

81

Die Laufzeitumgebung fr Java in der Datenbank


Die Import-Anweisung funktioniert in kompilierten Klassen wie beabsichtigt. In der Laufzeitumgebung von Adaptive Server Anywhere gibt es allerdings keine der Import-Anweisung gleichwertige Anweisung. Alle Klassennamen, die in SQL-Anweisungen oder in gespeicherten Prozeduren verwendet werden, mssen voll qualifiziert sein. Beispiel: Um eine Variable des Typs "Zeichenfolge" zu erstellen, wird diese Klasse mit dem voll qualifizierten Namen referenziert: java.lang.String.

CLASSPATH-Variable verwenden
Die Java-Laufzeitumgebung von Sun und der Sun JDK Java Compiler benutzen die classpath-Umgebungsvariable, um Klassen zu ermitteln, die im Java-Programmcode angesprochen werden. Eine classpath-Variable stellt eine Verbindung zwischen dem Java-Programmcode und dem tatschlichen Dateipfad oder dem URL der referenzierten Klassen her. Zum Beispiel knnen mit import java.io.* alle Klassen im Paket java.io ohne voll qualifizierten Namen referenziert werden. Nur der Klassenname ist im folgenden Java-Code erforderlich, um Klassen aus dem Paket java.io zu verwenden. Die Umgebungsvariable classpath auf dem System, in dem die Java-Klassendeklaration kompiliert werden soll, muss den Standort des JavaVerzeichnisses, also des Stammverzeichnisses des Pakets java.io, enthalten. CLASSPATH whrend der Laufzeit ignoriert CLASSPATH zur Installation von Klassen Die Umgebungsvariable classpath beeintrchtigt die Laufzeitumgebung von Adaptive Server Anywhere fr Java nicht whrend des Ausfhrens von JavaVorgngen, da die Klassen in der Datenbank, und nicht in externen Dateien oder Archiven gespeichert sind. Die Variable classpath kann jedoch verwendet werden, um den Standort einer Datei whrend der Installation von Klassen zu ermitteln. Beispiel: Die folgende Anweisung installiert eine benutzererstellte Java-Klasse in der Datenbank, gibt aber nur den Namen der Datei an, nicht ihren vollen Suchpfad plus Namen. (Beachten Sie, dass in dieser Anweisung keine JavaVorgnge enthalten sind.)
INSTALL JAVA NEW FROM FILE Invoice.class

Wenn die angegebene Datei in einem Verzeichnis oder in einer ZIP-Datei liegt, die von der Umgebungsvariablen classpath definiert wurden, findet Adaptive Server Anywhere die Datei und installiert die Klasse.

82

Kapitel 3 Einfhrung in Java fr Datenbanken

ffentliche Felder
Beim objektorientierten Programmieren ist es allgemein blich, Klassenfelder als "private" zu definieren und ihre Werte nur ber ffentliche Methoden verfgbar zu machen. Viele Beispiele, die in dieser Dokumentation verwendet werden, geben Felder als "public" an, sodass die Beispiele kompakter und leichter zu lesen sind. Die Verwendung ffentlicher Felder in Adaptive Server Anywhere bietet Performancevorteile gegenber der Verwendung ffentlicher Methoden. Die in dieser Dokumentation allgemein eingehaltene Konvention besteht darin, dass eine benutzererstellte Java-Klasse, die fr den Einsatz in Adaptive Server Anywhere gedacht ist, ihre Hauptwerte in ihren Feldern auswirft. Methoden enthalten Berechnungsautomation und Logik, die mit diesen Feldern arbeiten.

83

Praktische Einfhrung: Eine bung mit Java in der Datenbank

Praktische Einfhrung: Eine bung mit Java in der Datenbank


Diese praktische Einfhrung soll die Grundlagen fr den Aufruf von JavaVorgngen mit Java-Klassen und Objekten ber SQL-Anweisungen vermitteln. Es wird beschrieben, wie Java-Klassen in der Datenbank installiert werden. Darber hinaus wird beschrieben, wie auf die Klasse und ihre Mitglieder und Methoden von SQL-Anweisungen aus zugegriffen wird. In der praktischen Einfhrung wird die in "Ein Java-Seminar" auf Seite 64 erstellte Klasse verwendet. Anforderungen Die praktische Einfhrung geht davon aus, dass Java in der DatenbankSoftware installiert wurde. Auerdem wird vorausgesetzt, dass Sie ein Java Development Kit (JDK) installiert haben, einschlielich dem Java Compiler (javac). Quellcode und Anweisungsfolgen fr dieses Beispiel finden Sie im Verzeichnis Samples\ASA\JavaInvoice in Ihrem SQL AnywhereVerzeichnis.

Ressourcen

Beispiel-Java-Klasse erstellen und kompilieren


Der erste Schritt besteht darin, den Java-Code zu schreiben und zu kompilieren. Dies geschieht auerhalb der Datenbank.
v So wird die Klasse erstellt und kompiliert:

Erstellen Sie eine Datei mit dem Namen Invoice.java mit dem folgenden Code:

84

Kapitel 3 Einfhrung in Java fr Datenbanken


public class Invoice { // Felder public String lineItem1Description; public double lineItem1Cost; public String lineItem2Description; public double lineItem2Cost; // Eine Instanzmethode public double totalSum() { double runningsum; double taxfactor = 1 + Invoice.rateOfTaxation(); runningsum = lineItem1Cost + lineItem2Cost; runningsum = runningsum * taxfactor; return runningsum; } // Eine Klassenmethode public static double rateOfTaxation() { double rate; rate = .15; return rate; } }

Den Quellcode fr diese Klasse finden Sie in der Datei Samples\ASA\JavaInvoice\Invoice.java in Ihrem SQL AnywhereVerzeichnis. 2 Kompilieren Sie die Datei, damit die Datei Invoice.class erstellt wird. Fhren Sie von der Befehlszeile im selben Verzeichnis wie Invoice.java den folgenden Befehl aus.
javac *.java

Die Klasse ist jetzt kompiliert und kann in der Datenbank installiert werden.

Beispiel-Java-Klasse installieren
Java-Klassen knnen erst verwendet werden, nachdem sie in einer Datenbank installiert wurden. Sie knnen Java-Klassen aus Sybase Central oder Interactive SQL installieren. Dieser Abschnitt enthlt Anweisungen fr beide Mglichkeiten. Whlen Sie selbst.

85

Praktische Einfhrung: 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. ffnen Sie den Ordner "Java-Objekte" und doppelklicken Sie auf "JavaKlasse hinzufgen". Der Assistent fr die Erstellung von Java-Klassen wird angezeigt. Klicken Sie auf die Schaltflche "Durchsuchen" und wechseln Sie zur Klasse Invoice.class im Unterverzeichnis Samples\ASA\JavaInvoice in Ihrem Installationsverzeichnis von SQL Anywhere. Klicken Sie auf "Fertig stellen", damit der Assistent geschlossen wird.

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. Geben Sie im Fensterausschnitt "SQL-Anweisungen" in Interactive SQL den folgenden Befehl ein.
INSTALL JAVA NEW FROM FILE Suchpfad\\samples\\ASA\\JavaInvoice\\Invoice.class

wobei Suchpfad Ihr SQL Anywhere-Verzeichnis ist. Die Klasse ist jetzt in der Beispieldatenbank installiert. Hinweise Bis jetzt haben in der Datenbank keine Java-Vorgnge stattgefunden. Die Klasse wurde in der Datenbank installiert. Sie kann nun als Datentyp einer Variablen oder Spalte in einer Tabelle verwendet werden. In einer Klassendatei durchgefhrte nderungen werden nicht automatisch auch in die Kopie der Klasse in der Datenbank bertragen. Sie mssen die Klassen neu installieren, wenn die nderungen wiedergegeben werden sollen.

$ Weitere Hinweise zur Installation der Klassen und zur Aktualisierung


einer installierten Klasse finden Sie unter "Java-Klassen in einer Datenbank installieren" auf Seite 103.

86

Kapitel 3 Einfhrung in Java fr Datenbanken

SQL-Variable vom Typ "Invoice" erstellen


In diesem Abschnitt wird eine SQL-Variable erstellt, die sich auf ein JavaObjekt vom Typ Invoice bezieht.
Bercksichtigung von Gro-/Kleinschreibung

Java bercksichtigt die Gro/Kleinschreibung, sodass die Teile der nachstehenden Beispiele, die Java-Syntax beinhalten, genauso geschrieben werden mssen wie gezeigt. Die SQL-Syntax wird mit Grobuchstaben geschrieben. 1 Fhren Sie von Interactive SQL aus die folgende Anweisung aus und erstellen Sie eine SQL-Variable mit dem Namen Inv vom Typ Invoice, wobei Invoice die Java-Klasse ist, die Sie in der Datenbank installiert haben:
CREATE VARIABLE Inv Invoice

Nach dem Erstellen einer Variablen kann ihr erst dann ein Wert zugewiesen werden, wenn Datentyp und deklarierter Datentyp identisch sind oder wenn der Wert eine Unterklasse des deklarierten Datentyps ist. Im vorliegenden Fall kann die Variable Inv nur eine Referenz auf ein Objekt des Typs Invoice oder eine Unterklasse von Invoice enthalten. Anfangs ist die Variable Inv gleich NULL, weil kein Wert an sie weitergeleitet wurde. 2 Fhren Sie die folgende Anweisung aus, damit der aktuelle Wert der Variablen Inv identifiziert wird.
select IfNull(Inv, Kein Objekt referenziert, 'Variable ist nicht null: enthlt eine Objektreferenz')

Die Variable referenziert derzeit kein Objekt. 3 Weisen Sie Inv einen Wert zu. Sie mssen die Klasse Invoice mit dem Schlsselwort NEW instanzieren.
SET Inv = NEW Invoice();

Die Variable Inv hat jetzt eine Referenz auf das Java-Objekt. Zur berprfung knnen Sie die Anweisung aus Schritt 2 ausfhren. Die Variable Inv enthlt eine Referenz auf ein Java-Objekt vom Typ Invoice. Mit dieser Referenz knnen Sie auf viele Felder des Objekts zugreifen oder eine ihrer Methoden aufrufen.

87

Praktische Einfhrung: 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 enthlt, knnen den Feldern des Objekts Werte bergeben werden, und ihre Methoden sind aufrufbar. Beispiel: Eine Variable vom Typ "Invoice", die Sie im vorigen Abschnitt erstellt haben, enthlt eine Referenz auf ein Objekt Invoice und hat vier Felder, deren Werte durch SQL-Anweisungen festgelegt werden knnen.
v So greifen Sie auf die Felder des Objekts "Invoice" zu:

Fhren Sie von Interactive SQL die folgenden SQL-Anweisungen aus, damit die Feldwerte fr die Variable Inv gesetzt werden.
SET Inv.lineItem1Description = Gummistiefel; SET Inv.lineItem1Cost = 79.99; SET Inv.lineItem2Description = Heugabel; SET Inv.lineItem2Cost = 37.49;

Jede der oben stehenden SQL-Anweisungen gibt einen Wert an ein Feld im Java-Objekt weiter, das durch Inv referenziert wird. 2 Fhren Sie SELECT-Anweisungen mit der Variablen aus. Jede nachstehende SQL-Anweisung gibt den aktuellen Wert eines Feldes im Java-Objekt zurck, das von Inv referenziert wird.
SELECT Inv.lineItem1Description; SELECT Inv.lineItem1Cost; SELECT Inv.lineItem2Description; SELECT Inv.lineItem2Cost;

Verwenden Sie ein Feld der Variablen Inv in einem SQL-Ausdruck. Fhren Sie die folgende SQL-Anweisung aus und lassen Sie die obigen SQL-Anweisungen ausfhren.
SELECT * FROM PRODUCT WHERE unit_price < Inv.lineItem2Cost;

Zustzlich zu den ffentlichen Feldern hat die Klasse Invoice eine Instanzmethode, die Sie aufrufen knnen.
v So rufen Sie die Methoden des Objekts "Invoice" auf:

Fhren Sie von Interactive SQL aus die folgende SQL-Anweisung aus, die die Methode totalSum() des Objekts aufruft, das von der Variablen Inv referenziert wird. Sie gibt die Summe der beiden Kostenfelder plus der Steuer zurck.

88

Kapitel 3 Einfhrung in Java fr Datenbanken


SELECT Inv.totalSum();

Methoden aufrufen und Felder referenzieren

Hinter Methodennamen stehen immer Klammern, auch wenn sie keine Argumente annehmen. Nach Feldnamen stehen keine Klammern. Die Methode totalSum() akzeptiert keine Argumente, sondern gibt einen Wert zurck. Die Klammern werden verwendet, da eine Java-Operation aufgerufen wird, obwohl die Methode keine Argumente annimmt. Bei Java in der Datenbank ist der direkte Feldzugriff schneller als der Aufruf von Methoden. Fr den Zugriff auf ein Feld ist der Aufruf der Java VM nicht erforderlich, whrend fr eine Methode die VM bentigt wird, um die Methode auszufhren. Wie in der am Anfang dieses Kapitels beschriebenen InvoiceKlassendefinition gezeigt, nutzt die totalSum-Instanzenmethode die Klassenmethode rateOfTaxation. Auf diese Klassenmethode kann direkt aus einer SQL-Anweisung zugegriffen werden.
SELECT Invoice.rateOfTaxation();

Beachten Sie, dass der Name der Klasse verwendet wird, und nicht der Name einer Variablen, die eine Referenz auf ein Invoice-Objekt enthlt. Dies stimmt mit der Art berein, wie Java Klassenmethoden verarbeitet, auch wenn sie in SQL-Anweisungen verwendet werden. Eine Klassenmethode kann aufgerufen werden, auch wenn kein auf dieser Klasse basierendes Objekt instanziert wurde. Klassenmethoden bentigen keine Instanz der Klasse, um richtig zu funktionieren, knnen aber immer noch fr ein Objekt aufgerufen werden. Die folgende SQL-Anweisung bringt dieselben Ergebnisse wie die vorher ausgefhrte SQL-Anweisung.
SELECT Inv.rateOfTaxation();

Java-Objekte in Tabellen speichern


Wenn eine Klasse in einer Datenbank installiert wird, steht sie als neuer Datentyp zur Verfgung. Spalten in einer Tabelle knnen den Typ Javaclass haben, wobei Javaclass der Name einer installierten ffentlichen Java-Klasse ist. Dann knnen Sie ein Java-Objekt erstellen und es als Wert einer Spalte in eine Tabelle einfgen.
v So wird die Klasse "Invoice" in einer Tabelle verwendet:

Tabelle mit einer Spalte vom Typ Invoice erstellen. Fhren Sie von Interactive SQL die folgende SQL-Anweisung aus. 89

Praktische Einfhrung: Eine bung mit Java in der Datenbank


CREATE TABLE T1 ( ID int, JCol Invoice );

Die Spalte namens JCol akzeptiert nur Objekte des Typs Invoice oder einer ihrer Unterklassen. 2 Fhren Sie mit der Variablen Inv, die eine Referenz auf ein Java-Objekt vom Typ Invoice enthlt, die folgende SQL-Anweisung aus, damit der Tabelle T1 eine Zeile hinzugefgt wird.
INSERT INTO T1 VALUES( 1, Inv );

Sobald ein Objekt der Tabelle T1 hinzugefgt wurde, knnen Sie Auswahlanweisungen benutzen, die die Felder und Methoden der Objekte in der Tabelle einbeziehen. 3 Fhren Sie die folgende SQL-Anweisung aus, die den Wert des Feldes ineItem1Description fr alle Objekte in der Tabelle T1 zurck (derzeit sollte nur ein Objekt in der Tabelle sein).
SELECT ID, JCol.lineItem1Description FROM T1;

Sie knnen hnliche Auswahlanweisungen ausfhren, die andere Felder und Methoden des Objekts einbeziehen. 4 Eine zweite Methode, ein Java-Objekt zu erstellen und einer Tabelle hinzuzufgen, bezieht den folgenden Ausdruck ein, der immer ein JavaObjekt erstellt und ihm eine Referenz zurckgibt.
NEW Java-Klassenname()

Dieser Ausdruck kann auf verschiedene Arten benutzt werden. Beispielsweise wird mit der folgenden SQL-Anweisung ein Java-Objekt erstellt und in die Tabelle T1 eingefgt.
INSERT INTO T1 VALUES ( 2, NEW Invoice() );

Fhren Sie die folgende SQL-Anweisung aus, damit geprft wird, ob diese beiden Objekte als Werte der Spalte JCol in der Tabelle T1 gespeichert wurden.
select id, JCol.totalSum() FROM t1

Die Ergebnisse der Spalte JCol (zweite von der oben genannten Anweisung zurckgegebene Zeile) sollte 0 sein, da die Felder in diesem Objekt keine Werte haben und die Methode totalSum eine Berechnung dieser Felder ist.

90

Kapitel 3 Einfhrung in Java fr Datenbanken

Objekt mit einer Abfrage zurckgeben


Auer auf Felder und Methoden zuzugreifen, knnen Sie mit einer Abfrage auch ein ganzes Objekt aus der Tabelle abrufen.
v So greifen Sie auf Invoice-Objekte zu, die in einer Tabelle gespeichert sind:

Fhren Sie von Interactive SQL aus die folgenden Anweisungen aus, erstellen Sie eine neue Variable und bergeben Sie ihr einen Wert (Sie kann nur eine Referenz auf ein Objekt vom Typ "Invoice" enthalten). Die an die Variable bergebene Objektreferenz wurde mit der Tabelle T1 erstellt.
CREATE VARIABLE Inv2 Invoice; set Inv2 = (select JCol from T1 where ID = 2); SET Inv2.lineItem1Description = 'Sigkeiten'; SET Inv2.lineItem2Description = 'Sicherheitsgurt';

Der Wert fr das Feld lineItem1Description und lineItem2Description wurde in der Variablen Inv2 gendert, jedoch nicht in der Tabelle, die die Quelle fr den Wert dieser Variablen war. Dies ist konsistent mit der Art, in der SQL-Variable derzeit verarbeitet werden: Die Variable Inv enthlt eine Referenz auf ein Java-Objekt. Der Wert in der Tabelle, die als Quelle fr die Variablenreferenz diente, wird erst gendert, wenn eine UPDATE-Anweisung ausgefhrt wird.

91

Praktische Einfhrung: Eine bung mit Java in der Datenbank

92

K A P I T E L

Java in der Datenbank benutzen

ber dieses Kapitel Inhalt

In diesem Kapitel wird beschrieben, wie Sie Java-Klassen und Objekte Ihrer Datenbank hinzufgen und wie Sie diese Objekte in einer relationalen Datenbank einsetzen.
Thema Einleitung Datenbank fr Java aktivieren Java-Klassen in einer Datenbank installieren Spalten fr die Aufnahme von Java-Objekten erstellen Java-Objekte einfgen, aktualisieren und lschen 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 fr Java konfigurieren Seite 94 97 103 109 111 117 119 123 130 133 137 140

Bevor Sie beginnen

Vor den Beispielen in diesem Kapitel mssen Sie die Datei Samples\ASA\Java\jdemo.sql in Ihrem SQL Anywhere-Verzeichnis ausfhren.

$ Weitere Hinweise und vollstndige Anweisungen finden Sie unter


"Java-Beispiele einrichten" auf Seite 94.

93

Einleitung

Einleitung
Dieses Kapitel erlutert, wie Sie Aufgaben mit Java in der Datenbank ausfhren:
Datenbank fr Java aktivieren Sie mssen bestimmte Manahmen treffen, damit Ihre Datenbank fr die Arbeit mit Java aktiviert wird. Java-Klassen installieren Sie mssen Java-Klassen in einer Datenbank

installieren, damit sie fr Aufgaben auf dem Server zur Verfgung stehen.
Eigenschaften der Java-Spalten Dieser Abschnitt erlutert, wie Spalten mit Java-Klassen-Datentypen in das relationale Datenbankmodell passen. Datenbankdesign fr Java In diesem Abschnitt werden Tipps fr das

Design von Datenbanken gegeben, die Java-Klassen benutzen.

Java-Beispiele einrichten
Viele Beispiele in diesem Kapitel werden mit einer Gruppe von Klassen und Tabellen ausgefhrt, die der Beispieldatenbank hinzugefgt wurden. Die Tabellen enthalten dieselben Daten wie Tabellen desselben Namens in der Beispieldatenbank, nur gehren sie einem Benutzer namens jdba. Sie benutzen Java-Klassen-Datentypen anstelle von einfachen relationalen Typen fr die Daten. Das Beispiel finden Sie im Unterverzeichnis Samples\ASA\Java Ihres SQL Anywhere-Verzeichnisses.
Beispieltabellen sind nur fr die praktische Einfhrung gedacht

Die Beispieltabellen sollen unterschiedliche Java-Funktionen darstellen. Sie sind keinesfalls als Muster fr das Design Ihrer Datenbank zu empfehlen. berlegen Sie sich die konkreten Anforderungen in Ihrem Datenbanksystem, wenn Sie ermitteln wollen, an welchen Stellen JavaDatentypen und andere Java-Merkmale in die Datenbank eingebaut werden sollen. Die Java-Beispiele werden in zwei Schritten eingerichtet: 1 2 Aktivieren Sie die Beispieldatenbank fr Java. Fgen Sie die Java-Beispielklassen und tabellen hinzu.

94

Kapitel 4 Java in der Datenbank benutzen


v So wird die Beispieldatenbank fr Java aktiviert:

1 2

Starten Sie Interactive SQL und stellen Sie eine Verbindung mit der Beispieldatenbank her. Geben Sie im Fensterausschnitt "SQL-Anweisungen" in Interactive SQL die folgende Anweisung ein.
ALTER DATABASE UPGRADE JAVA JDK 1.3

Schlieen Sie Interactive SQL und die Beispieldatenbank. Die Beispieldatenbank asademo.db muss zunchst heruntergefahren werden, damit Sie die Java-Funktionen benutzen knnen.

v So fgen Sie Java-Klassen und Tabellen der Beispieldatenbank hinzu:

1 2

Starten Sie Interactive SQL und stellen Sie eine Verbindung mit der Beispieldatenbank her. Geben Sie im Fensterausschnitt "SQL-Anweisungen" in Interactive SQL die folgende Anweisung ein:
READ "Suchpfad\\Samples\\ASA\\Java\\jdemo.sql"

wobei Suchpfad Ihr SQL Anywhere-Verzeichnis ist. Damit werden die Instruktionen in der Befehlsdatei jdemo.sql ausgefhrt. Die Instruktionen bentigen eventuell einige Zeit, bis sie abgeschlossen sind. Sie knnen das Skript Samples\ASA\Java\jdemo.sql mit einem Texteditor ffnen. Es fhrt folgende Programmschritte aus: 1 2 3 4 Es installiert die Klasse JDBCExamples. Es erstellt einen Benutzer namens JDBA mit dem Kennwort SQL und DBA-Berechtigung, und setzt den aktuellen Benutzer als JDBA ein. Es installiert eine JAR-Datei namens asademo.jar. Diese Datei enthlt die Klassendefinitionen, die in den Tabellen verwendet werden. Es erstellt die folgenden Tabellen unter der Benutzer-ID JDBA: product contact customer employee sales_order sales_order_items 95

Einleitung
Dies ist eine Teilmenge der Tabellen in der Beispieldatenbank. 5 Es fgt die Daten aus den Standardtabellen mit identischen Namen in die Java-Tabellen ein. Dieser Verfahrensschritt benutzt INSERT- und SELECT-Anweisungen. Dieser Schritt kann einige Zeit in Anspruch nehmen. Es erstellt einige Indizes und Fremdschlssel, um dem Schema Integrittsregeln hinzuzufgen.

Laufzeitumgebung fr Java verwalten


Die Laufzeitumgebung fr Java besteht aus folgenden Komponenten:
Sybase Java Virtual Machine Die VM luft im Datenbankserver, interpretiert kompilierte Java-Klassen und fhrt sie aus. Integrierte Java-Klassen Wenn Sie eine Datenbank erstellen, wird eine

Serie von Java-Klassen fr die Datenbank verfgbar. Fr JavaAnwendungen in der Datenbank mssen diese Klassen fehlerfrei funktionieren. Aufgaben bei der Verwaltung von Java Um eine Laufzeitumgebung fr Java bereitzustellen, mssen Sie folgende Aufgaben durchfhren:
Datenbank fr Java aktivieren Bei dieser Aufgabe mssen Sie die Verfgbarkeit von integrierten Klassen und das Upgrade auf Standards der Version 8 prfen.

$ Weitere Hinweise finden Sie unter "Datenbank fr Java aktivieren"


auf Seite 97.
Installieren Sie andere Klassen, die die Benutzer brauchen Im Verlauf dieser Aufgabe sorgen Sie dafr, dass andere Klassen als die Laufzeitklassen installiert werden und auf dem letzten Stand sind.

$ Weitere Hinweise finden Sie unter "Java-Klassen in einer


Datenbank installieren" auf Seite 103.
Konfiguration des Servers Sie mssen Ihren Server so konfigurieren,

dass der erforderliche Speicher fr das Ausfhren von Java-Aufgaben vorhanden ist.

$ Weitere Hinweise finden Sie unter "Speicher fr Java


konfigurieren" auf Seite 140. Tools zum Verwalten von Java 96 Sie knnen alle diese Aufgaben aus Sybase Central oder Interactive SQL ausfhren.

Kapitel 4 Java in der Datenbank benutzen

Datenbank fr Java aktivieren


Die Adaptive Server Anywhere Laufzeitumgebung fr Java bentigt eine Java VM und die Java-Laufzeitklassen von Sybase. Erst nachdem Sie eine Datenbank fr Java aktiviert haben, knnen Sie sie mit Java-Laufzeitklassen benutzen. Java in der Datenbank ist eine separat lizenzierte Komponente von SQL Anywhere Studio.
Neue Datenbanken sind standardmig nicht fr Java aktiviert

Standardmig ist eine Datenbank nicht fr Java aktiviert, wenn Sie sie in Adaptive Server Anywhere neu erstellen. Java ist eine Programmiersprache mit einer Einzelhierarchie. Das bedeutet, dass alle Klassen, die Sie erstellen oder benutzen, von einer Klasse erben. Das bedeutet weiterhin, dass die Klassen der niedrigsten Ebene (also in der Hierarchie weiter oben angesiedelt) vorhanden sein mssen, bevor Klassen der oberen Ebene benutzt werden knnen. Die Basisgruppe der erforderlichen Klassen fr Java-Anwendungen wird als Laufzeit-JavaKlassen oder Java-API bezeichnet. Java-Aktivierung der Datenbank manchmal nicht erforderlich Durch das Bereitstellen einer Datenbank fr Java werden in die Systemtabellen zahlreiche Eintrge eingefgt. Dies vergrert die Datenbank und erfordert rund 200 KByte mehr Speicher zum Ausfhren der Datenbank, auch wenn Sie keine Java-Funktionen verwenden. Wenn Sie Java nicht verwenden werden und eine Umgebung mit begrenzter Speicherkapazitt haben, sollten Sie die Datenbank nicht fr Java aktivieren.

Die Java-Laufzeitklassen fr Sybase


Die Java-Laufzeitklassen fr Sybase befinden sich auf der Festplatte, und nicht in der Datenbank wie andere Klassen. Die folgenden Dateien enthalten die Java-Laufzeitklassen fr Sybase. Sie werden im Unterverzeichnis Java Ihres SQL Anywhere-Verzeichnisses gespeichert.
1.1\classes.zip Diese Datei, lizenziert von Sun Microsystems, enthlt einen Teil der Java-Laufzeitklassen fr JDK 1.1.8 von Sun Microsystems. 1.3\rt.jar Diese Datei, lizenziert von Sun Microsystems, enthlt einen

Teil der Java-Laufzeitklassen fr JDK 1.3 von Sun Microsystems.

97

Datenbank fr Java aktivieren



asajdbc.zip Diese Datei enthlt interne JDBC-Treiber-Klassen von

Sybase fr JDK 1.1.


asajrt12.zip Diese Datei enthlt interne JDBC-Treiber-Klassen von

Sybase fr JDK 1.2 und JDK 1.3. Wenn Sie eine Datenbank fr Java aktivieren, werden die Systemtabellen mit einer Liste verfgbarer Klassen aus den System-JAR-Dateien aktualisiert. Sie knnen dann die Klassenhierarchie aus Sybase Central durchsuchen, die Klassen selbst aber sind in der Datenbank nicht vorhanden. JAR-Dateien Die Datenbank speichert Laufzeit-Klassennamen unter folgenden JARDateien: Installierte Pakete
ASAJRT Klassennamen aus asajdbc.zip werden hier gespeichert. ASAJDBCDRV Klassennamen aus jdbcdrv.zip werden hier gespeichert. ASASystem Klassennamen aus classes.zip werden hier gespeichert.

Diese Laufzeitklassen enthalten die folgenden Pakete:


java Die hier gespeicherten Pakete sind die untersttzten Java-

Laufzeitklassen von Sun Microsystems.

$ Eine Liste der untersttzten Java-Laufzeitklassen finden Sie unter


"Untersttzte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch.
com.sybase Die hier gespeicherten Pakete bieten serverseitige JDBCUntersttzung. sun Sun Microsystems bietet die hier gespeicherten Pakete an. sybase.sql Die hier gespeicherten Pakete sind Teil der serverseitigen

JDBC-Untersttzung von Sybase.


Vorsicht: Installieren Sie keine Klassen von einer anderen Version des Sun JDK Klassen im Sun JDK haben identische Namen wie die JavaLaufzeitklassen fr Sybase, die in jeder Datenbank installiert werden mssen, in denen Java-Vorgnge ausgefhrt werden sollen.

Sie drfen die Datei classes.zip, die mit Adaptive Server Anywhere mitgeliefert wird, nicht ersetzen. Wenn Sie eine andere Version dieser Klassen verwenden, knnten sich daraus Kompatibilittsprobleme mit der Sybase Java Virtual Machine ergeben. Eine Aktivierung einer Datenbank fr Java drfen Sie nur so vornehmen, wie dies in diesem Abschnitt beschrieben wird.

98

Kapitel 4 Java in der Datenbank benutzen

Methoden zur Java-Aktivierung einer Datenbank


Sie knnen Datenbanken bei der Erstellung, beim Upgrade oder zu einem spteren Zeitpunkt in einem separaten Vorgang fr Java aktivieren. Datenbanken erstellen Sie knnen eine fr Java aktivierte Datenbank wie folgt erstellen: Benutzen Sie die Anweisung CREATE DATABASE.

$ Hinweise zur Syntax finden Sie unter "CREATE DATABASEAnweisung" auf Seite 298 der Dokumentation ASA SQLReferenzhandbuch. Benutzen Sie das Dienstprogramm dbinit.

$ Hinweise finden Sie unter "Datenbank mit dem


Befehlszeilenprogramm ""dbinit"" erstellen" auf Seite 516 der Dokumentation ASA Datenbankadministration. Sybase Central

$ Hinweise finden Sie unter "Datenbank erstellen" auf Seite 31 der


Dokumentation ASA SQL-Benutzerhandbuch. Upgrade einer Datenbank Ein Upgrade einer Datenbank auf eine fr Java aktivierte Datenbank der Version 8 knnen Sie wie folgt durchfhren: Benutzen Sie die Anweisung ALTER DATABASE.

$ Hinweise zur Syntax finden Sie unter "ALTER DATABASEAnweisung" auf Seite 224 der Dokumentation ASA SQLReferenzhandbuch. Benutzen Sie das Upgrade-Dienstprogramm dbupgrad.exe.

$ Hinweise finden Sie unter "Upgrade einer Datenbank mit dem


Befehlszeilenprogramm ""dbupgrad""" auf Seite 583 der Dokumentation ASA Datenbankadministration. Sybase Central.

$ Weitere Hinweise finden Sie unter "Datenbank fr Java aktivieren"


auf Seite 101. Wenn Sie Java in der Datenbank nicht installieren, bleiben alle Datenbankvorgnge, die keine Java-Vorgnge einschlieen, voll funktionsfhig und laufen wie vorgesehen ab.

99

Datenbank fr Java aktivieren

Neue Datenbanken und Java


Die Java-Laufzeitklassen fr Sybase werden bei Adaptive Server Anywhere standardmig nicht jedesmal installiert, wenn Sie eine Datenbank erstellen. Die Installation dieser separat zu lizenzierenden Komponente ist fakultativ und wird ber die Methode gesteuert, mit der Sie die Datenbank erstellen. CREATE DATABASEOptionen Die SQL-Anweisung CREATE DATABASE hat eine Option namens JAVA. Wenn Sie die Datenbank fr Java aktivieren wollen, setzen Sie diese Option auf ON. Wenn Sie Java deaktivieren wollen, setzen Sie die Option auf OFF. Standardmig ist die Option auf OFF gesetzt. Beispielsweise erstellt die folgende Anweisung eine Datei fr eine Javaaktivierte Datenbank namens temp.db:
CREATE DATABASE c:\\sybase\\asa8\\temp JAVA ON

Die folgende Anweisung erstellt eine Datenbankdatei temp2.db, die Java nicht untersttzt:
CREATE DATABASE c:\\sybase\\asa8\\temp2

Dienstprogramm fr die Initialisierung der Datenbank

Datenbanken knnen mit dem Dienstprogramm dbinit.exe erstellt werden. Das Dienstprogramm verfgt ber Parameter, mit denen gesteuert wird, ob die Java-Laufzeitklassen in der neu installierten Datenbank installiert werden. Standardmig werden diese Klassen nicht installiert. Die gleichen Optionen sind verfgbar, wenn Sie eine Datenbank mit Sybase Central erstellen.

Upgrade von Datenbanken und Java


Fr vorhandene Datenbanken, die mit frheren Versionen der Software erstellt wurden, kann ein Upgrade durchgefhrt werden, und zwar mit dem Dienstprogramm fr den Datenbank-Upgrade oder mit der Anweisung ALTER DATABASE. Dienstprogramm fr das DatenbankUpgrade Das Upgrade fr Datenbanken auf den Standard von Adaptive Server Anywhere Version 8 erfolgt mit dem Dienstprogramm dbupgrad.exe. Der Parameter jr verhindert die Installation der Java-Laufzeitklassen von Sybase.

$ Hinweise ber die Bedingungen fr 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.

100

Kapitel 4 Java in der Datenbank benutzen

Datenbank fr Java aktivieren


Wenn Sie eine Datenbank erstellt oder ein Upgrade einer Datenbank durchgefhrt, dabei aber die Option so gesetzt haben, dass die Datenbank nicht fr Java aktiviert wurde, knnen Sie die erforderlichen Java-Klassen ber Sybase Central oder Interactive SQL auch zu einem spteren Zeitpunkt hinzufgen.
v Um der Datenbank die Java-Laufzeitklassen fr Sybase hinzuzufgen, 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. Rechtsklicken Sie auf die Datenbank und whlen Sie "Upgrade einer Datenbank". Klicken Sie auf der einfhrenden Seite des Assistenten auf "Weiter". Whlen Sie die Datenbank, fr die das Upgrade vorgenommen werden soll, aus der Liste aus. Sie knnen gegebenenfalls eine Sicherungskopie der Datenbank anlegen lassen. Klicken Sie auf "Weiter". Falls erwnscht, kann jConnect-Metadaten-Untersttzung installiert werden. Klicken Sie auf "Weiter" Whlen Sie die Option "Java-Untersttzung installieren". Sie mssen auerdem die Version des JDK festlegen, die installiert werden soll. Die Standardklassen sind JDK 1.3-Klassen. Fr Version 7.x-Datenbanken sind die Standardklassen JDK 1.1.8-Klassen. Befolgen Sie die restlichen Anweisungen im Assistenten.

v Um die Java-Laufzeitklassen fr Sybase der Datenbank hinzuzufgen, gehen Sie wie folgt vor (Interactive SQL):

1 2

Verbinden Sie sich mit der Datenbank aus Interactive SQL als Benutzer mit DBA-Berechtigung. Fhren Sie folgende Anweisung aus:
ALTER DATABASE UPGRADE JAVA ON

$ Weitere Hinweise finden Sie unter "ALTER DATABASEAnweisung" auf Seite 224 der Dokumentation ASA SQLReferenzhandbuch. 3 Starten Sie die Datenbank neu, damit die Java-Untersttzung wirksam wird. 101

Datenbank fr Java aktivieren

Mit Sybase Central eine Datenbank fr Java aktivieren


Sie knnen Sybase Central fr die Erstellung von Datenbanken ber Assistenten benutzen. Whrend der Erstellung oder des Upgrades einer Datenbank fordert der Assistent Sie auf, auszuwhlen, ob die JavaLaufzeitklassen fr Sybase installiert werden. Standardmig ist diese Option so gesetzt, dass die Datenbank fr Java aktiviert wird. Die Erstellung oder das Upgrade einer Datenbank werden in Sybase Central wie folgt vorgenommen: Whlen Sie "Datenbank erstellen" aus dem Ordner "Dienstprogramme". Whlen Sie "Upgrade einer Datenbank" aus dem Ordner "Dienstprogramme", wenn Sie eine Datenbank von einer frheren Version der Software auf eine Datenbank mit Java-Funktionen umstellen wollen.

102

Kapitel 4 Java in der Datenbank benutzen

Java-Klassen in einer Datenbank installieren


Bevor Sie eine Java-Klasse in einer Datenbank installieren, mssen Sie sie kompilieren. Sie haben mehrere Methoden zur Auswahl, um Java-Klassen zu installieren:
Einzelne Klasse Sie knnen eine einzelne Klasse in einer Datenbank aus einer kompilierten Klassendatei installieren. Klassendateien haben normalerweise die Erweiterung .class. JAR-Datei Sie knnen eine Serie von Klassen auf einmal installieren, wenn sie in einer komprimierten oder unkomprimierten JAR-Datei zusammengefasst sind. JAR-Dateien haben normalerweise die Erweiterung .jar oder .zip. Adaptive Server Anywhere untersttzt alle komprimierten JAR-Dateien, die mit dem SUN-JAR-Dienstprogramm, sowie anderen JAR-Kompressionsschemata, erstellt werden.

Dieser Abschnitt beschreibt, wie Java-Klassen installiert werden, nachdem Sie sie kompiliert haben. Sie mssen ber die DBA-Berechtigung verfgen, um eine Klasse oder eine JAR-Datei zu installieren.

Klasse erstellen
Die Details der einzelnen Schritte knnen zwar unterschiedlich sein, wenn ein Java-Entwicklungstool wie Sybase PowerJ verwendet wird, grundstzlich sind aber fr die Erstellung eigener Klassen die nachfolgend beschriebenen Schritte erforderlich.
v So erstellen Sie eine Klasse:

Definieren Sie Ihre Klasse Schreiben Sie den Java-Code, der Ihre

Klasse definiert. Wenn Sie den Sun Java SDK benutzen, knnen Sie einen Texteditor verwenden. Wenn Sie ein Entwicklungstool wie Sybase PowerJ benutzen, finden Sie entsprechende Anweisungen im Entwicklungstool.
Verwenden Sie nur untersttzte Klassen

Wenn Ihre Klasse Java-Laufzeitklassen benutzt, mssen Sie darauf achten, dass sie sich in der Liste der untersttzten Klassen befinden. Die Liste finden Sie unter "Untersttzte Java-Pakete" auf Seite 87 der Dokumentation ASA SQL-Referenzhandbuch. Benutzerklassen mssen 100% Java sein. Native Methoden sind nicht zulssig. 103

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 .java. Achten Sie darauf, dass der Name der Datei mit dem Namen der Klasse bereinstimmt, und dass die Gro-/Kleinschreibung beider Namen identisch ist.

Beispiel: Eine Klasse namens "Dienstprogramm" muss in einer Datei namens Dienstprogramm.java gespeichert werden. 3
Kompilieren Sie Ihre Klasse Mit diesem Schritt wird die Klassendeklaration mit dem Java-Code in eine neue, eigene Datei verwandelt, die Byte-Code enthlt. Der Name der neuen Datei ist gleich lautend mit dem Namen der Java-Codedatei, hat aber die Erweiterung .class. Eine kompilierte Java-Klasse kann in einer JavaLaufzeitumgebung unabhngig von der Plattform ausgefhrt werden, auf der sie kompiliert wurde. Auch das Betriebssystem der JavaLaufzeitumgebung spielt keine Rolle.

Der Sun JDK enthlt den Java-Compiler Javac.exe.


Nur fr Java aktivierte Datenbanken

Jede kompilierte Java-Klassendatei kann in einer Datenbank installiert werden. Java-Vorgnge, die eine installierte Klasse verwenden, knnen nur ausgefhrt werden, wenn die Datenbank fr Java aktiviert wurde. Siehe unter "Datenbank fr Java aktivieren" auf Seite 97.

Klasse installieren
Um Ihre Java-Klasse innerhalb der Datenbank verfgbar zu machen, knnen Sie eine Klasse aus Sybase Central einrichten oder mit der Anweisung INSTALL aus Interactive SQL oder einer anderen Anwendung installieren. Sie mssen den Suchpfad und den Dateinamen der Klasse kennen, die Sie installieren wollen. Sie brauchen die DBA-Berechtigung, um eine Klasse zu installieren.
v So installieren Sie eine Klasse (Sybase Central):

1 2 3 4 104

Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. ffnen Sie den Ordner "Java-Objekte" fr die Datenbank. Doppelklicken Sie auf "Java-Klasse hinzufgen". Befolgen Sie die Anweisungen im Assistenten.

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. Fhren Sie folgende Anweisung aus:
INSTALL JAVA NEW FROM FILE Suchpfad\\Klassenname.class

Dabei gilt: Suchpfad ist das Verzeichnis, in dem die Klassendatei gehalten wird, und Klassenname.class ist der Name der Klassendatei. Der doppelte Rckstrich sorgt dafr, dass der Rckstrich nicht als Escapezeichen behandelt wird. Beispiel: Um eine Klasse zu installieren, die in einer Datei namens
Dienstprogramm.class im Verzeichnis c:\Quelle gehalten wird, geben Sie

folgende Anweisung ein:


INSTALL JAVA NEW FROM FILE c:\\Quelle\\Dienstprogramm.class

Wenn Sie einen relativen Suchpfad verwenden, muss er zum aktuellen Arbeitsverzeichnis des Datenbankservers relativ sein.

$ Weitere Hinweise finden Sie unter "INSTALL-Anweisung" auf


Seite 504 der Dokumentation ASA SQL-Referenzhandbuch und unter "Java-Objekte, Klassen und JAR-Dateien lschen" auf Seite 116.

JAR-Datei installieren
Es ist sinnvoll und allgemein blich, Gruppen von miteinander verwandten Klassen in Paketen zu sammeln und diese Pakete in einer JAR-Datei zusammenzufassen. 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. Eine JAR-Datei kann die Erweiterung JAR oder ZIP haben. Jede JAR-Datei muss einen Namen in der Datenbank haben. Normalerweise benutzen Sie denselben Namen wie die JAR-Datei, ohne die Erweiterung. Beispiel: Wenn Sie eine JAR-Datei namens meinejar.zip installieren, sollten Sie ihr im Allgemeinen den JAR-Namen meinejar geben.

$ Weitere Hinweise finden Sie unter "INSTALL-Anweisung" auf


Seite 504 der Dokumentation ASA SQL-Referenzhandbuch und "JavaObjekte, Klassen und JAR-Dateien lschen" auf Seite 116.

105

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. ffnen Sie den Ordner "Java-Objekte" fr die Datenbank. Doppelklicken Sie auf "JAR-Datei hinzufgen". Befolgen Sie die Anweisungen im Assistenten.

v So installieren Sie eine JAR-Datei (Interactive SQL):

1 2

Stellen Sie mit DBA-Berechtigung eine Verbindung mit einer Datenbank her. Geben Sie folgende Anweisung ein:
INSTALL JAVA NEW JAR jarname FROM FILE Suchpfad\\JarName.jar

Klassen und JAR-Dateien aktualisieren


Sie knnen Klassen und JAR-Dateien mit Sybase Central oder durch die Eingabe einer INSTALL-Anweisung in Interactive SQL bzw. einer anderen Clientanwendung installieren. Um eine Klasse oder eine JAR-Datei zu installieren, mssen Sie DBABerechtigung haben und ber eine neuere Version der kompilierten Klasse oder JAR-Datei in einer Datei auf der Festplatte verfgen. Bestehende JavaObjekte und aktualisierte Klassen Es kann sein, dass Instanzen einer Java-Klasse in Form von Java-Objekten in Ihrer Datenbank oder als Werte in einer Spalte gespeichert sind, die die Klasse als Datentyp verwendet. Trotz der Aktualisierung der Klasse bleiben diese alten Werte weiterhin verfgbar, auch wenn die Felder und Methoden, die in den Tabellen gespeichert werden, mit der neuen Klassendefinition inkompatibel sind. Alle neu eingefgten Zeilen mssen allerdings mit der neuen Definition kompatibel sein. Gltigkeit aktualisierter Klassen Die neue Definition wird nur von Verbindungen benutzt, die nach der Installation der Klasse eingerichtet wurden, oder die die Klasse zum ersten Mal nach der Installation der Klasse verwenden. Wenn die Virtual Machine die Klassendefinition ldt, bleibt diese im Speicher, bis die Verbindung geschlossen wird.

106

Kapitel 4 Java in der Datenbank benutzen


Wenn Sie eine Java-Klasse oder auf einer Klasse basierende Objekte in der aktuellen Verbindung benutzt haben, mssen Sie die Verbindung trennen und wieder aufnehmen, damit die neue Klassendefinition wirksam wird.

$ Um zu verstehen, wie aktualisierte Klassen wirksam werden, mssen


Sie mehr ber die Arbeitsweise der Virtual Machine wissen. Hinweise dazu finden Sie unter "Speicher fr Java konfigurieren" auf Seite 140. In serialisierter Form gespeicherte Objekte Java-Objekte knnen die aktualisierte Klassendefinition verwenden, weil sie in serialisierter Form gespeichert werden. Das benutzte Serialisierungsformat ist speziell fr die Datenbank entworfen und entspricht nicht dem Serialisierungsformat von Sun Microsystems. Die interne Sybase VM fhrt alle Serialisierungen und Deserialisierungen durch, sodass dadurch keine Kompatibilittsprobleme entstehen.
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. ffnen Sie den Ordner "Java-Objekte". Suchen Sie die Klasse oder JAR-Datei, die Sie aktualisieren wollen. Rechtsklicken Sie auf die Klasse oder JAR-Datei und whlen Sie "Aktualisieren" aus dem Einblendmen. In dem nun eingeblendeten Dialogfeld geben Sie den Namen und den Standort der Klasse oder JAR-Datei ein, die Sie aktualisieren wollen. Sie knnen mit "Durchsuchen" danach suchen.
Tipp

Sie knnen eine Java-Klasse oder JAR-Datei auch aktualisieren, 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. Fhren Sie folgende Anweisung aus:
INSTALL JAVA UPDATE [ JAR jarname ] FROM FILE Dateiname

Wenn Sie eine JAR-Datei aktualisieren, mssen Sie den Namen eingeben, unter dem die JAR in der Datenbank bekannt ist. 107

Java-Klassen in einer Datenbank installieren

$ Weitere Hinweise finden Sie unter "INSTALL-Anweisung" auf


Seite 504 der Dokumentation ASA SQL-Referenzhandbuch.

108

Kapitel 4 Java in der Datenbank benutzen

Spalten fr die Aufnahme von Java-Objekten erstellen


Dieser Abschnitt erlutert, wie Spalten mit Datentypen der Java-Klassen in die standardmige SQL-Struktur passen.

Spalten mit Java-Datentypen erstellen


Sie knnen jede installierte Java-Klasse als Datentyp benutzen. Sie mssen einen voll qualifizierten Namen fr den Datentyp verwenden. Beispiel: Die folgende Anweisung CREATE TABLE enthlt Spalten der Java-Datentypen asademo.Name und asademo.ContactInfo. Hier sind Name und ContactInfo Klassen im Paket asademo.
CREATE TABLE jdba.customer ( id integer NOT NULL, company_name CHAR(35) NOT NULL, JName asademo.Name NOT NULL, JContactInfo asademo.ContactInfo NOT NULL, PRIMARY KEY (id) )

Bercksichtigung von Gro-/Kleinschreibung

Anders als bei SQL-Datentypen bercksichtigen Java-Datentypen die Gro/Kleinschreibung. Sie mssen die Datentypen immer in der richtigen Schreibweise eingeben.

Standardwerte und NULLWERTE in Java-Spalten verwenden


Sie knnen Standardwerte fr Java-Spalten verwenden, und Java-Spalten knnen NULLWERTE enthalten.
Java-Spalten und Standardwerte Spalten knnen als Standardwert jede Funktion mit dem richtigen Datentyp oder einen beliebigen voreingestellten Standardwert enthalten. Sie knnen jede Funktion mit dem richtigen Datentyp (d.h. derselben Klasse wie die Spalte) als Standardwert fr JavaSpalten verwenden. Java-Spalten und NULLWERTE Java-Spalten knnen NULLWERTE

zulassen. Wenn fr eine nullwertfhige Spalte mit einem Java-Datentyp kein Standardwert gesetzt ist, enthlt die Spalte NULL.

109

Spalten fr die Aufnahme von Java-Objekten erstellen


Wenn ein Java-Wert nicht gesetzt ist, hat er den Java-NULLWERT. Dieser Java-NULLWERT ist dem SQL-NULLWERT zugeordnet, und Sie knnen daher die Suchbedingungen IS NULL und IS NOT NULL fr diese Werte verwenden. Beispiel: Wenn die Beschreibung des Java-Objekts "product" in einer Spalte namens JProd nicht gesetzt wurde, knnen Sie alle Produkte mit Nicht-Nullwerten fr die Beschreibung wie folgt abrufen:
SELECT * FROM product WHERE JProd>>description IS NULL

110

Kapitel 4 Java in der Datenbank benutzen

Java-Objekte einfgen, aktualisieren und lschen


In diesem Abschnitt wird beschrieben, wie Standard-SQL-Anweisungen fr die Datenverarbeitung auf Java-Spalten angewendet werden. In diesem Abschnitt werden die einzelnen Punkte mit konkreten Beispielen illustriert, die auf der Tabelle Product der Beispieldatenbank und einer Klasse namens Product basieren. Als Erstes sollten Sie sich die Datei Samples\ASA\Java\asademo\Product.java in Ihrem SQL AnywhereVerzeichnis ansehen. Java-BeispielTabellen erstellen Die Beispiele in diesem Abschnitt setzen voraus, dass Sie die Java-Tabellen der Beispieldatenbank hinzugefgt haben und als Benutzer jDBA mit dem Kennwort SQL verbunden sind.

$ Weitere Hinweise finden Sie unter "Java-Beispiele einrichten" auf


Seite 94.

Eine Beispielklasse
In diesem Abschnitt wird eine Klasse beschrieben, die in Beispielen aller folgenden Abschnitte verwendet wird. Die Klassendefinition Product im Verzeichnis Samples\ASA\Java\asademo\Product.java in Ihrem SQL AnywhereVerzeichnis wird teilweise im Folgenden dargestellt (zum besseren Verstndnis werden die Kommentarzeilen, die in der Originaldatei in Englisch sind, hier in deutscher bersetzung wiedergegeben):
package asademo; public class Product implements java.io.Serializable { // "public"-Felder public String name ; public String description ; public String size ; public String color; public int quantity ; public java.math.BigDecimal unit_price ; // Standard-Konstruktor Product () { unit_price = new java.math.BigDecimal( 10.00 ); name = "Unknown"; size = "One size fits all";

111

Java-Objekte einfgen, aktualisieren und lschen


} // Konstruktor mit allen verfgbaren Argumenten Product ( String inColor, String inDescription, String inName, int inQuantity, String inSize, java.math.BigDecimal inUnit_price ) { color = inColor; description = inDescription; name = inName; quantity = inQuantity; size = inSize; unit_price=inUnit_price; } public String toString() { return size + " " + name + ": " + unit_price.toString(); }

Hinweise

Die Klasse Product hat einige ffentliche Felder, die einigen Spalten der Tabelle DBA.Product entsprechen, die in dieser Klasse gesammelt werden sollen. Die Methode toString wird der Einfachheit halber bereitgestellt. Wenn Sie einen Objektnamen in eine Auswahlliste einbeziehen, wird die Methode toString ausgefhrt, und ihre Rckgabezeichenfolgen werden angezeigt. Einige Methoden sind vorgesehen, um die Felder zu setzen und abzurufen. Es ist beim objektorientierten Programmieren auch allgemein blich, solche Methoden zu verwenden, und nicht die Felder direkt zu adressieren. Fr die praktische Einfhrung wurden die Felder zur einfacheren Durchfhrung als "ffentliche" Felder zugnglich gemacht.

Java-Objekte einfgen
Wenn Sie eine Zeile in eine Tabelle EINFGEN, die eine Java-Spalte hat, mssen Sie ein Java-Objekt in die Java-Spalte einfgen. Sie knnen ein Java-Objekt auf zwei Arten einfgen: aus SQL oder mit JDBC aus anderen Java-Klassen, die in der Datenbank ausgefhrt werden.

112

Kapitel 4 Java in der Datenbank benutzen

Java-Objekte aus SQL einfgen


Sie knnen ein Java-Objekt mit einem Konstruktor einfgen oder SQLVariable verwenden, um ein Java-Objekt aufzubauen, bevor Sie es einfgen. Objekt mit einem Konstruktor einfgen Wenn Sie einen Wert in eine Spalte einfgen, die einen Java-KlassenDatentyp hat, fgen Sie ein Java-Objekt ein. Um ein Objekt mit den richtigen Eigenschaften einzufgen, muss das neue Objekt die richtigen Werte fr ffentliche Felder haben, und Methoden, die private Felder setzen, mssen aufgerufen werden.
v So fgen Sie ein Java-Objekt ein:

INSERT: Verwenden Sie die INSERT-Anweisung, um eine neue Instanz der Klasse "Product" in die Tabelle product einzufgen:
INSERT INTO product ( ID, JProd ) VALUES ( 702, NEW asademo.Product() )

Sie knnen dieses Beispiel in der Beispieldatenbank als Benutzer jdba ausfhren, nachdem Sie das Skript jdemo.sql ausgefhrt haben. Das Schlsselwort NEW ruft den Standard-Konstruktor fr die Klasse Product im Paket asademo auf. Objekt aus einer SQL-Variablen einfgen Sie knnen die Werte der Felder des Objekts in einer SQL-Variablen der richtigen Klasse auch individuell setzen, und nicht durch den Konstruktor.
v So fgen Sie ein Java-Objekt mit SQL-Variablen ein:

1 2

Erstellen Sie eine SQL-Variable der Java-Klassentypen:


CREATE VARIABLE ProductVar asademo.Product

Weisen Sie der Variablen ein neues Objekt zu, indem Sie den Klassenkonstruktor verwenden:
SET ProductVar = NEW asademo.Product()

Weisen Sie den Feldern des Objekts Werte zu, wo solche erforderlich sind:
SET SET SET SET SET SET ProductVar>>color = Black; ProductVar>>description = Steel tipped boots; ProductVar>>name = Work boots; ProductVar>>quantity = 40; ProductVar>>size = Extra Large; ProductVar>>unit_price = 79.99;

Fgen Sie die Variable in die Tabelle ein:


INSERT INTO Product ( id, JProd )

113

Java-Objekte einfgen, aktualisieren und lschen


VALUES ( 800, ProductVar )

Prfen Sie, ob der Wert eingefgt wurde:


SELECT * FROM product WHERE id=800

Machen Sie die nderungen rckgngig, die Sie in dieser bung vorgenommen haben:
ROLLBACK

Die Verwendung von SQL-Variablen ist typisch fr gespeicherte Prozeduren und andere Verwendungsmglichkeiten von SQL zum Einbau von programmierter Logik in die Datenbank. Java ist die leistungsfhigere Sprache fr solche Aufgaben. Sie knnen die serverseitigen Java-Klassen gemeinsam mit JDBC verwenden, um Objekte in Tabellen einzufgen.

Objekt aus Java einfgen


Sie knnen ein Objekt mit einer vorbereiteten Anweisung von JDBC einfgen. Eine vorbereitete Anweisung benutzt Platzhalter fr Variable. Sie knnen dann die Methode setObject des Objekts PreparedStatement benutzen. Sie knnen vorbereitete Anweisungen verwenden, um Objekte von clientseitiger oder serverseitiger JDBC einzufgen.

$ Weitere Hinweise ber die Verwendung von vorbereiteten


Anweisungen fr Objekte finden Sie unter "Objekte einfgen und abrufen" auf Seite 172.

Java-Objekt aktualisieren
Java-Spaltenwerte knnen mit einer der folgenden Methoden aktualisiert werden: Gesamtes Objekt aktualisieren Gesamtes Objekt aktualisieren Einige der Felder im Objekt aktualisieren

Fr die Aktualisierung des Objekts gehen Sie fast genauso vor wie fr das Einfgen: Aus SQL knnen Sie einen Konstruktor verwenden, um das Objekt auf ein neues Objekt zu aktualisieren, wenn der Konstruktor es erstellt. Sie knnen dann einzelne Felder aktualisieren, wenn Sie dies bentigen.

114

Kapitel 4 Java in der Datenbank benutzen


Aus SQL knnen Sie eine SQL-Variable verwenden, um das bentigte Objekt aufzunehmen, und dann die Zeile aktualisieren, damit die Variable darin eingefgt wird. Aus JDBC knnen Sie eine vorbereitete Anweisung und die Methode PreparedStatement.setObject verwenden.

Felder des Objekts aktualisieren

Einzelne Felder eines Objekts haben Datentypen, die SQL-Datentypen entsprechen. Dabei verwenden Sie die Zuordnung von SQL- zu JavaDatentypen laut der Beschreibung unter "Umwandlung von JAVA- in SQLDatentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. Sie knnen einzelne Felder mit einer Standard-UPDATE-Anweisung aktualisieren:
UPDATE Product SET JProd.unit_price = 16.00 WHERE ID = 302

In der ersten Version von Java in der Datenbank musste eine spezielle Funktion (EVALUATE) verwendet werden, um Aktualisierungen vorzunehmen. Dies ist nicht mehr erforderlich. Damit ein Java-Feld aktualisiert werden kann, 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. Sie mssen eventuell die CAST-Funktion verwenden, um die Datentypen entsprechend einzuordnen.

$ Hinweise zur Datentypzuordnung zwischen Java und SQL finden Sie


unter "Umwandlung von JAVA- in SQL-Datentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. set-Methoden verwenden Bei der Java-Programmmierung ist es allgemein blich, Felder nicht direkt anzusprechen, sondern Methoden zu benutzen, um die Werte zu holen und zu setzen. Auerdem ist es allgemein blich, dass diese Methoden void zurckgeben. Sie knnen in SQL set-Methoden verwenden, um eine Spalte zu aktualisieren:
UPDATE jdba.Product SET JProd.setName( Tank Top) WHERE id=302

Der Einsatz von Methoden anstelle der direkten Ansprache des Feldes ist langsamer, da die Java VM laufen muss.

$ Weitere Hinweise finden Sie unter "Rckgabewert von Methoden, die


"void" zurckgeben" auf Seite 125.

115

Java-Objekte einfgen, aktualisieren und lschen

Java-Objekte, Klassen und JAR-Dateien lschen


Das Lschen von Zeilen mit Java-Objekten unterscheidet sich nicht vom Lschen anderer Zeilen. Die WHERE-Klausel in der DELETE-Anweisung kann Java-Objekte oder Java-Felder und Methoden enthalten.

$ Weitere Hinweise finden Sie unter "DELETE-Anweisung" auf


Seite 422 der Dokumentation ASA SQL-Referenzhandbuch. Mit Sybase Central knnen Sie auch eine ganze Java-Klasse oder JAR-Datei lschen.
v So lchen Sie eine Java-Klasse oder JAR-Datei (Sybase Central):

1 2 3

ffnen Sie den Ordner "Java-Objekte". Suchen Sie die Klasse oder JAR-Datei, die Sie lschen wollen. Rechtsklicken Sie auf die Klasse oder JAR-Datei und whlen Sie "Lschen" aus dem Einblendmen.

$ Siehe auch:
"Klasse installieren" auf Seite 104 "JAR-Datei installieren" auf Seite 105

116

Kapitel 4 Java in der Datenbank benutzen

Java-Objekte abfragen
Java-Spaltenwerte knnen mit einer der folgenden Methoden abgefragt werden: Gesamtes Objekt abfragen Gesamtes Objekt abfragen Einige der Felder im Objekt abfragen

Aus SQL knnen Sie eine Variable des geeigneten Typs erstellen und den Wert aus dem Objekt in diese Variable auswhlen. Vor allem aber werden Sie das ganze Objekt in einer Java-Anwendung brauchen. Sie knnen ein Objekt in eine serverseitige Java-Klasse abrufen, indem Sie die Methode getObject des ResultSet einer Abfrage verwenden. Sie knnen auch ein Objekt in eine clientseitige Java-Anwendung abrufen.

$ Wie Objekte mit JDBC abgerufen werden, finden Sie unter "Abfragen
mit JDBC" auf Seite 169. Felder des Objekts abrufen Einzelne Felder eines Objekts haben Datentypen, die SQL-Datentypen entsprechen. Dabei verwenden Sie die Zuordnung von SQL- zu JavaDatentypen laut der Beschreibung unter "Umwandlung von JAVA- in SQLDatentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. Sie knnen einzelne Felder abrufen, indem Sie sie in die Auswahlliste einer Abfrage einschlieen, wie dies im folgenden einfachen Beispiel beschrieben wird.
SELECT JProd>>unit_price FROM product WHERE ID = 400

Wenn Sie Methoden verwenden, um die Werte Ihrer Felder zu setzen und abzurufen, wie es beim objektorientierten Programmieren allgemein blich ist, knnen Sie eine Methode getField in Ihre Abfrage einbeziehen.
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.

117

Java-Objekte abfragen

Performance-Tipp

Das direkte Abrufen eines Feldes ist schneller als der Aufruf einer Methode, die das Feld abruft, da fr den Aufruf der Methode die Java VM gestartet werden muss. Die Ergebnisse der Anweisung SELECT Spaltenname Sie knnen den Spaltennamen in einer Abfrage-Auswahlliste auflisten, wie in der folgenden Abfrage:
SELECT JProd FROM jdba.product

Die Abfrage gibt die Sun-Serialisierung des Objekts an die Clientanwendung zurck. Wenn Sie in Interactive SQL eine Abfrage ausfhren, die ein Objekt abruft, wird der Rckgabewert der toString-Methode des Objekts angezeigt. Fr die Klasse "Product" listet die Methode toString in einer Zeichenfolge die Gre, den Namen und den Stckpreis des Objekts auf. Die Ergebnisse der Abfrage lauten wie folgt:
JProd Small Tee Shirt: 9.00 Medium Tee Shirt: 14.00 One size fits all Tee Shirt: 14.00 One size fits all Baseball Cap: 9.00 One size fits all Baseball Cap: 10.00 One size fits all Visor: 7.00 One size fits all Visor: 7.00 Large Sweatshirt: 24.00 Large Sweatshirt: 24.00 Medium Shorts: 15.00

118

Kapitel 4 Java in der Datenbank benutzen

Java-Felder und Objekte vergleichen


ffentliche Java-Klassen sind Domnen, die viel umfangreichere Funktionen bieten als herkmmliche SQL-Domnen. In diesem Zusammenhang ergibt sich die Frage, 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, einer GROUP BY Klausel, einem DISTINCT Schlsselwort oder mit einer Aggregatfunktion Anweisungen, die Gleichheits- oder UngleichheitsVergleichsbedingungen verwenden Indizes und eindeutige Spalten Primr- und Fremdschlsselspalten

Sortieren von Zeilen in einer Abfrage oder in einem Index setzt voraus, dass die Werte in jeder Zeile miteinander verglichen werden. Wenn Sie eine JavaSpalte haben, knnen Sie Vergleiche in der folgenden Weise ausfhren:
Vergleich ber ein ffentliches Feld Sie knnen ber ein ffentliches

Feld genauso einen Vergleich vornehmen wie ber eine normale Zeile. Beispielsweise knnten Sie folgende Abfrage ausfhren:
SELECT name, JProd.unit_price FROM Product ORDER BY JProd.unit_price

Diese Art des Vergleichs kann in Abfragen verwendet werden, ist aber fr Indizes und Schlsselspalten nicht anwendbar.
Vergleich mit einer "compareTo"-Methode Java-Objekte, die eine compareTo-Methode implementiert haben, knnen verglichen werden. Die Klasse "Product", auf der die Spalte JProd basiert, hat eine compareTo-Methode, die Objekte auf Grundlage des Feldes unit_price miteinander vergleicht. Damit wird folgende Abfrage ermglicht: SELECT name, JProd.unit_price FROM Product ORDER BY JProd

Der bentigte Vergleich fr die ORDER BY Klausel erfolgt automatisch basierend auf der Methode compareTo.

119

Java-Felder und Objekte vergleichen

Java-Objekte vergleichen
Um zwei Objekte desselben Typs zu vergleichen, mssen Sie eine compareTo-Methode implementieren: Damit Spalten mit Java-Datentypen als Primrschlssel, Indizes oder eindeutige Spalten verwendet werden knnen, muss die Spaltenklasse eine compareTo-Methode implementieren. Um die Klauseln ORDER BY, GROUP BY oder DISTINCT in einer Abfrage verwenden zu knnen, mssen die Werte der Spalte verglichen werden. Die Spaltenklasse muss eine compareTo-Methode haben, damit alle diese Klauseln gltig sind. Funktionen, die Vergleiche verwenden, wie MAX und MIN, knnen nur mit einer Java-Klasse benutzt werden, die eine compareTo-Methode hat.

Anforderungen der "compareTo"Methode

Die compareTo-Methode muss folgende Eigenschaften haben:


Bereich Die Methode muss extern sichtbar und daher eine ffentliche

Methode sein.
Argumente Die Methode bernimmt ein einzelnes Argument, das ein Objekt des aktuellen Typs ist. Das aktuelle Objekt wird mit dem gelieferten Objekt verglichen. Beispiel: Product.compareTo hat folgendes Argument: compareTo( Produkt AnderesProdukt )

Die Methode vergleicht das Objekt AnderesProdukt vom Typ "Produkt" mit dem aktuellen Objekt.
Rckgabewerte Die Methode "compareTo" muss einen int-Datentyp

mit folgenden Bedeutungen zurckgeben:


Negative Ganzzahl Das aktuelle Objekt ist geringer als das

gelieferte Objekt. Es wird empfohlen, dass Sie fr diesen Fall -1 zurckgeben, um die Kompatibilitt mit "compareTo"-Methoden in Basis-Java-Klassen zu gewhrleisten.
Ziffer Null Das aktuelle Objekt hat denselben Wert wie das

gelieferte Objekt.
Positive Ganzzahl Das aktuelle Objekt ist grer als das gelieferte Objekt. Es wird empfohlen, dass Sie fr diesen Fall 1 zurckgeben, um die Kompatibilitt mit "compareTo"-Methoden in Basis-JavaKlassen zu gewhrleisten.

Beispiel

Die Klasse Product, die mit den Beispielklassen in der Beispieldatenbank installiert wird, hat eine compareTo-Methode der folgenden Art:

120

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(); int rVal = anotherProduct.unit_price.intValue(); if ( lVal > rVal ) { return 1; } else if (lVal < rVal ) { return -1; } else { return toString().compareTo( anotherProduct.toString() );{ } } }

Diese Methode vergleicht den Einheitspreis jedes Objekts. Wenn die Einheitspreise identisch sind, werden die Namen verglichen (mit JavaZeichenfolgenvergleichen, nicht mit Datenbank-Zeichenfolgenvergleichen). Nur wenn der Einheitspreis und der Name gleich sind, werden die beiden Objekte beim Vergleich als identisch angesehen. Methoden "toString" und "compareTo" kompatibel machen Wenn Sie eine Java-Spalte in die Auswahlliste einbeziehen und in Interactive SQL ausfhren, wird der Wert der Methode toString zurckgegeben. Wenn Sie Spalten vergleichen, wird die Methode compareTo verwendet. Wenn die Methoden toString und compareTo nicht konsistent implementiert sind, kann es zu unvorhergesehenen Ergebnissen kommen, wie DISTINCTAbfragen, die augenscheinlich Duplikat-Zeilen zurckgeben. Als Beispiel nehmen wir an, dass die Klasse "Product" in der Beispieldatenbank eine Methode toString hat, die den Produktnamen zurckgibt, und eine Methode compareTo, die auf dem Preis basiert. Die folgende, in Interactive SQL eingegebene Abfrage wrde in diesem Fall Doppelwerte ausgeben:
SELECT DISTINCT JProd FROM product JProd Tee Shirt Tee Shirt Baseball Cap Visor Sweatshirt Shorts

121

Java-Felder und Objekte vergleichen


Hier wird der angezeigte Rckgabewert durch toString festgelegt. Das DISTINCT-Schlsselwort eliminiert Duplikate, wie von compareTo festgelegt. Da hier eine Implementierung der Methoden vorliegt, die die Beziehungen untereinander nicht bercksichtigt, sieht es so aus, als wrden Duplikatzeilen zurckgegeben.

122

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, die in einer Datenbank eingesetzt werden.

Untersttzte Klassen
Sie knnen nicht alle Klassen aus dem JDK verwenden. Die JavaLaufzeitklassen, die fr den Einsatz in einem Datenbankserver verfgbar sind, gehren zu einer Teilmenge der Java-API.

$ Weitere Hinweise ber untersttzte Pakete finden Sie unter


"Untersttzte Java-Pakete" auf Seite 87 der Dokumentation ASA SQLReferenzhandbuch.

Hauptmethode (main) verwenden


Sie starten Java-Anwendungen (auerhalb der Datenbank), indem Sie die Java VM mit einer Klasse ausfhren, die eine main-Methode hat. Zum Beispiel hat die Klasse JDBCExamples in der Datei Samples\ASA\Java\JDBCExamples.java in Ihrem SQL AnywhereVerzeichnis eine Hauptmethode (main). Wenn Sie die Klasse von der Befehlszeile aus mit einem Befehl wie dem folgenden ausfhren, wird die Hauptmethode (main) ausgefhrt:
java JDBCExamples

$ Hinweise ber das Ausfhren der Klasse JDBCExamples finden Sie


unter "JDBC-Verbindungen herstellen" auf Seite 157.
v So wird die Hauptmethode (main) einer Klasse von SQL aus aufgerufen:

Deklarieren Sie die Methode mit einem Array von Zeichenfolgen als Argument.
public static void main( java.lang.String[] args ){ ... }

Rufen Sie die Methode main mit der CALL-Anweisung auf.

123

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. Beispiel Die folgende Klasse enthlt eine main-Methode, die die Argumente in umgekehrter Reihenfolge ausgibt:
public class ReverseWrite { public static void main( String[] args ){ int i: for( i = args.length; i > 0 ; i-- ){ System.out.print( args[ i-1 ] ); } } }

Sie knnen diese Methode aus SQL wie folgt ausfhren:


call ReverseWrite.main( one, two, three )

Das Datenbankserver-Fenster zeigt die Ausgabe:


three two one

Threads in Java-Anwendungen verwenden


Sie knnen mehrere Threads in einer Java-Anwendung benutzen, indem Sie Funktionen des Pakets java.lang.Thread einsetzen. Jeder Java-Thread ist ein Engine-Thread und wird aus der Menge der zulssigen Threads gem der Option -gn des Datenbankservers bezogen. Sie knnen Threads in Java-Anwendungen synchronisieren, vorlufig aussetzen, wieder aufnehmen, unterbrechen oder stoppen.

$ Hinweise zu Datenbankserver-Threads finden Sie unter "gnServeroption" auf Seite 158 der Dokumentation ASA Datenbankadministration. Serialisierung von JDBC-Aufrufen Alle Aufrufe zum serverseitigen JDBC-Treiber sind serialisiert, sodass nur ein Thread jeweils JDBC ausfhrt.

Fehler "Prozedur nicht gefunden"


Wenn Sie eine falsche Anzahl von Argumenten fr den Aufruf einer JavaMethode eingeben oder einen falschen Datentyp verwenden, antwortet der Server mit der Fehlermeldung Prozedur nicht gefunden. Prfen Sie in diesem Fall Anzahl und Typ der Argumente.

124

Kapitel 4 Java in der Datenbank benutzen

$ Eine Liste der Datentypkonvertierungen zwischen SQL und Java finden


Sie unter "Umwandlung von JAVA- in SQL-Datentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch.

Rckgabewert von Methoden, die "void" zurckgeben


Sie knnen Java-Methoden in SQL-Anweisungen berall dort verwenden, wo Sie einen Ausdruck benutzen knnen. Sie mssen dafr Sorge tragen, dass der Rckgabe-Datentyp der Java-Methode zum entsprechenden SQLDatentyp passt.

$ Weitere Hinweise ber Zuordnungen von Java- und SQL-Datentypen


finden Sie unter "Umwandlung von JAVA- in SQL-Datentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch. Wenn eine Methode jedoch eine leere Menge zurckgibt, wird der Wert this an SQL zurckgegeben, d.h. das Objekt selbst. Die Funktion betrifft nur Aufrufe, die von SQL aus ausgefhrt werden, nicht von Java aus. Diese Funktion ist besonders gut in UPDATE-Anweisungen einsetzbar, in denen set-Methoden in der Regel "void" zurckgeben. Sie knnen die folgende UPDATE-Anweisung in der Beispieldatenbank benutzen:
update jdba.product set JProd = JProd.setName(Tank Top) where id=302

Die Methode setName gibt "void" und daher implizit das Objekt "Product" an SQL zurck.

Ergebnismengen aus Java-Methoden zurckgeben


Dieser Abschnitt beschreibt, wie Ergebnismengen aus Java-Methoden verfgbar gemacht werden. Sie mssen eine Java-Methode schreiben, die eine Ergebnismenge an die aufrufende Umgebung zurckgibt, und diese Methode in eine in SQL geschriebene gespeicherte Prozedur einbauen, die als EXTERNAL NAME of LANGUAGE JAVA deklariert sein muss.
v So werden Ergebnismengen aus einer Java-Methode zurckgegeben:

1 2

Achten Sie darauf, dass die Java-Methode als ffentlich und statisch in einer ffentlichen Klasse deklariert wird. Fr jede Ergebnismenge, die die Methode zurckgeben soll, muss die Methode einen Parameter vom Typ java.sql.ResultSet[] haben. Diese Ergebnismengen-Parameter mssen am Ende der Parameterliste stehen. 125

Besondere Funktionen von Java-Klassen in der Datenbank


3 4 In der Methode erstellen Sie erst eine Instanz von java.sql.ResultSet und ordnen sie dann einem der ResultSet[]-Parameter zu. Erstellen Sie eine in SQL geschriebene gespeicherte Prozedur des Typs EXTERNAL NAME LANGUAGE JAVA. Dieser Prozedurtyp ist ein Mantel fr eine Java-Methode. Sie knnen einen Cursor fr die Ergebnismenge der SQL-Prozedur auf dieselbe Weise verwenden wie jede andere Prozedur, die Ergebnismengen zurckgibt.

$ Hinweise zur Syntax fr gespeicherte Prozeduren, die als Mantel


fr Java-Methoden verwendet werden, finden Sie unter "CREATE PROCEDURE-Anweisung" auf Seite 331 der Dokumentation ASA SQLReferenzhandbuch. Beispiel Die folgende Beispielklasse hat eine einzige Methode, die eine Abfrage ausfhrt und die Ergebnismenge an die aufrufende Umgebung zurckgibt.
import java.sql.*; public class MyResultSet { public static void return_rset( ResultSet[] rset1 ) throws SQLException { Connection conn = DriverManager.getConnection( "jdbc:default:connection" ); Statement stmt = conn.createStatement(); ResultSet rset = stmt.executeQuery ( "SELECT CAST( JName.lastName " + "AS CHAR( 50 ) )" + "FROM jdba.contact " ); rset1[0] = rset; } }

Die Ergebnismenge wird in SQL mit der Anweisung CREATE PROCEDURE exponiert, womit die Anzahl der von der Prozedur zurckgegebenen Ergebnismengen und die Signatur der Java-Methode angezeigt werden. Eine Anweisung vom Typ CREATE PROCEDURE, die eine Ergebnismenge anzeigt, knnte wie folgt definiert werden:
CREATE PROCEDURE result_set() DYNAMIC RESULT SETS 1 EXTERNAL NAME MyResultSet.return_rset ([Ljava/sql/ResultSet;)V LANGUAGE JAVA

Ein Cursor kann fr diese Prozedur genauso wie fr andere ASA-Prozeduren geffnet werden, die Ergebnismengen zurckgeben.

126

Kapitel 4 Java in der Datenbank benutzen


Die Zeichenfolge (Ljava/sql/ResultSet;)V ist eine Java-Methodensignatur, also eine kompakte Zeichendarstellung der Anzahl und der Typen der Parameter und Rckgabewerte.

$ Weitere Hinweise zu Java-Methodensignaturen finden Sie unter


"CREATE PROCEDURE-Anweisung" auf Seite 331 der Dokumentation ASA SQL-Referenzhandbuch.

Rckgabe von Werten aus Java ber gespeicherte Prozeduren


Sie knnen gespeicherte Prozeduren, die mit EXTERNAL NAME LANGUAGE JAVA erstellt wurden, als Mantel fr Java-Methoden verwenden. In diesem Abschnitt wird beschrieben, wie Sie Ihre JavaMethode so schreiben, dass OUT- oder INOUT-Parameter in der gespeicherten Prozedur benutzt werden knnen. Java hat keine explizite Untersttzung fr INOUT- oder OUT-Parameter. Anstelle dessen knnen Sie ein Array des Parameters verwenden. Beispiel: Um einen Ganzzahl-OUT-Parameter zu benutzen, erstellen Sie ein Array von genau einer Ganzzahl:
public class TestClass { public static boolean testOut( int[] param ){ param[0] = 123; return true; } }

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, die anzeigt, dass die Methode einen einzelnen Parameter hat, der ein Array von Ganzzahlen darstellt und einen Boolschen Wert zurckgibt. Sie mssen die Methoden so definieren, damit der Methodenparameter, den Sie als OUT- oder INOUTParameter verwenden wollen, ein Array eines Java-Datentyps ist, der dem SQL-Datentyp des OUT- oder INOUT-Parameters entspricht.

$ Hinweise zur Syntax, einschlielich der Methodensignatur, finden Sie


unter "CREATE PROCEDURE-Anweisung" auf Seite 331 der Dokumentation ASA SQL-Referenzhandbuch.

$ Weitere Hinweise finden Sie unter "Umwandlung von JAVA- in SQLDatentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch.

127

Besondere Funktionen von Java-Klassen in der Datenbank

Sicherheits-Management fr Java
Java bietet Sicherheits-Manager, die Sie zur Steuerung des Benutzerzugriffs auf vertrauliche Funktionen Ihrer Anwendungen, wie etwa Dateizugriff und Netzwerkzugriff, einsetzen knnen. Adaptive Server Anywhere bietet die folgende Untersttzung fr Java-Sicherheitsmanager in der Datenbank: Adaptive Server Anywhere liefert einen standardmigen SicherheitsManager. Sie knnen Ihren eigenen Sicherheitsmanager stellen.

$ Hinweise dazu finden Sie unter "Eigenen Sicherheits-Manager


implementieren" auf Seite 129. Der StandardSicherheitsManager Der standardmige Sicherheits-Manager ist die Klasse com.sybase.asa.jrt.SAGenericSecurityManager. Er fhrt die folgenden Aufgaben durch: 1 2 3 4 5 Er prft den Wert der Datenbankoption JAVA_INPUT_OUTPUT. Er prft, ob der Datenbankserver mit der Datenbankserveroption -sc im C2-Sicherheitsmodus gestartet wurde. Falls die Verbindungseigenschaft auf OFF steht, wird damit der Zugriff auf Java-Datei-I/O-Funktionen deaktiviert. Wenn der Datenbankserver im C2-Sicherheitsmodus luft, wird der Zugriff auf java.net-Pakete verwehrt. Wenn der Sicherheits-Manager einen Benutzer am Zugriff auf eine Funktion hindert, wird eine java.lang.SecurityException zurckgegeben.

$ Weitere Hinweise finden Sie unter "JAVA_INPUT_OUTPUT-Option"


auf Seite 642 der Dokumentation ASA Datenbankadministration, und "scServeroption" auf Seite 167 der Dokumentation ASA Datenbankadministration. Java-Datei-I/OVorgnge mit dem standardmigen SicherheitsManager steuern Die Java-Datei-I/O-Vorgnge werden ber die Datenbankoption JAVA_INPUT_OUTPUT gesteuert. Standardmig wird diese Option auf OFF gesetzt, sodass Datei-I/O-Vorgnge nicht zulssig sind.
v So wird der Dateizugriff mit dem standardmigen SicherheitsManager zugelassen:

Setzen Sie die Option JAVA_INPUT_OUTPUT auf ON:


SET OPTION JAVA_INPUT_OUTPUT=ON

128

Kapitel 4 Java in der Datenbank benutzen

Eigenen Sicherheits-Manager implementieren


Ein eigener Sicherheits-Manager wird mit mehreren Schritten implementiert.
v So wird Ihr eigener Sicherheits-Manager verfgbar gemacht:

Implementieren Sie eine Klasse, die java.lang.SecurityManager erweitert. Die Klasse SecurityManager umfasst eine Reihe von Methoden, die prfen, ob ein bestimmter Vorgang zulssig ist. Falls die Aktion zulssig ist, kehrt die Methode stillschweigend zurck. Falls die Methode einen Wert zurckgibt, wird eine SecurityException ausgegeben. Sie mssen Methoden aufheben, die Aktionen mit stillschweigend zurckkehrenden Methoden steuern. Sie knnen dies durch Implementieren einer Methode public void erreichen.

Ordnen Sie Ihrem Sicherheits-Manager die betreffenden Benutzer zu. Verwenden Sie die gespeicherten Systemprozeduren add_user_security_manager, update_user_security_manager und delete_user_security_manager, um einem Benutzer SicherheitsManager zuzuordnen. Wenn Sie z.B. die Klasse MeinSicherheitsManager einem Benutzer als Sicherheits-Manager zuordnen wollen, wrden Sie den folgenden Befehl ausfhren.
call dbo.add_user_security_manager( Benutzername, MeinSicherheitsManager, NULL )

Beispiel

Mit der folgenden Klasse knnen Sie das Lesen aus Dateien zulassen, jedoch das Schreiben untersagen:
public class MeinSicherheitsManager extends SecurityManager { public void checkRead(FileDescriptor) {} public void checkRead(String) {} public void checkRead(String, Object) {} }

Die Methoden SecurityManager.checkWrite werden nicht aufgehoben und verhindern Schreibvorgnge in den Dateien. Die Methoden checkRead kehren stillschweigend zurck und lassen die Aktion zu.

129

So werden Java-Objekte gespeichert

So werden Java-Objekte gespeichert


Java-Werte werden in serialisierter Form gespeichert. Das bedeutet, dass jede Zeile folgende Informationen enthlt: Einen Versionsbezeichner Einen Bezeichner fr die Klasse (oder Unterklasse), die gespeichert wird Die Werte von nicht-statischen, nicht-zeitweiligen Feldern in der Klasse Andere Overhead-Informationen

Die Klassendefinition wird nicht fr jede Zeile gespeichert. Anstelle dessen enthlt der Bezeichner eine Referenz auf die Klassendefinition, die nur einmal gehalten wird. Sie knnen Java-Objekte verwenden, ohne im Detail zu wissen, wie diese Elemente zusammenwirken, aber die Art der Speicherung dieser Objekte hat einige Auswirkungen auf die Verarbeitungsleistung. Daher werden diese Informationen hier etwas genauer ausgefhrt. Hinweise
Plattenspeicher Der Overhead pro Zeile ist 10 bis 15 Byte. Falls die

Klasse nur ber eine Variable verfgt, kann der erforderliche Overhead dem fr die Variable hneln. Falls die Klasse viele Variablen umfasst, kann der Overhead vernachlssigt werden.
Performance Wenn Sie einen Java-Wert einfgen oder aktualisieren,

muss die Java VM ihn serialisieren. Jedes Mal, wenn ein Java-Wert in einer Abfrage abgerufen wird, muss er von der VM deserialisiert werden. Dies kann bedeutende Performanceeinbuen verursachen. Sie knnen die Performanceeinbuen fr Abfragen vermeiden, indem Sie berechnete Spalten verwenden.
Indizieren Indizes auf Java-Spalten sind nicht sehr selektiv und bieten

nicht die Performancevorteile wie Indizes auf einfachen SQLDatentypen.


Serialisierung Wenn eine Klasse eine readObject- oder writeObjectMethode hat, wird diese beim Serialisieren oder Deserialisieren der Instanz aufgerufen. Der Einsatz einer readObject- oder writeObjectMethode kann sich auf die Performance auswirken, weil die Java VM aufgerufen wird.

130

Kapitel 4 Java in der Datenbank benutzen

Java-Objekte und Klassenversionen


Java-Objekte, die in der Datenbank gespeichert werden, sind bestndig - d.h. sie bestehen, auch wenn kein Programmcode luft. Das bedeutet, dass Sie folgende Aktionen ausfhren knnen: 1 2 3 4 Installieren Sie eine Klasse. Tabelle mit dieser Klasse als Datentyp fr eine Spalte erstellen Zeilen in die Tabelle einfgen Neue Version der Klasse installieren

Funktionsweise der bestehenden Zeilen mit der neuen Version der Klasse Zugriff auf Zeilen, wenn eine Klasse aktualisiert wird Adaptive Server Anywhere sieht eine Form der Evidenzhaltung von Klassenversionen vor, die es ermglicht, dass die neue Klasse mit den alten Zeilen arbeiten kann. Die Regeln fr den Zugriff auf diese lteren Werte lauten wie folgt: Wenn ein serialisierbares Feld in der alten Version der Klasse vorhanden ist, aber in der neuen Version fehlt oder nicht serialisierbar ist, wird das Feld ignoriert. Wenn ein serialisierbares Feld in der neuen Version der Klasse vorhanden ist, aber in der alten Version fehlt oder nicht serialisierbar war, wird das Feld auf einen Standardwert initialisiert. Der Standardwert ist 0 fr native Typen, "false" fr Boolesche Werte, und "NULL" fr Objektreferenzen. Wenn eine berklasse der alten Version vorhanden war, die nicht eine berklasse der neuen Version ist, werden die Daten fr diese berklasse ignoriert. Wenn eine berklasse der neuen Version vorhanden ist, die nicht eine berklasse der alten Version war, werden die Daten fr diese berklasse auf Standardwerte initialisiert. Wenn ein serialisierbares Feld zwischen der lteren Version und der neueren Version den Typ ndert, wird das Feld auf Standardwerte initialisiert. Typenkonvertierungen werden nicht untersttzt - dies ist kompatibel mit der Sun Microsystems-Serialisierung.

Unzugngliche Objekte

Ein serialisiertes Objekt ist nicht zugnglich, wenn die Klasse des Objekts oder eine ihrer berklassen zu irgendeinem Zeitpunkt aus der Datenbank entfernt wurde. Dieses Verhalten ist kompatibel mit der Sun MicrosystemsSerialisierung.

131

So werden Java-Objekte gespeichert

Objekte zwischen Datenbanken verschieben

Diese nderungen machen die Verschiebung von Objekten zwischen Datenbanken mglich, auch wenn die Versionen der Klassen voneinander abweichen. Die Verschiebung ber Datenbanken kann wie nachstehend beschrieben erfolgen: Objekte werden in eine entfernte Datenbank verlegt. Eine Tabelle mit Objekten wird entladen und dann in eine andere Datenbank eingelesen. Eine Logdatei mit Objekten wird bersetzt und in einer anderen Datenbank angewendet.

Wann die neue Klasse benutzt wird

Die Klassendefinition fr jede Klasse wird durch die VM jeder Verbindung geladen, wenn die Klasse zum ersten Mal benutzt wird. Wenn Sie eine Klasse installieren, wird die VM auf Ihrer Verbindung implizit gestartet. Daher haben Sie sofort Zugang zu der neuen Klasse. Fr andere Verbindungen als diejenige, die die INSTALL-Anweisung ausfhrt, wird die neue Klasse das nchste Mal geladen, wenn die VM auf die Klasse zugreift. Wenn die Klasse von einer VM bereits geladen ist, sieht diese Verbindung die neue Klasse erst, wenn die VM fr diese Verbindung neu gestartet wird (zum Beispiel mit STOP JAVA und START JAVA).

132

Kapitel 4 Java in der Datenbank benutzen

Java-Datenbankdesign
Fr das Design Ihrer relationalen Datenbanken gibt es einen umfangreichen theoretischen und praktischen Erfahrungsschatz. Sie knnen Beschreibungen zum Design von Entittsbeziehungen und andere Anstze nicht nur in einleitender Form (siehe "Planung Ihrer Datenbank" auf Seite 3 der Dokumentation ASA SQL-Benutzerhandbuch), sondern auch in der Literatur fr fortgeschrittene Anwender finden. Eine derartige Vielfalt ist fr die Theorie und Praxis von objekt-relationalen Datenbanken nicht vorhanden, und dies gilt umso mehr fr Java-relationale Datenbanken. Im Folgenden finden Sie einige Vorschlge fr den Einsatz von Java zur Erweiterung des praktischen Einsatzes relationaler Datenbanken.

Entitten und Attribute in relationalen und objektorientierten Daten


Beim Design relationaler Datenbanken beschreibt jede Tabelle eine Entitt. Beispiel: In der Beispieldatenbank gibt es Tabellen mit dem Namen Employee, Customer, Sales_order und Department. Die Attribute dieser Entitten werden zu den Spalten der Tabelle: Adressen der Mitarbeiter, Kundennummern, Bestellnummern, und so weiter. Jede Zeile in der Tabelle kann als getrennte Instanz der Entitt bezeichnet werden - ein bestimmter Mitarbeiter, eine Bestellung eine Abteilung. Beim objektorientierten Programmieren beschreibt jede Klasse eine Entitt, und die Methoden und Felder dieser Klasse beschreiben die Attribute der Entitt. Jede Instanz der Klasse (jedes Objekt) enthlt eine eigene Instanz der Entitt. Es scheint daher unnatrlich, dass relationale Spalten auf Java-Klassen basieren. Eine natrlichere Entsprechung liegt zwischen Tabellen und Klassen vor.

Entitten und Attribute in der realen Welt


Die Unterscheidung zwischen Entitt und Attribut scheint klar, aber bei nherem Hinsehen zeigt sich, dass sie in der Praxis nicht ganz so eindeutig ausfllt. Eine Adresse kann als Attribut eines Kunden gesehen werden, ist aber auch eine Entitt, die als eigene Attribute die Strae, Stadt etc. hat. Ein Preis kann als Attribut eines Produkts gesehen werden, ist aber auch eine Entitt mit den Attributen "Summe" und "Whrung". 133

Java-Datenbankdesign

Der Sinn der objektrelationalen Datenbank ist genau in diesem Faktum zu suchen, nmlich dass es zwei Mglichkeiten gibt, Entitten auszudrcken. Sie knnen einige Entitten als Tabellen, und andere Entitten als Klassen in einer Tabelle ausdrcken. Im nchsten Abschnitt wird ein Beispiel erlutert.

Einschrnkungen der relationalen Datenbanken


Stellen Sie sich ein Versicherungsunternehmen vor, das berblick ber seine Kunden behalten will. Ein Kunde kann als Entitt angesehen werden, sodass es sinnvoll ist, eine einzelne Tabelle zu entwerfen, in der alle Kunden der Gesellschaft enthalten sind. Nun werden aber von Versicherungsgesellschaften verschiedene Arten von Kunden betreut. Es gibt die Policeninhaber, die Begnstigten und Personen, die die Prmien zu bezahlen haben. Fr alle diese Kundentypen bentigt die Versicherungsgesellschaft verschiedene Informationen. Fr den Begnstigten braucht sie eigentlich nicht viel mehr als die Adresse. Fr den Policeninhaber sind Informationen ber den Gesundheitszustand erforderlich. Fr den Prmienzahler braucht man zustzliche Finanzinformationen fr die steuerlichen Aspekte. Ist es besser, diese unterschiedlichen Kundentypen als unterschiedliche Entitten zu behandeln, oder als Attribut des Kunden? Bei beiden Anstzen gibt es Einschrnkungen: Wenn fr jeden Kundentyp eine eigene Tabelle eingerichtet wird, kann das Datenbankdesign sehr unbersichtlich werden, und beim Abfragen von Informationen zu allen Kunden mssen mehrere Tabellen durchsucht werden. Und wenn eine einzelne Kundentabelle verwendet wird, ist es nicht einfach, sicherzustellen, dass fr jeden Kunden die richtigen Informationen eingegeben werden. Das Einrichten von Spalten, die fr einige Kunden nullwertfhig sind, fr andere aber nicht, ermglicht die richtige Dateneingabe, erzwingt sie aber nicht. Es gibt in relationalen Datenbanken keine einfache Methode, das Standardverhalten an ein Attribut der neuen Dateneingabe zu binden.

Mit Klassen bestimmte Einschrnkungen relationaler Datenbanken berwinden


Sie knnen eine einzelne Kundentabelle verwenden, wobei fr einige Informationen Java-Klassenspalten benutzt werden, um die Begrenzungen relationaler Datenbanken zu berwinden. 134

Kapitel 4 Java in der Datenbank benutzen


Beispiel: Nehmen wir an, Sie brauchen fr die Policeninhaber andere Kontaktinformationen als fr die Begnstigten. Sie knnen dieses Problem lsen, indem Sie eine Spalte definieren, die auf der Klasse Kontaktinformation basiert. Dann definieren Sie Klassen mit den Namen PolicenhalterKontaktdaten und BegnstigterKontaktdaten, die Unterklassen der Klasse Kontaktdaten sind. Indem Sie neue Kunden nach ihrem Typ eingeben, knnen Sie sicherstellen, dass die richtigen Informationen eingegeben werden.

Abstraktionsebenen fr relationale Daten


Daten in einer relationalen Datenbank knnen nach Zweck kategorisiert werden. Welche Daten gehren in eine Java-Klasse, und welche sollten besser in einer einfachen Datentyp-Spalte eingegeben werden?
Spalten fr die referenzielle Integritt Primrschlsselspalten und

Fremdschlsselspalten haben gemeinsame Identifizierungsnummern. Diese Identifizierungsnummern knnen als referenzielle Daten bezeichnet werden. Ihr Hauptzweck ist die Definition der Struktur der Datenbank und die Definition der Beziehungen zwischen Tabellen. Referenzielle Daten gehren im Allgemeinen nicht in Java-Klassen. Obwohl Sie aus einer Java-Klassenspalte eine Primrschlsselspalte machen knnen, sind Ganzzahlen und andere einfache Datentypen fr diesen Zweck besser geeignet.
Indizierte Daten Spalten, die im Allgemeinen indiziert werden, werden

ebenfalls nicht in Java-Klassen angelegt. Allerdings ist die Trennlinie zwischen Daten, die indiziert werden sollen, und solchen, bei denen dies nicht erforderlich ist, eher unscharf. Bei berechneten Spalten knnen Sie selektiv ein Java-Feld oder eine Java-Methode (bzw. auch einen anderen Ausdruck) indizieren. Wenn Sie eine Java-Klassenspalte definieren und dann feststellen, dass es sinnvoll wre, sie auf ein Feld oder eine Methode dieser Spalte zu indizieren, knnen Sie berechnete Spalten verwenden, um aus diesem Feld oder dieser Methode eine eigene Spalte zu erstellen.

$ Weitere Hinweise finden Sie unter "Berechnete Spalten mit JavaKlassen verwenden" auf Seite 137.
Beschreibende Daten In jeder Zeile gibt es im Allgemeinen auch

beschreibende Daten. Solche Daten werden fr die referenzielle Integritt nicht verwendet, meist nicht indiziert, aber hufig in Abfragen verwendet. Bei einer Mitarbeitertabelle knnen dies Daten wie Einstellungsdatum, Adresse, Vergnstigungen, Gehalt usw. sein. Fr diese Daten kann es hufig von Vorteil sein, wenn sie in weniger Spalten vom Typ Javaklasse kombiniert werden. 135

Java-Datenbankdesign

Java-Klassen sind fr die Abstraktion auf einer Ebene zwischen der der einzelnen relationalen Spalte und der relationalen Tabelle ntzlich.

136

Kapitel 4 Java in der Datenbank benutzen

Berechnete Spalten mit Java-Klassen verwenden


Berechnete Spalten sind ein Merkmal, das entwickelt wurde, um das Design von Java-Datenbanken einfacher zu gestalten, damit Java-Funktionen in bestehenden Datenbanken besser genutzt werden knnen, und um die Performance von Java-Datentypen zu verbessern. Eine berechnete Spalte ist eine Spalte, deren Werte aus anderen Spalten ausgewertet werden. Sie knnen in berechneten Spalten kein INSERT und kein UPDATE durchfhren. Eine UPDATE-Anweisung, die versucht, den Wert einer berechneten Spalte zu ndern, lst aber Trigger aus, die mit der Spalte verbunden sind. Einsatzbereich berechneter Spalten Es gibt zwei Haupteinsatzgebiete fr berechnete Spalten mit Java-Klassen:
Java-Spalte aufgliedern Wenn Sie eine Spalte mit einem Java-Klassen-

Datentyp erstellen, knnen Sie mit berechneten Spalten eines der Felder einer Klasse indizieren. Sie knnen eine berechnete Spalte hinzufgen, die den Wert des Feldes enthlt, und daher einen Index auf dieses Feld erstellen.
Java-Spalte einer relationalen Tabelle hinzufgen Wenn Sie einige

der Funktionen von Java-Klassen nutzen, aber in die bestehende Datenbank so wenig wie mglich eingreifen wollen, knnen Sie JavaSpalten als berechnete Spalten hinzufgen, die ihre Werte aus anderen Spalten in der Tabelle beziehen.

Berechnete Spalten festlegen


Berechnete Spalten werden in den Anweisungen CREATE TABLE oder ALTER TABLE deklariert. Tabellen mit berechneten Spalten erstellen Die folgende CREATE TABLE-Anweisung wird benutzt, um die Tabelle product in den Java-Beispieltabellen zu erstellen:
CREATE TABLE product ( id INTEGER NOT NULL, JProd asademo.Product NOT NULL, name CHAR(15) COMPUTE ( JProd>>name ), PRIMARY KEY ("id") )

137

Berechnete Spalten mit Java-Klassen verwenden

Berechnete Spalten zu Tabellen hinzufgen Ausdruck fr berechnete Spalten ndern

Die folgende Anweisung ndert die Tabelle product, indem eine weitere berechnete Spalte hinzugefgt wird:
ALTER TABLE product ADD inventory_Value INTEGER COMPUTE ( JProd.quantity * JProd.unit_price )

Sie knnen mit der Anweisung ALTER TABLE den Ausdruck ndern, der in einer berechneten Spalte verwendet wird. Die folgende Anweisung ndert den Ausdruck, auf der eine berechnete Spalte basiert:
ALTER TABLE Tabellenname ALTER Spaltenname SET COMPUTE ( Ausdruck )

Die Spalte wird neu berechnet, wenn diese Anweisung ausgefhrt wird. Wenn der neue Ausdruck ungltig ist, schlgt die ALTER TABLEAnweisung fehl. Die folgende Anweisung macht aus einer berechneten Spalte wieder eine normale Spalte.
ALTER TABLE Tabellenname ALTER Spaltenname DROP COMPUTE

Wenn Sie diese Anweisung ausfhren, werden die Werte in der Spalte nicht verndert.

Berechnete Spalten einfgen und aktualisieren


Berechnete Spalten haben Auswirkungen auf die Gltigkeit von INSERT und UPDATE. Die Tabelle jdba.product in den Java-Beispieltabellen hat eine berechnete Spalte (name), die wir zur Erluterung dieses Problemfeldes heranziehen. Die Tabellendefinition lautet wie folgt:
CREATE TABLE "jdba"."product" ( "id" INTEGER NOT NULL, "JProd" asademo.Product NOT NULL, "name" CHAR(15) COMPUTE( JProd.name ), PRIMARY KEY ("id") )

Keine direkten Einfgungen oder Aktualisierungen Sie knnen in

eine berechnete Spalte keinen Wert direkt einfgen. Die folgende Anweisung schlgt mit der Fehlermeldung Duplikat beim Einfgen in eine Spalte fehl.
-- Falsche Anweisung INSERT INTO PRODUCT (id, name) VALUES( 3006, bad insert statement )

138

Kapitel 4 Java in der Datenbank benutzen


Eine UPDATE-Anweisung kann eine berechnete Spalte nicht direkt aktualisieren.
Auflisten von Spaltennamen Sie mssen in INSERT-Anweisungen fr Tabellen mit berechneten Spalten immer die Spaltennamen angeben. Die folgende Anweisung schlgt mit der Fehlermeldung Falsche Anzahl von Werten fr INSERT fehl: -- Falsche Anweisung INSERT INTO PRODUCT VALUES( 3007,new asademo.Product() )

Anstelle dessen mssen Sie die Spalten wie folgt auflisten:


INSERT INTO PRODUCT( id, JProd ) VALUES( 3007,new asademo.Product() )

Trigger Sie knnen Trigger fr eine berechnete Spalte definieren, damit ein INSERT oder UPDATE in diesen Spalten den Trigger auslst.

Zeitpunkt der Neuberechnung von Spalten


Die berechneten Spalten werden unter folgenden Bedingungen neu berechnet: Eine Spalte wird gelscht, hinzugefgt oder umbenannt. Die Spalte wird umbenannt. Der Datentyp oder die COMPUTE-Klausel einer Spalte wird gendert. Eine Zeile wird eingefgt. Eine Zeile wird aktualisiert.

Berechnete Spalten werden nicht neu berechnet, wenn sie abgefragt werden. Wenn Sie einen Ausdruck verwenden, der zeitabhngig ist oder in anderer Weise vom Status der Datenbank abhngt, bringt die berechnete Spalte mglicherweise nicht das gewnschte Ergebnis.

139

Speicher fr Java konfigurieren

Speicher fr Java konfigurieren


In diesem Abschnitt wird beschrieben, welche Speichererfordernisse fr Java in der Datenbank bestehen, und wie Sie Ihren Server so einrichten, dass diese Anforderungen erfllt werden. Die Java VM bentigt viel Cachespeicher.

$ Hinweise zur Optimierung des Caches finden Sie unter "Performance


durch den Einsatz eines Cachespeichers steigern" auf Seite 170 der Dokumentation ASA SQL-Benutzerhandbuch. Datenbank und Verbindung Die Java VM benutzt Speicher sowohl pro Datenbank, als auch pro Verbindung. Der erforderliche Speicher fr die Datenbank ist nicht auslagerbar: Die Seiten knnen nicht auf die Festplatte ausgelagert werden. Sie mssen in den Servercache passen. Dieser Typ des Speichers ist nicht fr den Server vorgesehen, sondern fr jede Datenbank. Wenn Sie die Cacheerfordernisse berechnen wollen, mssen Sie die Erfordernisse fr jede Datenbank zusammenzhlen, die auf dem Server laufen soll. Der erforderliche Speicher pro Verbindung ist auslagerbar, aber nur als Einheit. Der erforderliche Speicher fr eine Verbindung ist entweder komplett im Cache oder komplett in einer temporren Datei.

Speicherbelegung
Java in der Datenbank bentigt Speicher fr verschiedene Zwecke: Wenn Java auf einem laufenden Server zum ersten Mal benutzt wird, holt das System die VM in den Speicher. Die VM braucht dort ca. 1,5 MByte Platz. Dieser Speicherbedarf wird in den erforderlichen Speicher fr die Datenbank eingerechnet. Eine zustzliche VM wird fr jede Datenbank geladen, die Java benutzt. Fr jede Verbindung, die Java benutzt, wird eine neue Instanz der VM fr diese Verbindung geladen. Die neue Instanz bentigt ca. 200 KByte pro Verbindung. Jede in einer Java-Anwendung benutzte Klassendefinition wird in den Speicher geladen. Sie wird im Datenbankspeicher untergebracht: Getrennte Kopien sind fr die einzelnen Verbindungen nicht erforderlich. Jede Verbindung bentigt eine arbeitende Gruppe von Java-Variablen und Anwendungs-Stack-Speicherplatz fr Methodenargumente etc.).

140

Kapitel 4 Java in der Datenbank benutzen

Verwaltung des Speichers

Sie knnen die Speicherbelegung wie folgt steuern:


Gesamtcachegre setzen Sie mssen die Gre des Caches so

setzen, dass alle Erfordernisse des nicht auslagerbaren Speichers erfllt werden. Die Cachegre wird mit der Befehlszeilenoption -c beim Serverstart gesetzt. In vielen Fllen reicht eine Cachegre von 8 MByte aus.
Speicher fr den Namensbereich setzen Der Java-Namensbereich ist die Maximalgre der Datenbankspeichererfordernisse in Bytes.

Sie knnen diesen Wert mit der Option JAVA_NAMESPACE_SIZE setzen. Diese Option ist global und kann nur von einem Benutzer mit DBA-Berechtigung gesetzt werden.
Heap-Gre setzen Diese Option JAVA_HEAP_SIZE setzt die Maximalgre des pro Verbindung erforderlichen Speichers in Byte.

Diese Option kann fr einzelne Verbindungen gesetzt werden, betrifft aber den fr andere Benutzer verfgbaren Speicher und darf daher nur von einem Benutzer mit DBA-Berechtigung verwendet werden. VM starten und stoppen Sie knnen nicht nur Speicherparameter fr Java setzen, sondern auch die VM entladen, wenn Java nicht benutzt wird, indem Sie die Anweisung STOP JAVA aufrufen. Nur ein Benutzer mit DBA-Berechtigung kann diese Anweisung ausfhren. Die Syntax ist einfach:
STOP JAVA

Die VM wird geladen, wenn ein Java-Vorgang ausgefhrt wird. Wenn Sie die VM explizit laden wollen, damit sie fr Java-Vorgnge bereit steht, knnen Sie folgende Anweisung ausfhren:
START JAVA

141

Speicher fr Java konfigurieren

142

K A P I T E L

Datenzugriff ber JDBC

ber dieses Kapitel

In diesem Kapitel wird beschrieben, wie JDBC fr den Zugriff auf Daten eingesetzt werden kann. JDBC kann sowohl aus Clientanwendungen als auch innerhalb einer Datenbank eingesetzt werden. Java-Klassen, die JDBC verwenden, bieten eine leistungsstrkere Alternative zu gespeicherten Prozeduren in SQL fr die Einbeziehung von Programmierlogik in die Datenbank.

Inhalt

Thema berblick ber JDBC jConnect-JDBC-Treiber verwenden JDBC-ODBC-Brcke verwenden JDBC-Verbindungen herstellen JDBC fr den Zugriff auf Daten verwenden Verteilte Anwendungen erstellen

Seite 144 150 155 157 165 174

143

berblick ber JDBC

berblick ber JDBC


JDBC bietet eine SQL-Schnittstelle fr Java-Anwendungen: Wenn Sie auf relationale Daten von Java zugreifen wollen, tun Sie dies ber JDBCAufrufe. Dieses Kapitel ist keine detailgenaue Anleitung fr die JDBCDatenbankschnittstelle, sondern liefert einige einfache Beispiele zur Einfhrung von JDBC und zur Illustration, wie sie beim Client und in der Datenbank eingesetzt werden kann.

$ Die Beispiele veranschaulichen die unterschiedlichen Funktionen beim


Einsatz von JDBC in Adaptive Server Anywhere. Weitere Hinweise zum Programmieren von JDBC finden Sie in jedem beliebigen JDBCProgrammierhandbuch. JDBC und Adaptive Server Anywhere Sie knnen JDBC auf folgende Weise mit Adaptive Server Anywhere verwenden:
JDBC auf dem Client Java-Clientanwendungen knnen JDBC-Aufrufe

in Adaptive Server Anywhere ausfhren. Die Verbindung erfolgt ber einen JDBC-Treiber. SQL Anywhere Studio enthlt zwei JDBC-Treiber: den jConnect-Treiber fr Anwendungen in reinem Java sowie eine JDBC-ODBC-Brcke. In diesem Kapitel bezieht sich der Ausdruck Clientanwendung sowohl auf Anwendungen, die auf dem Rechner des Benutzers laufen, als auch auf Mittelschicht-Anwendungsserver.
JDBC in der Datenbank In einer Datenbank installierte Java-Klassen

knnen JDBC-Aufrufe ausfhren, um mit Hilfe eines internen JDBCTreibers auf Daten in der Datenbank zuzugreifen und diese zu ndern. JDBC-Ressourcen
Erforderliche Software Sie bentigen TCP/IP fr den Sybase jConnect-

Treiber. Der Sybase jConnect Treiber kann abhngig von Ihrer Installation von Adaptive Server Anywhere bereits verfgbar sein.

$ Weitere Hinweise den jConnect-Treiber und seinen Standort finden Sie


unter "Die Dateien des jConnect-Treibers" auf Seite 150.
Beispiel-Quellcode Quellcode fr die Beispiele in diesem Kapitel finden Sie in der Datei Samples\ASA\Java\JDBCExamples.java in Ihrem SQL Anywhere-Verzeichnis.

$ Hinweise zur Installation von Java-Beispielen, einschlielich der


Klasse JDBCExamples, finden Sie unter "Java-Beispiele einrichten" auf Seite 94. 144

Kapitel 5 Datenzugriff ber JDBC

JDBC-Treiber whlen
Fr Adaptive Server Anywhere werden zwei JDBC-Treiber bereitgestellt:
jConnect Dieser Treiber ist eine 100% reine Java-Implementierung des Treiber. Er kommuniziert mit Adaptive Server Anywhere ber das TDS-Client/Server-Protokoll. JDBC-ODBC-Brcke

Dieser Treiber kommuniziert mit Adaptive Server Anywhere ber das Command Sequence-Client/Server-Protokoll. Sein Verhalten ist mit ODBC-, Embedded SQL- und OLE DBAnwendungen konsistent.

Bei der Auswahl des geeigneten Treibers sollten die folgenden Faktoren beachtet werden:
Features Beide Treiber sind JDK 2-kompatibel. Die JDBC-ODBCBrcke bietet vollstndig abrollbare Cursor, die in jConnect nicht verfgbar sind. "Pure Java"

Der jConnect-Treiber ist eine reine Java-Lsung. Die JDBC-ODBC-Brcke bentigt den Adaptive Server Anywhere ODBCTreiber und ist keine reine Java-Lsung.

Performance

Die JDBC-ODBC-Brcke bietet bessere Performance fr die meisten Einsatzbereiche als der jConnect-Treiber.

Kompatibilitt Das vom jConnect-Treiber verwendete TDS-Protokoll wird mit Adaptive Server Enterprise gemeinsam genutzt. Einige Aspekte des Verhaltens dieses Treibers werden durch das Protokoll bestimmt und sind so konfiguriert, dass die Kompatibilitt mit Adaptive Server Enterprise gewhrleistet bleibt.

Beide Treiber sind fr Windows 95/98/Me und Windows NT/2000/XP sowie die untersttzten UNIX- und Linux-Betriebssystemen verfgbar. Sie sind nicht fr NetWare oder Windows CE erhltlich.

JDBC-Programmstruktur
In JDBC-Anwendungen sind folgende Ablufe typisch: 1
Verbindungsobjekt erstellen Mit dem Aufruf der getConnectionKlassenmethode der Klasse DriverManager wird ein ConnectionObjekt erstellt, das eine Verbindung mit einer Datenbank einrichtet. Statement-Objekt erstellen Das Objekt Connection erstellt ein

Statement-Objekt.

145

berblick ber JDBC


3
SQL-Anweisung bergeben Eine SQL-Anweisung, die in der

Datenbankumgebung ausgefhrt werden soll, wird an das StatementObjekt bergeben. Wenn die Anweisung eine Abfrage ist, wird durch diese Aktion ein ResultSet-Objekt zurckgegeben. Das ResultSet-Objekt enthlt die von der SQL-Anweisung zurckgegebenen Daten, gibt jedoch jeweils nur eine Zeile aus (hnlich wie die Arbeitsweise des Cursors). 4
Schleife ber die Zeilen der Ergebnismenge Die next-Methode des

Objekts ResultSet fhrt zwei Aktionen aus: Die aktuelle Zeile (die Zeile in der ber das Objekt ResultSet ausgegebenen Ergebnismenge), wird eine Zeile weitergeschoben. Ein Boolescher Wert wird zurckgegeben (TRUE/FALSE), der angibt, ob eine Zeile vorhanden ist, zu der weitergeschoben werden kann.

Fr jede Zeile Werte abrufen Fr jede Zeile im ResultSet-Objekt

werden Werte entweder mit dem Namen oder der Position der Spalte abgerufen. Sie knnen die Methode getDate verwenden, um den Wert einer Spalte in der aktuellen Zeile zu beziehen. Java-Objekte knnen JDBC-Objekte verwenden, um mit einer Datenbank zu interagieren und Daten fr die eigene Verwendung abzurufen, und zwar fr die eigene Verarbeitung oder fr den Einsatz in anderen Abfragen.

JDBC-Funktionen in der Datenbank


Die Version von JDBC, die Sie von Java in der Datenbank benutzen knnen, wird von der JDK-Version bestimmt, die fr die Datenbank eingerichtet wurde. Wenn Ihre Datenbank mit JDK 1.2 oder JDK 1.3 initialisiert wurde, knnen Sie die JDBC 2.0 API verwenden.

$ Hinweise zum Upgrade der Datenbanken auf JDK 1.2 oder JDK
1.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. Falls Ihre Datenbank mit JDK 1.1 initialisiert wurde, knnen Sie die Funktionen von JDBC 1.2 verwenden. Der interne JDBC-Treiber fr JDK 1.1 (asajdbc) stellt einige Funktionen von JDBC 2.0 von serverseitigen Java-Anwendungen zur Verfgung, bietet aber keine volle JDBC 2.0-Untersttzung.

146

Kapitel 5 Datenzugriff ber JDBC

$ Weitere Hinweise finden Sie unter "JDBC 2.0-Funktionen von


JDK 1.1-Datenbanken aus benutzen" auf Seite 147.

JDBC 2.0-Funktionen von JDK 1.1-Datenbanken aus benutzen


In diesem Abschnitt wird beschrieben, wie JDBC 2.0-Funktionen von Datenbanken aus benutzt werden, die mit JDK 1.1 initialisiert wurden. In vielen Fllen ist es besser, Ihre Version von Java in der Datenbank auf 1.3 umzustellen. Bei Datenbanken, die mit JDK 1.1 initialisiert wurden, enthlt das Paket sybase.sql.ASA Funktionen, die Teil von JDBC 2.0 sind. Um diese JDBC 2.0-Funktionen verwenden zu knnen, mssen Sie Ihre JDBC-Objekte in die entsprechenden Klassen im Paket sybase.sql.ASA und nicht im Paket java.sql einbauen. Klassen, die als java.sql deklariert sind, bleiben auf die JDBC 1.2-Funktionen beschrnkt. Die Klassen in sybase.sql.ASA sind:
JDBC-Klasse java.sql.Connection java.sql.Statement java.sql.PreparedStatement java.sql.CallableStatement java.sql.ResultSetMetaData java.sql.ResultSet java.sql.DatabaseMetaData Interne Sybase-Treiberklasse sybase.sql.ASA.SAConnection sybase.sql.ASA.SAStatement sybase.sql.ASA.SAPreparedStatement sybase.sql.ASA.SACallableStatement sybase.sql.ASA.SAResultSetMetaData sybase.sql.SAResultSet sybase.sql.SADatabaseMetaData

Die folgende Funktion bietet ein ResultSetMetaData-Objekt fr eine vorbereitete Anweisung ohne das ResultSet oder das Ausfhren der Anweisung ntig sind. Diese Funktion ist nicht Teil des Standards JDBC 1.2.
ResultSetMetaData sybase.sql.ASA.SAPreparedStatement.describe()

Der folgende Code ruft die vorherige Zeile in einer Ergebnismenge ab, eine Funktion, die in JDBC 1.2 nicht untersttzt wird:
import java.sql.*; import sybase.sql.asa.*; ResultSet rs; // hier mehr Code ( ( sybase.sql.asa.SAResultSet)rs ).previous();

Einschrnkungen von JDBC 2.0

Die folgenden Klassen sind Teil der Kernschnittstelle von JDBC 2.0, stehen aber im Paket sybase.sql.ASA nicht zur Verfgung: 147

berblick ber JDBC


java.sql.Blob java.sql.Clob java.sql.Ref java.sql.Struct java.sql.Array java.sql.Map

Die folgenden Kernfunktionen von JDBC 2.0 sind im Paket sybase.sql.ASA nicht verfgbar:
Klasse in sybase.sql.ASA SAConnection Fehlende Funktionen java.util.Map getTypeMap() void setTypeMap( java.util.Map map ) SAPreparedStatement void setRef( int pidx, java.sql.Ref r ) void setBlob( int pidx, java.sql.Blob b ) void setClob( int pidx, java.sql.Clob c ) void setArray( int pidx, java.sql.Array a ) SACallableStatement Object getObject( pidx, java.util.Map map ) java.sql.Ref getRef( int pidx ) java.sql.Blob getBlob( int pidx ) java.sql.Clob getClob( int pidx ) java.sql.Array getArray( int pidx ) SAResultSet Object getObject( int cidx, java.util.Map map ) java.sql.Ref getRef( int cidx ) java.sql.Blob getBlob( int cidx ) java.sql.Clob getClob( int cidx ) java.sql.Array getArray( int cidx ) Object getObject( String cName, java.util.Map map ) java.sql.Ref getRef( String cName ) java.sql.Blob getBlob( String cName ) java.sql.Clob getClob( String cName ) java.sql.Array getArray( String cName )

148

Kapitel 5 Datenzugriff ber JDBC

Unterschiede zwischen client- und serverseitigen JDBCVerbindungen


Der Unterschied zwischen dem JDBC-Treiber auf dem Client bzw. auf dem Datenbankserver liegt darin, dass eine Verbindung mit der Datenbankumgebung hergestellt wird.
Clientseitig Beim clientseitigen JDBC-Treiber erfordert die Herstellung

einer Verbindung den Sybase jConnect JDBC- Treiber oder der JDBCODBC-Brcke von Adaptive Server Anywhere. Die bergabe von Argumenten an DriverManager.getConnection richtet die Verbindung ein. Die Datenbankumgebung ist von der Perspektive der Clientanwendung aus eine externe Anwendung.
Serverseitig Wenn JDBC innerhalb des Datenbankservers eingesetzt

wird, ist bereits eine Verbindung vorhanden. Der Wert jdbc:default:connection wird an DriverManager.getConnection bergeben, damit die JDBC-Anwendung die Mglichkeit erhlt, innerhalb der aktuellen Benutzerverbindung zu arbeiten. Dies ist ein schneller, effizienter und sicherer Vorgang, weil die Clientanwendung die Sicherheitsprfung der Datenbank zur Herstellung der Verbindung bereits bestanden hat. Benutzer-ID und Kennwort wurden angegeben und brauchen nicht noch einmal angegeben zu werden. Der interne JDBC-Treiber kann nur mit der Datenbank der aktuellen Verbindung eine Verbindung herstellen. JDBC-Klassen knnen so geschrieben werden, dass sie auf der Client- und auf der Serverseite ausgefhrt werden, indem Sie eine einzige bedingte Anweisung fr die Angabe des URL verwenden. Eine externe Verbindung erfordert den Rechnernamen und die Portnummer, whrend die interne Verbindung jdbc:default:connection bentigt.

149

jConnect-JDBC-Treiber verwenden

jConnect-JDBC-Treiber verwenden
Wenn Sie JDBC von einer Clientanwendung oder einem Applet aus verwenden wollen, brauchen Sie den jConnect JDBC-Treiber, um eine Verbindung mit Datenbanken von Adaptive Server Anywhere herstellen zu knnen. jConnect gehrt zum Lieferumfang von SQL Anywhere Studio. Wenn Sie Adaptive Server Anywhere als Teil eines anderen Paketes erhalten haben, besteht die Mglichkeit, dass jConnect nicht enthalten ist. Sie brauchen jConnect, um JDBC von Clientanwendungen aus einsetzen zu knnen. Sie knnen JDBC in der Datenbank ohne jConnect verwenden.

Die Dateien des jConnect-Treibers


Der jConnect JDBC-Treiber ist in einer Reihe von Verzeichnissen unter Sybase\Shared installiert. Es werden zwei Versionen von jConnect bereitgestellt:
jConnect 4.5 Diese Version von jConnect ist fr die Entwicklung von

JDK 1.1-Anwendungen vorgesehen. jConnect 4.5 ist im Verzeichnis


Sybase\Shared\jConnect-4_5 installiert.

jConnect 4.5 wird als Gruppe von Klassen geliefert.


jConnect 5.5 Diese Version von jConnect ist fr die Entwicklung von

JDK 1.2-Anwendungen vorgesehen. jConnect 5.5 ist im Verzeichnis


Sybase\Shared\jConnect-5_5 installiert.

jConnect 5.5 wird als jar-Datei mit dem Namen jconn2.jar geliefert. Beispiele in diesem Kapitel verwenden jConnect 5.5. Benutzer von jConnect 4.5 mssen die entsprechenden Anpassungen vornehmen. CLASSPATH fr jConnect einrichten Damit Ihre Anwendung "jConnect" verwenden kann, mssen die jConnectKlassen beim Kompilieren und Ausfhren in die Umgebungsvariable CLASSPATH einbezogen sein, sodass der Java-Compiler und die JavaMachine die notwendigen Dateien ausfindig machen knnen. Der folgende Befehl fgt den jConnect 5.5-Treiber in eine vorhandene CLASSPATH-Umgebungsvariable ein, wobei Suchpfad Ihr Sybase\Shared Verzeichnis ist.
set classpath=%classpath%;Suchpfad\jConnect-5_5\classes\jconn2.jar

Mit dem folgenden Befehl wird der jConnect 4.5-Treiber einer vorhandenen CLASSPATH-Umgebungsvariablen hinzugefgt:
set classpath=%classpath%;Suchpfad\jConnect-4_5\classes

150

Kapitel 5 Datenzugriff ber JDBC

jConnect-Klassen importieren

Die Klassen in jConnect befinden sich alle im Paket com.sybase. Wenn Sie jConnect 5.5 verwenden, muss Ihre Anwendung auf Klassen in com.sybase.jdbc2.jdbc zugreifen. Sie mssen diese Klassen am Anfang einer jeden Quelldatei importieren:
import com.sybase.jdbc2.jdbc.*

Wenn Sie jConnect 4.5 verwenden, befinden sich die Klassen in com.sybase.jdbc. Sie mssen diese Klassen am Anfang einer jeden Quelldatei importieren:
import com.sybase. jdbc.*

jConnect-Systemobjekte in einer Datenbank installieren


Wenn Sie mit jConnect auf Systemtabellendaten zugreifen wollen (Datenbank-Metadaten), mssen Sie die jConnect-Systemobjekte Ihrer Datenbank hinzufgen. Die jConnect-Systemobjekte werden standardmig jeder neuen Datenbank hinzugefgt. Sie knnen die jConnect-Objekte der Datenbank beim Erstellen, beim Upgrade oder zu einem spteren Zeitpunkt hinzufgen. Sie knnen die jConnect-Systemobjekte ber Sybase Central oder ber Interactive SQL installieren.
v So fgen Sie jConnect-Systemobjekte einer Datenbank hinzu (Sybase Central):

1 2

Stellen Sie von Sybase Central aus als Benutzer mit DBA-Berechtigung eine Verbindung her. Im linken Fensterausschnitt von Sybase Central rechtsklicken Sie auf das Datenbanksymbol und whlen "jConnect Metadatenuntersttzung neu installieren" aus dem Einblendmen.

v So fgen 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 fr die Eingabe der SQL-Anweisungen folgenden Befehl ein:
read Suchpfad\scripts\jcatalog.sql

wobei Suchpfad Ihr SQL Anywhere-Verzeichnis ist.

151

jConnect-JDBC-Treiber verwenden

Tipp

Sie knnen die jConnect-Systemobjekte einer Datenbank auch ber die Befehlszeile hinzufgen: Die Eingabe bei der Eingabeaufforderung lautet wie folgt:
dbisql -c "uid=Benutzer;pwd=Kennwort" Suchpfad\scripts\jcatalog.sql

Dabei gilt: Benutzer und Kennwort gehren zu einem Benutzer mit DBABerechtigung, und Suchpfad ist Ihr SQL Anywhere-Verzeichnis.

jConnect-Treiber laden
Bevor Sie jConnect in Ihrer Anwendung benutzen knnen, mssen Sie die Treiber laden, indem Sie folgende Anweisung eingeben.
Class.forName("com.sybase.jdbc2.jdbc.SybDriver").newInstance();

Mit der Methode newInstance werden Probleme in einigen Browsern vermieden.

Einem Server einen URL liefern


Um per jConnect eine Verbindung mit einer Datenbank herzustellen, mssen Sie einen "Uniform Resource Locator" (URL) fr die Datenbank angeben. 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(); // jConnect-Treiber verwenden ... temp.append("jdbc:sybase:Tds:"); // zur Verbindung mit angegebenem Rechnernamen... temp.append(_coninfo); // auf der Standard-Portnummer des ASA... temp.append(":2638"); // und baue Verbindung auf. System.out.println(temp.toString()); conn = DriverManager.getConnection(temp.toString() , _props );

Der URL wird folgendermaen zusammengesetzt:


jdbc:sybase:Tds:Rechnername:Portnummer

Die einzelnen Komponenten sind:

152

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, auf dem der Server luft. Wenn Sie eine Verbindung auf demselben Rechner herstellen, knnen Sie localhost benutzen, also den aktuellen Rechner. Portnummer Die Portnummer, an der der Datenbankserver auf

Verbindungsanforderungen wartet. Die Adaptive Server Anywhere zugewiesene Portnummer ist 2638. Sie sollten diese Nummer verwenden, es sei denn, es gibt besondere Grnde, dies nicht zu tun. Die Verbindungszeichenfolge darf nicht lnger als 252 Zeichen sein.

Datenbank auf einem Server angeben


Jeder Adaptive Server Anywhere-Server kann mehrere Datenbanken gleichzeitig laden. Der oben angegebene URL legt einen Server fest, nicht aber eine Datenbank. Der Verbindungsversuch wird mit der Standarddatenbank auf dem Server vorgenommen. Sie knnen eine bestimmte Datenbank angeben, indem Sie die URL-Angabe wie folgt erweitern: Mit dem Parameter ServiceName
jdbc:sybase:Tds:Rechnername:Portnummer?ServiceName=DBN

Das Fragezeichen, gefolgt von einer Reihe von Zuordnungen, ist ein Standardverfahren, um einem URL Argumente zu liefern. Die Gro- und Kleinschreibung von servicename wird nicht bercksichtigt, und vor bzw. nach dem =-Zeichen darf es keine Leerstellen geben. Der Parameter DBN ist der Datenbankname. Eine allgemeinere Methode ist die Eingabe zustzlicher Verbindungsparameter wie Datenbankname oder Datenbankdatei mit dem Feld RemotePWD: Setzen Sie RemotePWD als Eigenschaftsfeld mit der Methode setRemotePassword(). Nachstehend wird ein Beispielcode fr die Verwendung dieses Feldes gezeigt.
sybDrvr = (SybDriver)Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" ).newInstance(); props = new Properties(); props.put( "User", "DBA" ); props.put( "Password", "SQL" ); sybDrvr.setRemotePassword( null, "dbf=asademo.db", props ); Connection con = DriverManager.getConnection( "jdbc:sybase:Tds:localhost", props );

Mit dem Parameter RemotePWD

153

jConnect-JDBC-Treiber verwenden
Mit dem Parameter fr die Datenbankdatei DBF knnen Sie mit jConnect eine Datenbank auf einem Server starten. Standardmig wird die Datenbank mit autostop=YES gestartet. Wenn Sie DBF oder DBN mit utility_db eingeben, wird die Dienstprogramm-Datenbank automatisch gestartet.

$ Weitere Hinweise zur Dienstprogramm-Datenbank finden Sie unter


"Die Dienstprogrammdatenbank verwenden" auf Seite 249 der Dokumentation ASA Datenbankadministration.

Fr 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 fr die Kompatibilitt mit Adaptive Server Enterprise ein.

Anschlieend wird die Prozedur spt_mda aufgerufen, die einige andere Optionen einstellt. Insbesondere legt die Prozedur spt_mda die Einstellung der Option QUOTED_IDENTIFIER fest. Zum ndern des Standardverhaltens sollten Sie die Prozedur spt_mda ndern.

154

Kapitel 5 Datenzugriff ber JDBC

JDBC-ODBC-Brcke verwenden
Die JDBC-ODBC-Brcke bietet einen JDBC-Treiber, der eine bessere Performance sowie einige zustzliche Funktionen im Vergleich zum jConnect JDBC-Treiber ausweist; die JDBC-ODBC-Brcke ist jedoch im Gegensatz zum jConnect-Treiber keine reine Java-Lsung.

$ Hinweise zur Auswahl des JDBC-Treibers finden Sie unter "JDBCTreiber whlen" auf Seite 145. Erforderliche Dateien Die Java-Komponente der JDBC-ODBC-Brcke ist in der Datei jodbc.jar enthalten, die Sie im Unterverzeichnis Java der SQL Anywhere-Installation finden. Unter Windows ist die systemeigene Komponente in der Datei dbjodbc8.dll im Unterverzeichnis win32 der SQL Anywhere-Installation zu finden; fr UNIX und Linux befindet sich die systemeigene Komponente in dbjodbc8.so. Die Komponente muss im Systempfad enthalten sein. Wenn Anwendungen mit diesem Treiber eingefhrt werden, mssen auch die ODBC-Treiberdateien installiert werden. Der folgende Code veranschaulicht, wie eine Verbindung mit der JDBCODBC-Brcke hergestellt wird:
String driver, url; Connection conn; driver="ianywhere.ml.jdbcodbc.IDriver"; url = "jdbc:odbc:dsn=ASA 8.0 Sample"; Class.forName( driver ); conn = DriverManager.getConnection( url );

Verbindung herstellen

Dieser Code weist folgende Besonderheiten auf: Da die Klassen mit Class.forName geladen werden, muss das Paket, das die JDBC-ODBC-Brcke enthlt, nicht mit import-Anweisungen importiert werden.

jodbc.jar muss im Classpath enthalten sein, wenn Sie die Anwendung ausfhren. Der URL enthlt jdbc:odbc:, gefolgt von einer standardmigen ODBC-Verbindungszeichenfolge. Die Verbindungszeichenfolge ist in der Regel eine ODBC-Datenquelle; Sie knnen jedoch auch explizit durch Strichpunkte getrennte, einzelne Verbindungszeichenfolgen zustzlich zu oder an Stelle der Datenquelle verwenden. Weitere Hinweise zu den Optionen, die Sie in einer Verbindungszeichenfolge verwenden knnen, finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration.

155

JDBC-ODBC-Brcke verwenden
Falls Sie keine Datenquelle verwenden, sollen Sie den ODBC-Treiber angeben, indem Sie die Treiberoption zur Verbindungszeichenfolge hinzufgen:
url = "jdbc:odbc:"; url += "driver=Adaptive Server Anywhere 8.0;...";

Zeichenstze

Unter UNIX verwendet die JDBC-ODBC-Brcke keine ODBC-UnicodeBindungen oder -Aufrufe und nimmt keine Zeichensatzkonvertierungen vor. Das Senden von Nicht-ASCII-Daten ber die Brcke fhrt zur Beschdigung der Daten. Unter Windows verwendet die JDBC-ODBC-Brcke ODBC-UnicodeBindungen und -Aufrufe, um Zeichensatzkonvertierungen vorzunehmen.

156

Kapitel 5 Datenzugriff ber JDBC

JDBC-Verbindungen herstellen
In diesem Abschnitt werden Klassen vorgestellt, die von einer JavaAnwendung aus eine JDBC-Datenbankverbindung herstellen. In den Beispielen in diesem Abschnit werden jConnect (clientseitig) oder Java in der Datenbank (serverseitig) verwendet. Hinweise zur Herstellung von Verbindungen mit der JDBC-ODBC-Brcken finden Sie unter "JDBC-ODBC-Brcke verwenden" auf Seite 155.

Von einer JDBC-Clientanwendung aus mit jConnect eine Verbindung herstellen


Wenn Sie von einer JDBC-Anwendung auf Datenbank-Systemtabellen zugreifen wollen (Datenbank-Metadaten), mssen Sie eine Reihe von jConnect-Systemobjekten in Ihre Datenbank einfgen. Die internen JDBCTreiberklassen und jConnect nutzen gemeinsam gespeicherte Prozeduren fr die Untersttzung der Datenbank-Metadaten. Diese Prozeduren werden in allen Datenbanken standardmig installiert. Der Parameter dbinit -i verhindert die Installation.

$ Weitere Hinweise zum Hinzufgen von jConnect-Systemobjekten in


eine Datenbank finden Sie unter "jConnect-JDBC-Treiber verwenden" auf Seite 150. Die folgende, vollstndige Java-Anwendung ist eine Befehlszeilenanwendung, die eine Verbindung mit einer laufenden Datenbank herstellt, eine Reihe von Daten auf der Befehlszeile ausgibt und beendet wird. Der erste Schritt einer beliebigen JDBC-Anwendung ist die Herstellung der Verbindung mit der Datenbank, wenn sie mit dieser arbeiten will.

$ Dieses Beispiel veranschaulicht eine externe Verbindung, bei der es


sich um eine regulre Client/Server-Verbindung handelt. Hinweise zum Erstellen einer internen Verbindung von Java-Klassen, die im Datenbankserver laufen, finden Sie unter "Verbindung von einer serverseitigen JDBC-Klasse herstellen" auf Seite 161.

157

JDBC-Verbindungen herstellen

Beispielcode fr eine externe Verbindung


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

158

Kapitel 5 Datenzugriff ber JDBC


private static void ASAConnect( String userID, String password, String machineName ) { // Mit einem Adaptive Server Anywhere verbinden String coninfo = new String( machineName ); Properties props = new Properties(); props.put( "user", userID ); props.put( "password", password ); props.put("DYNAMIC_PREPARE", "true"); // jConnect laden try { Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" ).newInstance(); String dbURL = "jdbc:sybase:Tds:" + machineName + ":2638/?JCONNECT_VERSION=5"; System.out.println( dbURL ); conn = DriverManager.getConnection( dbURL , props ); } catch ( Exception e ) { System.out.println( "Error: " + e.getMessage() ); e.printStackTrace(); } }

So funktioniert das Beispiel fr eine externe Verbindung


Das Beispiel fr eine externe Verbindung ist eine JavaBefehlszeilenanwendung. Pakete importieren Die Anwendung bentigt mehrere Bibliotheken. Deren Import erfolgt in den ersten Zeilen von JDBCExamples.java: Das Paket java.sql enthlt die JDBC-Klassen von Sun Microsystems, die fr alle JDBC-Anwendungen erforderlich sind. Sie finden sie in der Datei classes.zip im Java-Unterverzeichnis. Der aus com.sybase.jdbc2.jdbc importierte Sybase jConnect JDBCTreiber ist fr alle Anwendungen erforderlich, die Verbindungen ber jConnect herstellen. Die Anwendung benutzt eine Eigenschaftsliste (property list). Die Klasse java.util.Properties ist erforderlich, um mit Eigenschaftslisten arbeiten zu knnen. Sie finden sie in der Datei classes.zip im JavaUnterverzeichnis. Das Paket asademo enthlt Klassen, die in einigen Beispielen verwendet werden. Sie finden es in der Datei Samples\ASA\Java\asademo.jar. 159

JDBC-Verbindungen herstellen

Die Methode "main"

Jede Java-Anwendung erfordert eine Klasse mit einer Methode mit dem Namen main, die beim Programmstart aufgerufen wird. In diesem einfachen Beispiel ist JDBCExamples.main die einzige Methode in der Anwendung. Die Methode JDBCExamples.main fhrt folgende Aufgaben aus: 1 Sie verarbeitet das Befehlszeilenargument und benutzt dabei den Rechnernamen, wenn ein solcher bergeben wurde. Standardmig ist der Name des Rechners localhost, der sich fr den Personal Datenbankserver eignet. Sie ruft die Methode "ASAConnect" auf, damit eine Verbindung hergestellt wird. Sie fhrt mehrere Methoden aus, die Daten in die Befehlszeile abrollen.

2 3 Die Methode "ASAConnect"

Die Methode JDBCExamples.ASAConnect fhrt folgende Aufgaben aus: 1 Sie stellt ber Sybase jConnect eine Verbindung mit der laufenden Standarddatenbank her. Class.forName ldt jConnect. Mit der Methode newInstance werden Probleme in einigen Browsern vermieden. Die StringBuffer-Anweisungen bauen aus der Literal-Zeichenfolge und dem in der Befehlszeile angegebenen Rechnernamen eine Verbindungszeichenfolge auf. DriverManager.getConnection stellt mit der Verbindungszeichenfolge eine Verbindung her.

Sie gibt die Kontrolle an die aufrufende Methode zurck.

Beispiel fr eine externe Verbindung


In diesem Abschnitt wird beschrieben, wie das Beispiel fr eine externe Verbindung ausgefhrt wird.
v So wird die Beispielanwendung fr eine externe Verbindung erstellt und ausgefhrt:

1 2 3 4

ffnen Sie eine Befehlszeile. Wechseln Sie in Ihr SQL Anywhere-Verzeichnis. Wechseln Sie in das Unterverzeichnis Samples\ASA\Java. Die Datenbank muss auf einem Datenbankserver geladen sein, der mit TCP/IP luft. Einen solchen Server knnen Sie auf Ihrem lokalen Rechner starten, indem Sie folgenden Befehl ausfhren (vom Unterverzeichnis Samples\ASA\Java aus):

160

Kapitel 5 Datenzugriff ber JDBC


start dbeng8 ..\..\..\asademo

Fhren Sie das Beispiel aus, indem Sie an der Eingabeaufforderung folgenden Befehl eingeben:
java JDBCExamples

Wenn Sie dies mit einem Server ausprobieren wollen, der auf einem anderen Rechner luft, mssen Sie den Namen dieses Rechners eingeben. Der Standard ist localhost, wobei es sich um ein Alias fr den Namen des aktuellen Rechners handelt. 6 Eine Liste von Personen und Produkten muss an der Eingabeaufforderung angezeigt werden. Wenn der Verbindungsversuch fehlschlgt, erscheint stattdessen eine Fehlermeldung. Prfen Sie, ob Sie alle erforderlichen Schritte ausgefhrt haben. Prfen Sie, ob Ihr CLASSPATH richtig eingestellt wurde. Ein falscher CLASSPATH fhrt dazu, dass eine Klasse nicht gefunden werden kann.

$ Weitere Hinweise zur Verwendung von jConnect finden Sie unter


"jConnect-JDBC-Treiber verwenden" auf Seite 150 sowie in der OnlineDokumentation fr jConnect.

Verbindung von einer serverseitigen JDBC-Klasse herstellen


SQL-Anweisungen werden in JDBC mit Hilfe der Methode createStatement des Connection-Objekts aufgebaut. Auch Klassen, die innerhalb des Servers laufen, mssen eine Verbindung herstellen, damit ein Connection-Objekt erstellt wird. Eine Verbindung von einer serverseitigen JDBC-Klasse herzustellen ist einfacher, als eine externe Verbindung einzurichten. Da die serverseitige Klasse von einem bereits verbundenen Benutzer ausgefhrt wird, verwendet die Klasse einfach die vorhandene Verbindung.

Beispielcode fr eine serverseitige Verbindung


Nachstehend wird der Quellcode fr das Beispiel gezeigt. Den Quellcode finden Sie in der Methode InternalConnect in Samples\ASA\Java\JDBCExamples.java in Ihrem SQL AnywhereVerzeichnis:
public static void InternalConnect() { try { conn = DriverManager.getConnection("jdbc:default:connection"); System.out.println("Hello World");

161

JDBC-Verbindungen herstellen
} catch ( Exception e ) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } } }

So funktioniert das Beispiel fr eine serverseitige Verbindung


In diesem einfachen Beispiel ist InternalConnect() die einzige Methode in der Anwendung. Die Anwendung erfordert nur eine der Bibliotheken (JDBC), die in der ersten Zeile der Klasse JDBCExamples.java importiert werden. Die anderen werden fr externe Verbindungen bentigt. Das Paket java.sql enthlt die JDBC-Klassen. Die InternalConnect()-Methode fhrt folgende Aufgaben aus: 1 Sie stellt ber die aktuelle Verbindung eine Verbindung mit der laufenden Standarddatenbank her: DriverManager.getConnection stellt eine Verbindung unter Verwendung der Verbindungszeichenfolge jdbc:default:connection her.

2 3

Sie gibt an der aktuellen Standardausgabe, d.h. im Serverfenster, Hello World aus. System.out.println fhrt die Ausgabe aus. Wenn bei dem Verbindungsversuch ein Fehler auftritt, erscheint eine Fehlermeldung im Serverfenster, die Auskunft ber die Stelle gibt, an der der Fehler aufgetreten ist. Die Anweisungen try und catch bieten den Rahmen fr die Fehlerbehandlung.

Beendet die Klasse

So wird das Beispiel fr eine serverseitige Verbindung ausgefhrt.


In diesem Abschnitt wird beschrieben, wie das Beispiel fr eine serverseitige Verbindung ausgefhrt wird.

162

Kapitel 5 Datenzugriff ber JDBC


v So wird die Beispielanwendung fr eine interne Verbindung erstellt und ausgefhrt:

Falls Sie es noch nicht getan haben, kompilieren Sie die Datei JDBCExamples.java. Wenn Sie das JDK verwenden, knnen Sie im Verzeichnis Samples\ASA\Java von einer Befehlszeile aus folgendermaen vorgehen:
javac JDBCExamples.java

Starten Sie einen Datenbankserver mit der Beispieldatenbank. Einen solchen Server knnen Sie auf Ihrem lokalen Rechner starten, indem Sie folgenden Befehl ausfhren (vom Unterverzeichnis Samples\ASA\Java aus):
start dbeng8 ..\..\..\asademo

In diesem Fall ist das TCP/IP-Netzwerkprotokoll nicht erforderlich, da jConnect nicht verwendet wird. 3 Installieren Sie die Klasse in der Beispieldatenbank. Wenn die Verbindung mit der Beispieldatenbank hergestellt ist, knnen Sie von Interactive SQL aus folgenden Befehl verwenden:
INSTALL JAVA NEW FROM FILE Suchpfad\Samples\ASA\Java\JDBCExamples.class

Dabei gilt: Suchpfad ist der Suchpfad zu Ihrem Installationsverzeichnis. Es besteht auerdem die Mglichkeit, 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 hinzufgen". Befolgen Sie dann die Anweisungen im Assistenten. 4 Jetzt knnen Sie die Methode InternalConnect dieser Klasse aufrufen, als wenn Sie eine gespeicherte Prozedur aufrufen wrden:
CALL JDBCExamples>>InternalConnect()

Beim ersten Aufruf einer Java-Klasse muss die Java Virtual Machine gestartet werden. Dies kann einige Sekunden dauern. 5 Auf dem Serverbildschirm muss Hello World erscheinen.

163

JDBC-Verbindungen herstellen

Hinweise zu JDBC-Verbindungen

AutoCommit-Verhalten Die JDBC-Spezifikation erfordert, dass

standardmig nach jeder Datennderungsanweisung ein COMMIT ausgefhrt wird. Derzeit ist das serverseitige JDBC-Verhalten auf "Festschreiben" eingestellt. Sie knnen dieses Verhalten steuern, indem Sie folgende Anweisung verwenden:
conn.setAutoCommit( false ) ;

Dabei gilt: conn ist das aktuelle Verbindungsobjekt.


Standardwerte fr die Verbindung Bei der serverseitigen JDBC erstellt

nur der erste Aufruf von getConnection( "jdbc:default:connection" ) eine neue Verbindung mit den Standardwerten. Nachfolgende Aufrufe geben einen Behlter der aktuellen Verbindung mit allen unvernderten Verbindungseigenschaften zurck. Wenn Sie AutoCommit in Ihrer ursprnglichen Verbindung auf OFF setzen, geben alle nachfolgenden getConnection Aufrufe in demselben Java-Code eine Verbindung mit AutoCommit in Stellung OFF zurck. Es kann sinnvoll sein, die Verbindungseigenschaften beim Schlieen der Verbindung auf die Standardwerte zurcksetzen zu lassen, damit nachfolgende Verbindungen mit Standard-JDBC-Werten eingerichtet werden. Verwenden Sie dafr den folgenden Programmcode:
Connection conn = DriverManager.getConnection(""); boolean oldAutoCommit = conn.getAutoCommit(); try { // Code hierher setzen } finally { conn.setAutoCommit( oldAutoCommit ); }

Diese Hinweise gelten nicht nur fr AutoCommit, sondern auch fr andere Verbindungseigenschaften wie TransactionIsolation und isReadOnly.

164

Kapitel 5 Datenzugriff ber JDBC

JDBC fr den Zugriff auf Daten verwenden


Java-Anwendungen, die einige oder alle Klassen in der Datenbank enthalten, bieten einen erheblichen Vorteil gegenber traditionellen in SQL geschriebenen gespeicherten Prozeduren. Als Einfhrung kann es jedoch hilfreich sein, Parallelen zu mit SQL geschriebenen gespeicherten Prozeduren zu ziehen, um die Fhigkeiten von JDBC zu demonstrieren. In den folgenden Beispielen werden Java-Klassen geschrieben, die eine Zeile in die Tabelle Department einfgen. Wie auch bei anderen Schnittstellen knnen SQL-Anweisungen in JDBC entweder statisch oder dynamisch sein. Statische SQL-Anweisungen werden in der Java-Anwendung aufgebaut und zur Datenbank gesandt. Der Datenbankserver analysiert die Anweisung syntaktisch, whlt einen Ausfhrungsplan und fhrt die Anweisung aus. Syntaktische Analyse und Auswahl eines Ausfhrungsplans werden in der Folge als Vorbereitung der Anweisung bezeichnet. Wenn eine hnliche Anweisung hufig ausgefhrt werden soll (z.B. viele Einfgungen in eine Tabelle), kann dies zu erheblichem Overhead in der statischen SQL fhren, weil jedesmal der Vorbereitungsschritt ausgefhrt werden muss. Im Gegensatz dazu enthlt eine dynamische SQL-Anweisung Platzhalter. Die Anweisung wird einmal mit Hilfe dieser Platzhalter vorbereitet und kann dann mehrmals ausgefhrt werden, ohne dass sie neuerlich vorbereitet werden muss. In diesem Abschnitt verwenden wir statische SQL. Dynamische SQL wird weiter unten behandelt.

Vorbereitung der Beispiele


In diesem Abschnitt wird beschrieben, welche Vorbereitungsmanahmen fr die Beispiele im restlichen Teil des Kapitels ergriffen werden mssen. Beispielcode Die Codefragmente in diesem Abschnitt stammen aus der vollstndigen Klasse Samples\ASA\Java\JDBCExamples.java.
v So wird die Klasse JDBCExamples installiert:

Wenn Sie dies noch nicht getan haben, installieren Sie die Datei JDBCExamples.class in der Beispieldatenbank. Wenn die Verbindung von Interactive SQL mit der Beispieldatenbank hergestellt ist, knnen Sie im Fensterausschnitt fr die SQL-Anweisungen folgenden Befehl verwenden: 165

JDBC fr den Zugriff auf Daten verwenden


INSTALL JAVA NEW FROM FILE Suchpfad\Samples\ASA\Java\JDBCExamples.class

Dabei gilt: Suchpfad ist der Suchpfad zu Ihrem Installationsverzeichnis. Es besteht auerdem die Mglichkeit, 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 hinzufgen". Befolgen Sie dann die Anweisungen im Assistenten.

Einfgen, Aktualisieren und Lschen mit JDBC


Das Objekt Statement fhrt statische SQL-Anweisungen aus. SQLAnweisungen wie INSERT, UPDATE, DELETE, die keine Ergebnismengen zurckgeben, knnen Sie mit Hilfe der Methode executeUpdate des Objekts Statement ausfhren. Anweisungen wie CREATE TABLE und andere Anweisungen zur Datendefinition knnen auch mit executeUpdate ausgefhrt werden. Das folgende Codefragment veranschaulicht, wie INSERT-Anweisungen innerhalb von JDBC ausgefhrt werden. Es benutzt eine interne Verbindung, die im Verbindungsobjekt conn definiert ist. Der Programmcode fr das Einfgen von Werten aus einer externen Anwendung mit JDBC bentigt eine andere Verbindung, ist aber ansonsten unverndert.
public static void InsertFixed() { // Gibt die aktuelle Verbindung zurck conn = DriverManager.getConnection("jdbc:default:connection"); // AutoCommit deaktivieren conn.setAutoCommit( false ); Statement stmt = conn.createStatement(); Integer IRows = new Integer( stmt.executeUpdate ("INSERT INTO Department (dept_id, dept_name )" + "VALUES (201, 'Eastern Sales')" ) ); // Anzahl von aktualisierten Zeilen ausgeben System.out.println(IRows.toString() + " row inserted" ); }

166

Kapitel 5 Datenzugriff ber JDBC

Quellcode verfgbar

Dieses Codefragment ist Teil der Methode InsertFixed der Klasse JDBCExamples, die sich im Unterverzeichnis Samples\ASA\Java Ihres Installationsverzeichnisses befindet. Hinweise Die Methode setAutoCommit deaktiviert das AutoCommit-Verhalten, sodass nderungen nur festgeschrieben werden, wenn eine explizite COMMIT-Anweisung ausgefhrt wird. Die Methode executeUpdate gibt eine Ganzzahl zurck, die die Anzahl der Zeilen ausdrckt, die von dem Vorgang betroffen waren. In diesem Fall wrde ein erfolgreicher INSERT-Vorgang den Wert Eins (1) zurckgeben. Der Rckgabetyp "Ganzzahl" wird in ein Objekt Integer konvertiert. Die Klasse "Integer" ist ein Behlter fr den grundlegenden Datentyp int, der einige ntzliche Methoden enthlt, wie z.B. toString(). Die Ganzzahl IRows wird in eine Zeichenfolge konvertiert, die ausgegeben werden muss. Die Ausgabe erfolgt im Serverfenster.

v So wird das Beispiel JDBC Insert ausgefhrt:

1 2

ber Interactive SQL stellen Sie als Benutzer DBA eine Verbindung mit der Beispieldatenbank her. Die Klasse JDBCExamples muss installiert sein. Sie wird gemeinsam mit den anderen Java-Beispielklassen installiert.

$ Weitere Hinweise, wie Sie die Java-Beispiele installieren knnen,


finden Sie unter "Java-Beispiele einrichten" auf Seite 94. 3 4 Rufen Sie die Methode wie folgt auf:
CALL JDBCExamples>>InsertFixed()

Vergewissern Sie sich, dass in die Tabelle Department eine zustzliche Zeile eingefgt wurde.
SELECT * FROM department

Die Zeile 201 ist nicht festgeschrieben. Sie knnen eine ROLLBACKAnweisung ausfhren, um die Zeile zu entfernen. In diesem Beispiel haben Sie gesehen, wie eine sehr einfache JDBC-Klasse erstellt wird. Die nchsten Beispiele bauen darauf auf.

167

JDBC fr den Zugriff auf Daten verwenden

Argumente an Java-Methoden bergeben


Wir knnen die Methode InsertFixed erweitern, um zu veranschaulichen, wie Argumente an Java-Methoden bergeben werden. Die folgende Methode verwendet Argumente, die im Aufruf als die einzufgenden Werte an die Methode bergeben werden:
public static void InsertArguments( String id, String name) { try { conn = DriverManager.getConnection( "jdbc:default:connection" ); String sqlStr = "INSERT INTO Department " + " ( dept_id, dept_name )" + " VALUES (" + id + ", " + name + ")"; // Anweisung ausfhren Statement stmt = conn.createStatement(); Integer IRows = new Integer( stmt.executeUpdate( sqlStr.toString() ) ); // Anzahl von aktualisierten Zeilen ausgeben System.out.println(IRows.toString() + " row inserted" ); } catch ( Exception e ) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } }

Hinweise

Die beiden Argumente sind "department ID" (eine Ganzzahl) und "department name" (eine Zeichenfolge). Hier werden beide Argumente als Zeichenfolgen an die Methode bergeben, weil sie als Teil der Zeichenfolge der SQL-Anweisung verwendet werden. INSERT ist eine statische Anweisung: Sie nimmt auer der SQL selbst keine Parameter an. Wenn Sie eine falsche Anzahl oder einen falschen Typ von Argumenten angeben, erscheint die Fehlermeldung Prozedur nicht gefunden (Procedure Not Found).

v So wird die Java-Methode mit Argumenten verwendet:

Wenn Sie dies noch nicht getan haben, installieren Sie die Datei JDBCExamples.class in der Beispieldatenbank.

168

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, Northern Sales )

Vergewissern Sie sich, dass in die Tabelle "Department" eine zustzliche Zeile eingefgt wurde.
SELECT * FROM Department

Setzen Sie die nderungen zurck, damit die Datenbank unverndert bleibt:
ROLLBACK

Abfragen mit JDBC


Das Objekt Statement wird fr die Ausfhrung von statischen Abfragen und fr Anweisungen eingesetzt, die keine Ergebnismengen zurckgeben. Bei Abfragen verwenden Sie die Methode executeQuery des Objekts Statement. Dies fhrt zur Rckgabe der Ergebnismenge in einem Objekt ResultSet. Das folgende Codefragment veranschaulicht, wie Abfragen in JDBC behandelt werden. Das Codefragment setzt den Gesamt-Bestandswert fr ein Produkt in eine Variable mit dem Namen Inventory. Die Artikelbezeichnung wird in der String-Variablen prodname abgelegt. Dieses Beispiel ist als Methode Query der Klasse JDBCExamples verfgbar. Es gilt die Voraussetzung, dass eine interne bzw. externe Verbindung hergestellt wurde, die sich im Verbindungsobjekt mit der Bezeichnung conn befindet.
public static int Query () { int max_price = 0; try{ conn = DriverManager.getConnection( "jdbc:default:connection" ); // Abfrage aufbauen String sqlStr = "SELECT id, unit_price " + "FROM product" ; // Anweisung ausfhren Statement stmt = conn.createStatement(); ResultSet result = stmt.executeQuery( sqlStr ); while( result.next() ) {

169

JDBC fr den Zugriff auf Daten verwenden


int price = result.getInt(2); System.out.println( "Price is " + price ); if( price > max_price ) { max_price = price ; } } } catch( Exception e ) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } return max_price; }

Das Beispiel ausfhren

Wenn Sie die Klasse JDBCExamples in der Beispieldatenbank installiert haben, knnen Sie diese Methode mit folgender Anweisung in Interactive SQL ausfhren:
select JDBCExamples>>Query()

Hinweise

Die Abfrage whlt Menge und Einheitspreis fr alle Produkte mit dem Namen prodname. Diese Ergebnisse werden in das Objekt ResultSet mit dem Namen result zurckgegeben. In der Ergebnismenge wird ber jeder Zeile eine Schleife ausgefhrt. Die Schleife verwendet die Methode next. Fr jede Zeile wird der Wert jeder Spalte mit der Methode getInt in eine Ganzzahlvariable abgerufen. ResultSet umfasst ebenfalls Methoden fr andere Datentypen, wie etwa getString, getDate und getBinaryString. Das Argument fr die Methode getInt ist eine Indexnummer fr die Spalte, beginnend mit 1. Die Datentyp-Konvertierung von SQL auf Java wird gem den Angaben im folgenden Abschnitt erklrt: "Datentypkonvertierung von SQL in Java" auf Seite 96 der Dokumentation ASA SQLReferenzhandbuch.

Adaptive Server Anywhere untersttzt bidirektional abrollende Cursor. JDBC bietet jedoch nur die Methode next, die dem Vorwrts-Abrollen durch die Ergebnismenge entspricht. Die Methode gibt der aufrufenden Umgebung den Wert max_price zurck, und Interactive SQL zeigt ihn auf dem Register "Ergebnisse" im Fenster "Ergebnisse" an.

170

Kapitel 5 Datenzugriff ber JDBC

Vorbereitete Anweisungen fr effizienteren Zugriff verwenden


Wenn Sie ein Statement-Interface verwenden, muss jede Anweisung, die Sie an die Datenbank senden, syntaktisch analysiert werden. Auerdem ist ein Zugriffsplan zu generieren und die Anweisung auszufhren. Die Schritte vor der eigentlichen Ausfhrung werden als Vorbereitung der Anweisung bezeichnet. Sie knnen Performance-Vorteile erzielen, wenn Sie die PreparedStatement-Schnittstelle verwenden. Damit haben Sie die Mglichkeit, eine Anweisung mit Platzhaltern vorzubereiten, und dann beim Ausfhren der Anweisung diesen Platzhaltern Werte zuzuordnen. Der Einsatz von vorbereiteten Anweisungen ist besonders dann ntzlich, wenn viele hnliche Aktionen ausgefhrt werden, wie etwa das Einfgen von vielen Zeilen.

$ Weitere Hinweise ber vorbereitete Anweisungen finden Sie unter


"Anweisungen vorbereiten" auf Seite 12. Beispiel Das folgende Beispiel zeigt, wie die Schnittstelle PreparedStatement benutzt werden kann, obwohl das Einfgen einer einzelnen Zeile in der Praxis nicht mit vorbereiteten Anweisungen erfolgen sollte. Die folgende Methode der Klasse JDBCExamples fhrt eine vorbereitete Anweisung aus:
public static void JInsertPrepared(int id, String name) try { conn = DriverManager.getConnection( "jdbc:default:connection"); // INSERT-Anweisung erstellen // ? ist ein Platzhalterzeichen String sqlStr = "INSERT INTO Department " + "( dept_id, dept_name ) " + "VALUES ( ? , ? )" ; // Anweisung vorbereiten PreparedStatement stmt = conn.prepareStatement( sqlStr ); stmt.setInt(1, id); stmt.setString(2, name ); Integer IRows = new Integer( stmt.executeUpdate() ); // Anzahl von aktualisierten Zeilen ausgeben System.out.println(IRows.toString() + " row inserted" ); }

171

JDBC fr den Zugriff auf Daten verwenden


catch ( Exception e ) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } }

Das Beispiel ausfhren

Wenn Sie die Klasse JDBCExamples in der Beispieldatenbank installiert haben, knnen Sie das Beispiel mit folgender Anweisung ausfhren:
call JDBCExamples>>InsertPrepared( 202, Eastern Sales )

Das Zeichenfolgenargument wird entsprechend den SQL-Regeln in Apostrophe eingeschlossen. Wenn Sie diese Methode von einer JavaAnwendung aus aktiviert htten, sind zur Begrenzung der Zeichenfolge Anfhrungszeichen zu verwenden.

Objekte einfgen und abrufen


Als Schnittstelle fr relationale Datenbanken ist JDBC fr das Abrufen von traditionellen SQL-Datentypen sowie fr das Arbeiten mit diesen Typen konzipiert. Adaptive Server Anywhere umfasst auch abstrakte Datentypen in Form von Java-Klassen. Die Art, wie Sie mit JDBC auf diese Java-Klassen zugreifen, hngt davon ab, ob Sie die Objekte einfgen oder abrufen.

$ Weitere Hinweise zum Abrufen und Setzen ganzer Objekte finden Sie
unter "Verteilte Anwendungen erstellen" auf Seite 174.

Objekte abrufen
Auf folgende Art und Weise knnen Sie Objekte, deren Felder und deren Methoden abrufen:
Auf Methoden und Felder zugreifen Java-Methoden und -Felder knnen in die Auswahlliste einer Abfrage einbezogen werden. Eine Methode oder ein Feld erscheint als eine Spalte in der Ergebnismenge. Sie knnen mit einer der standardmigen ResultSet-Methoden darauf zugreifen, wie etwa getInt oder getString. Objekt abrufen Wenn Sie eine Spalte mit einem Java-Klassen-Datentyp

in die Auswahlliste einer Abfrage einbeziehen, knnen Sie die ResultSet-Methode getObject verwenden, um das Objekt in die JavaKlasse abzurufen. Dann knnen Sie innerhalb der Java-Klasse auf die Methoden und Felder des betreffenden Objekts zugreifen.

172

Kapitel 5 Datenzugriff ber JDBC

Objekte einfgen
Von einer serverseitigen Java-Klasse aus knnen Sie die JDBC-Methode setObject benutzen, um ein Objekt in eine Spalte mit Java-Klassen-Datentyp einzufgen. Sie knnen Objekte mit einer vorbereiteten Anweisung einfgen. Das folgende Codefragment fgt z.B. ein Objekt vom Typ "MyJavaClass" in eine Spalte der Tabelle T ein:
java.sql.PreparedStatement ps = conn.prepareStatement("insert T values( ? )" ); ps.setObject( 1, new MyJavaClass() ); ps.executeUpdate();

Eine Alternative wre, eine SQL-Variable einzurichten, die das Objekt enthlt, und dann die SQL-Variable in die Tabelle einzufgen.

Gemischte JDBC-Hinweise

Zugriffsberechtigungen Wie auf alle Java-Klassen in der Datenbank,

kann jeder beliebige Benutzer auch auf Klassen mit JDBC-Anweisungen zugreifen. Es gibt keine Entsprechung zur Anweisung GRANT EXECUTE, die die Berechtigung zum Ausfhren von Prozeduren erteilt, und der Name einer Klasse braucht nicht mit dem Namen des Eigentmers qualifiziert zu werden.
Berechtigung zum Ausfhren Java-Klassen werden mit den

Berechtigungen der sie ausfhrenden Verbindung ausgefhrt. Dieses Verhalten unterscheidet sich von dem der gespeicherten Prozeduren, die mit den Berechtigungen des Eigentmers ausgefhrt werden.

173

Verteilte Anwendungen erstellen

Verteilte Anwendungen erstellen


In einer verteilten Anwendung laufen Teile der Anwendungslogik auf einem Rechner, andere Teile auf einem anderen. In Adaptive Server Anywhere knnen Sie verteilte Java-Anwendungen erstellen, bei denen ein Teil der Logik auf dem Datenbankserver, und ein Teil auf dem Clientsystem luft. Adaptive Server Anywhere ist in der Lage, Java-Objekte mit einem externen Java-Client auszutauschen. Die Schlsselaufgabe fr eine Clientanwendung in einer verteilten Anwendung besteht darin, ein Java-Objekt von einer Datenbank abzurufen. In diesem Abschnitt wird beschrieben, wie dies geschieht. Dazugehrige Aufgaben In anderen Teilen dieses Kapitels haben wir beschrieben, wie mehrere Aufgaben abgerufen werden, die in Beziehung mit abrufenden Objekten stehen, jedoch nicht mit dem Abrufen des Objekts selbst verwechselt werden sollten. Zum Beispiel: "Java-Objekte abfragen" auf Seite 117 Hier wird beschrieben, wie ein Objekt in eine SQL-Variable abgerufen wird. Damit ist allerdings noch nicht das Problem gelst, wie das Objekt in Ihre Java-Anwendung gelangt. "Java-Objekte abfragen" auf Seite 117 Hier wird auch beschrieben, wie die ffentlichen Felder und der Rckgabewert von Java-Methoden abgerufen werden. Auch dies unterscheidet sich vom Abrufen eines Objekts in eine Java-Anwendung. "Objekte einfgen und abrufen" auf Seite 172 Hier wird beschrieben, wie Objekte in serverseitige Java-Klassen abgerufen werden. Auch dies unterscheidet sich vom Abrufen von Objekten in eine Clientanwendung.

Anforderungen fr verteilte Anwendungen

Beim Aufbau einer verteilten Anwendung mssen mehrere Aufgaben erfllt werden.
v So wird eine verteilte Anwendung aufgebaut:

1 2 3

Jede auf dem Server laufende Klasse muss die serialisierbare Schnittstelle implementieren. Dies ist sehr einfach. Die clientseitige Anwendung muss die Klasse importieren, damit das Objekt auf der Clientseite wieder aufgebaut werden kann. Verwenden Sie die Methode sybase.sql.ASAUtils.toByteArray auf der Serverseite, um das Objekt zu serialisieren. Dies ist nur fr Adaptive Server Anywhere Version 6.0.1 und lter erforderlich.

174

Kapitel 5 Datenzugriff ber JDBC


4 Verwenden Sie die Methode sybase.sql.ASAUtils.fromByteArray auf der Clientseite, um das Objekt wieder aufzubauen. Dies ist nur fr Adaptive Server Anywhere Version 6.0.1 und lter erforderlich.

Diese Aufgaben werden in den folgenden Abschnitten beschrieben.

Serialisierbare Schnittstelle implementieren


Objekte werden in einer so genannten serialisierten Form vom Server an eine Clientanwendung bergeben. Das bedeutet, dass jede Zeile folgende Informationen enthlt: Einen Versionsbezeichner Einen Bezeichner fr die Klasse (oder Unterklasse), die gespeichert wird Die Werte von nicht-statischen, nicht-zeitweiligen Feldern in der Klasse Andere Overhead-Informationen

Damit ein Objekt an eine Clientanwendung gesendet wird, muss zunchst die serialisierbare Schnittstelle implementiert werden. Dies ist eine sehr einfache Aufgabe.
v So wird die serialisierbare Schnittstelle implementiert:

Fgen Sie den Text implements java.io.Serializable in Ihre Klassendefinition ein. Zum Beispiel implementiert Samples\ASA\Java\asademo\Product.java die serialisierbare Schnittstelle ber die folgende Deklaration:
public class Product implements java.io.Serializable

Die Implementierung der serialisierbaren Schnittstelle besteht lediglich darin, zu deklarieren, dass diese Klasse serialisiert werden kann. Die serialisierbare Schnittstelle enthlt weder Methoden noch Variable. Die Serialisierung eines Objekts besteht darin, dass es in einen Byte-Strom konvertiert wird, wodurch es auf einer Platte gespeichert bzw. an eine andere Java-Anwendung gesendet werden und wieder aufgebaut bzw. deserialisiert werden kann. Ein Java-Objekt, das in einem Datenbankserver serialisiert, an eine Clientanwendung gesendet und deserialisiert wurde, ist in jeder Hinsicht identisch mit dem Original. Einige Variable in einem Objekt brauchen nicht, bzw. sollten aus Sicherheitsgrnden nicht serialisiert werden. Diese Variablen werden wie in der folgenden Deklaration der Variablen mit Hilfe des Schlsselworts transient deklariert: 175

Verteilte Anwendungen erstellen


transient String password;

Wenn ein Objekt mit dieser Variablen deserialisiert wird, enthlt die Variable immer ihren Standardwert Null. Angepasste Serialisierung kann durch Hinzufgen der Methoden writeObject() und readObject() zu Ihren Klassen erreicht werden.

$ Weitere Hinweise zur Serialisierung finden Sie im Java Development


Kit (JDK) von Sun Microsystems.

Klassen clientseitig importieren


Auf der Clientseite muss jede Klasse, die ein Objekt abruft, Zugriff auf die geeignete Klassendefinition haben, damit sie das Objekt benutzen kann. Um die Klasse Product verwenden zu knnen, die Teil des Pakets asademo ist, mssen Sie folgende Zeile in Ihre Anwendung einbeziehen:
import asademo.*

Die Datei asademo.jar muss in Ihren CLASSPATH einbezogen sein, damit dieses Paket gefunden werden kann.

Beispiel fr eine verteilte Anwendung


Die Klasse JDBCExamples.java enthlt drei Methoden als Beispiel fr den verteilten Einsatz von Java. Sie werden alle von der Methode main aufgerufen. 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 fr eine verteilte Anwendung. So sieht die Methode getObjectColumn aus der Klasse JDBCExamples aus:
private static void getObjectColumn() throws Exception { // Rckgabe einer Ergebnismenge von einer Spalte mit // Java-Objekten asademo.ContactInfo ci; String name; String sComment ; if ( conn != null ) { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "SELECT JContactInfo FROM jdba.contact" );

176

Kapitel 5 Datenzugriff ber JDBC


while ( rs.next() ) { ci = ( asademo.ContactInfo )rs.getObject(1); System.out.println( "\n\tStreet: " + ci.street + "City: " + ci.city + "\n\tState: " + ci.state + "Phone: " + ci.phone + "\n" ); } } }

Die getObject-Methode wird wie bei einem internen Java-Fall verwendet.

ltere Methode
getObject und setObject empfohlen

Die Methoden getObject und setObject machen eine explizite Serialisierung und Deserialisierung berflssig, die bei frheren Versionen der Software erforderlich waren. In diesem Abschnitt wird fr Benutzer, die den lteren Programmcode benutzen, die ltere Methode beschrieben. In diesem Abschnitt wird beschrieben, wie eines dieser Beispiele funktioniert. Fr die anderen Beispiele knnen Sie sich den Code ansehen. Abfrageergebnisse serialisieren und deserialisieren Dies ist die Methode serializeColumn einer alten Version der Klasse JDBCExamples.
private static void serializeColumn() throws Exception { Statement stmt; ResultSet rs; byte arrayb[]; asademo.ContactInfo ci; String name; if ( conn != null ) { stmt = conn.createStatement(); rs = stmt.executeQuery( "SELECT sybase.sql.ASAUtils.toByteArray( JName.getName() ) AS Name, sybase.sql.ASAUtils.toByteArray( jdba.contact.JContactInfo ) FROM jdba.contact" ); while ( rs.next() ) { arrayb = rs.getBytes("Name"); name = ( String )sybase.sql.ASAUtils.fromByteArray( arrayb ); arrayb = rs.getBytes(2);

177

Verteilte Anwendungen erstellen


ci = (asademo.ContactInfo)sybase.sql.ASAUtils.fromByteArray( arrayb ); System.out.println( "Name: " + name + "\n\tStreet: " + ci.street + "\n\tCity: " + ci.city + "\n\tState: " + ci.state + "\n\tPhone: " + ci.phone + "\n" ); } System.out.println( "\n\n" ); } }

Und so funktioniert die Methode: 1 Es ist bereits eine Verbindung vorhanden, wenn die Methode aufgerufen wird. Das Verbindungsobjekt wird geprft, und wenn es vorhanden ist, wird der Code ausgefhrt. Eine SQL-Abfrage wird aufgebaut und ausgefhrt. Die Abfrage lautet folgendermaen:
SELECT sybase.sql.ASAUtils.toByteArray( JName.getName() ) AS Name, sybase.sql.ASAUtils.toByteArray( jdba.contact.JContactInfo ) FROM jdba.contact

Diese Anweisung fhrt eine Abfrage in der Tabelle jdba.contact aus. Sie ruft Daten aus den Spalten JName und JContactInfo ab. Anstatt einfach nur die Spalten selbst bzw. eine Methode der Spalte abzurufen, wird die Funktion sybase.sql.ASAUtils.toByteArray verwendet. 3 4 Der Client fhrt eine Schleife ber die Zeilen der Ergebnismenge aus. Fr jede Zeile wird der Wert jeder Spalte in ein Objekt deserialisiert. Die Ausgabe (System.out.println) zeigt, dass die Felder und Methoden des Objekts ebenso wie im Originalstatus eingesetzt werden knnen.

Sonstige Funktionen von verteilten Anwendungen


Es gibt zwei weitere Methoden in JDBCExamples.java, die verteilte Informatinosverarbeitung verwenden:
serializeVariable Diese Methode erstellt ein natives Java-Objekt, das von einer SQL-Variablen auf dem Datenbankserver referenziert wird, und gibt es an die Clientanwendung zurck.

178

Kapitel 5 Datenzugriff ber JDBC

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

179

Verteilte Anwendungen erstellen

180

K A P I T E L

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 fr Embedded SQL SQL-Prprozessor Referenz der Bibliotheksfunktion Befehlszusammenfassung fr Embedded SQL Seite 182 190 196 200 208 214 223 228 237 243 247 249 253 272

181

berblick

berblick
Embedded SQL ist eine Datenbank-Programmierschnittstelle fr die Programmiersprachen C und C++. Es besteht aus SQL-Anweisungen, die in C- oder C++-Quellcode eingebettet sind. Die SQL-Anweisungen werden von einem SQL-Prprozessor in C- oder C++-Quellcode konvertiert, die Sie anschlieend kompilieren. Whrend der Laufzeit verwenden Embedded SQL-Anwendungen eine Adaptive Server Anywhere-Schnittstellenbibliothek fr die Kommunikation mit dem Datenbankserver. Die Schnittstellenbibliothek ist eine dynamische Verknpfungsbibliothek (dynamic link library - DLL) oder - auf den meisten Betriebssystemplattformen - eine gemeinsam genutzte Bibliothek (shared library). Unter Windows-Betriebssystemen ist die Schnittstellenbibliothek
dblib8.dll.

Bei UNIX-Betriebssystemen heit die Schnittstellenbibliothek je nach Betriebssystem libdblib8.so, libdblib8.sl oder libdblib8.a.

Adaptive Server Anywhere liefert zwei Arten von Embedded SQL. Statisches Embedded SQL ist einfacher zu verwenden, jedoch weniger flexibel als dynamisches Embedded SQL. Diese beiden Arten werden in diesem Kapitel behandelt.

182

Kapitel 6 Programmieren mit Embedded SQL

berblick ber den Entwicklungsprozess

Sobald das Anwendungsprogramm erfolgreich vom SQL-Prprozessor konvertiert und anschlieend kompiliert ist, wird es mit der Importbibliothek fr die Schnittstellenbibliothek von Adaptive Server Anywhere verknpft, um eine ausfhrbare Programmdatei zu erzeugen. Wenn die Datenbank luft, verwendet diese Programmdatei die Adaptive Server Anywhere-DLL, um mit der Datenbank zu interagieren. Solange das Programm durch den Prprozessor luft, braucht die Datenbank nicht zu laufen. Unter Windows gibt es verschiedene Importbibliotheken fr Watcom C/C++, fr Microsoft Visual C++, und fr Borland C++.

$ Die Verwendung von Importbibliotheken ist die StandardEntwicklungsmethode fr Anwendungen, die Funktionen in DLLs aufrufen. Adaptive Server Anywhere bietet eine - empfohlene - alternative Methode, die die Verwendung von Importbibliotheken vermeidet. Weitere Hinweise finden Sie unter "Die Schnittstellenbibliothek dynamisch laden" auf Seite 187. 183

berblick

Den SQL-Prprozessor verwenden


Der SQL-Prprozessor ist eine Programmdatei namens sqlpp.exe. Befehlszeile Die SQLPP-Befehlszeile sieht wie folgt aus:
sqlpp [ Parameter ] SQL-Dateiname [ Ausgabedateiname ]

Der SQL-Prprozessor konvertiert ein C-Programm mit Embedded SQL, bevor der C- oder C++-Compiler ausgefhrt wird. Der Prprozessor bersetzt die SQL-Anweisungen in C-/C++-Quellcode und schreibt den Quellcode in eine Ausgabedatei. Die normale Dateinamenerweiterung fr Quelldateien mit embedded SQL ist .sqc. Der voreingestellte Name fr die Ausgabedatei ist der Name der SQL-Datei mit der Erweiterung .c. Falls der Name der SQL-Datei bereits die Erweiterung .c hat, erhlt die Ausgabedeitei standardmig die Erweiterung .cc.

$ Eine vollstndige Auflistung der Optionen finden Sie unter "SQLPrprozessor" auf Seite 249.

Untersttzte Compiler
Der SQL-Prprozessor fr 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.6, 11 Version 9.5 und hher 1.0 und hher 4.5 5.0

$ Anweisungen zur Erstellung von NetWare NLMs finden Sie unter


"NetWare loadable Modules erstellen" auf Seite 188.

Header-Dateien fr Embedded SQL


Alle Header-Dateien befinden sich nach der Installation von Adaptive Server Anywhere im Unterverzeichnis h des Installationsverzeichnisses.

184

Kapitel 6 Programmieren mit Embedded SQL

Dateiname

Beschreibung Wichtigste Header-Datei, wird in alle Embedded SQLProgramme eingefgt. Die Datei fgt die Strukturdefinition fr den SQL-Kommunikationsbereich ein (SQL Communication Area - SQLCA), sowie Prototypen fr alle Embedded SQLDatenbankschnittstellenfunktionen. SQL-Deskriptorbereich-Strukturdefinition, wird in Embedded SQL-Programme eingefgt, die dynamisches SQL benutzen Definition der Datentypen fr die Embedded SQLSchnittstelle. Die Datei enthlt auch Strukturdefinitionen und Rckgabewerte, die gebraucht werden, um den Datenbankserver aus einem C-Programm zu starten. Definitionen fr Fehlercodes, die im Feld sqlcode des SQLCA-Bereichs zurckgegeben werden Definitionen fr ANSI/ISO SQL-Standardfehlerzustnde, die im Feld sqlstate des SQLCA-Bereichs zurckgegeben werden Diese Header stellen sicher, dass das Strukturverdichten (structure packing) korrekt gehandhabt wird. Sie untersttzen die Compiler Watcom C/C++, Microsoft Visual C++, IBM Visual Age und Borland C/C++.

sqlca.h

sqlda.h sqldef.h

sqlerr.h sqlstate.h pshpk1.h, pshpk2.h, poppk.h

Importbibliotheken
Alle Importbibliotheken sind im Unterverzeichnis lib unter dem Installationsunterverzeichnis von Adaptive Server Anywhere installiert. Die Windows-Importbibliotheken sind zum Beispiel im Unterverzeichnis win32\lib abgelegt.
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.lib dblibtm.lib dblib8.lib dblib8.lib libdblib8.so, libdbtasks8.so libdblib8_r.so, libdbtasks8_r.so

185

berblick
Die Bibliotheken libdbtasks8 werden von der Bibliothek libdblib8 aufgerufen. Einige Compiler ermitteln die Position von libdbtasks8 automatisch, whrend Sie dies fr andere explizit angeben mssen.

Ein einfaches Beispiel


Es folgt ein sehr einfaches Beispiel fr ein Embedded SQL-Programm.
#include <stdio.h> EXEC SQL INCLUDE SQLCA; main() { db_init( &sqlca ); EXEC SQL WHENEVER SQLERROR GOTO error; EXEC SQL CONNECT "DBA" IDENTIFIED BY "SQL"; EXEC SQL UPDATE employee SET emp_lname = Plankton WHERE emp_id = 195; EXEC SQL COMMIT WORK; EXEC SQL DISCONNECT; db_fini( &sqlca ); return( 0 ); error: printf( "update unsuccessful -- sqlcode = %ld.n", sqlca.sqlcode ); db_fini( &sqlca ); return( -1 ); }

Dieses Beispiel stellt eine Verbindung mit der Datenbank her, aktualisiert den Nachnamen des Angestellten mit der Nummer 195, schreibt die nderung fest und beendet das Programm. Es gibt praktisch keine Interaktion zwischen dem SQL-Code und dem C-Code. C-Code wird in diesem Beispiel ausschlielich zur Ablaufsteuerung benutzt. Die Anweisung WHENEVER wird fr Fehlerberprfung benutzt. Die Fehleraktion (in diesem Beispiel GOTO) wird nach jeder SQL-Anweisung ausgefhrt, die einen Fehler verursacht.

$ Weitere Hinweise zum Abrufen von Daten finden Sie unter "Daten
abrufen" auf Seite 214.

186

Kapitel 6 Programmieren mit Embedded SQL

Struktur von Embedded SQL-Programmen


In Embedded-SQL-Programmen sind SQL-Anweisungen in normalen Coder C++-Code eingebettet. Alle Embedded SQL-Anweisungen beginnen mit den Worten EXEC SQL und enden mit einem Semikolon (;). Normale Kommentare der Sprache C sind innerhalb von Embedded SQLAnweisungen erlaubt. Der Quellcode eines C-Programms, das Embedded SQL benutzt, muss vor der ersten Embedded SQL-Anweisung in der Quelldatei folgende Anweisung enthalten:
EXEC SQL INCLUDE SQLCA;

Die erste Embedded SQL-Anweisung, die von dem C-Programm ausgefhrt wird, muss eine CONNECT-Anweisung sein. Die CONNECT-Anweisung stellt eine Verbindung mit dem Datenbankserver her und spezifiziert die Benutzer-ID fr alle Anweisungen, die whrend der Verbindung ausgefhrt werden. Die CONNECT-Anweisung muss als erste Embedded SQL-Anweisung ausgefhrt werden. Ausnahme: Einige Embedded SQL-Befehle erzeugen keinen C-Code oder bentigen keine Verbindung mit der Datenbank. Diese Befehle sind daher vor der CONNECT-Anweisung erlaubt. Die wichtigsten sind die INCLUDE-Anweisung und die WHENEVER-Anweisung fr die Fehlerbehandlung.

Die Schnittstellenbibliothek dynamisch laden


Um Anwendungen zu entwickeln, die Funktionen aus DLLs aufrufen, ist es blich, die Anwendung mit einer Importbibliothek zu verknpfen, die die erforderlichen Funktionsdefinitionen enthlt. Dieser Abschnitt beschreibt eine alternative Methode, um Anwendungen fr Adaptive Server Anywhere zu entwickeln. Die Adaptive Server Anywhere Schnittstellenbibliothek kann dynamisch geladen werden, ohne dass sie mit der Importbibliothek verknpft werden muss, und zwar mit Hilfe des Moduls esqldll.c im Unterverzeichnis src Ihres Installationsverzeichnisses. Wir empfehlen, esqldll.c zu benutzen, denn diese Methode ist einfacher anzuwenden und findet die Schnittstellen-DLL zuverlssiger.

187

berblick
v Um die Schnittstellen-DLL dynamisch zu laden, gehen Sie wie folgt vor:

Ihr Programm muss db_init_dll aufrufen, um die DLL zu laden, und es muss db_fini_dll aufrufen, um die DLL wieder freizugeben. db_init_dll muss vor jeder anderen Funktion der Datenbankschnittstelle aufgerufen werden. Nach db_fini_dll kann keine Funktion der Datenbankschnittstelle mehr aufgerufen werden. Sie mssen trotzdem die Bibliotheksfunktionen db_init und db_fini aufrufen.

Fgen Sie vor der Anweisung EXEC SQL INCLUDE SQLCA mit #include die Header-Datei esqldll.h ein, oder fgen Sie #include < sqlca.h> in Ihr Embedded SQL-Programm ein. Ein SQL OS (Operating System - Betriebssystem)-Makro muss definiert werden. Die Header-Datei sqlca.h, die mit esqdll.c eingefgt wird, versucht das passende Makro zu bestimmen und zu definieren. Bei bestimmten Kombinationen von Betriebssystemen und Compilern kann dieser Versuch allerdings fehlschlagen. In diesem Fall mssen Sie entweder mit #define eine Definition am Beginn Ihrer Datei einfgen, oder die Definition mit einer Compiler-Option liefern.
Makro _SQL_OS_WINNT _SQL_OS_UNIX _SQL_OS_UNIX Untersttzte Plattformen Alle Windows-Betriebssysteme UNIX NetWare

4 5 Beispiel

Kompilieren Sie esqldll.c. Statt mit der Importbibliothek verknpfen Sie Ihre Embedded SQLAnwendung mit dem Objektmodul esqldll.obj.

Ein Beispielprogramm, aus dem ersichtlich ist, wie die Schnittstellenbibliothek dynamisch geladen werden kann, finden Sie im Unterverzeichnis Samples\ASA\ESQLDynamicLoad in Ihrem SQL Anywhere-Verzeichnis. Der Quellcode befindet sich in Samples\ASA\ESQLDynamicLoad\sample.sqc.

NetWare loadable Modules erstellen


Sie mssen den Watcom C/C++-Compiler, Version 10.6 oder 11.0 verwenden, um Embedded SQL-Programme als NetWare loadable Modules (NLM) zu kompilieren. 188

Kapitel 6 Programmieren mit Embedded SQL


v So erstellen Sie ein Embedded SQL-NLM:

Auf einem Windows-basierten System mssen Sie die Embedded SQLDatei mit folgendem Befehl vorverarbeiten:
sqlpp -o NETWARE srcfile.sqc

Diese Anweisung erstellt eine Datei mit der Erweiterung .c. 2 3 Kompilieren Sie file.c mit dem Watcom-Compiler (10.6 oder 11.0) unter Verwendung der Option /bt=netware. Verknpfen Sie die sich ergebende Objektdatei mit Hilfe des WatcomLinkers mit den folgenden Optionen:
FORMAT NOVELL MODULE dblib8 OPTION CASEEXACT IMPORT @dblib8.imp LIBRARY dblib8.lib

Die Dateien dblib8.imp und dblib8.lib werden mit Adaptive Server Anywhere ausgeliefert und befinden sich im Verzeichnis nlm. Fr die Zeilen IMPORT und LIBRARY ist eventuell der vollstndige Suchpfad notwendig.

189

Beispielprogramme mit Embedded SQL

Beispielprogramme mit Embedded SQL


Die Embedded SQL-Beispiele sind Teil der Adaptive Server AnywhereInstallation. Sie werden im Unterverzeichnis Samples\ASA\C Ihres Verzeichnisses SQL Anywhere gespeichert. Das Beispiel fr statische Cursor Samples\ASA\C\cur.sqc zeigt die Verwendung von statischen SQL-Anweisungen. Das Beispiel fr dynamische Cursor und Embedded SQL Samples\ASA\C\dcur.sqc zeigt die Verwendung von dynamischen SQLAnweisungen.

Um die Anzahl der Codezeilen zu verringern, die in den Beispielprogrammen cur und dcur (und dem odbc-Beispiel) mehrmals vorkommen, sind die Mainlines und die Druckfunktionen in einer separaten Datei enthalten. Und zwar in mainch.c fr zeichenbasierte Systeme und in mainwin.c fr fensterbasierte Systeme. Die Beispielprogramme liefern jeweils folgende drei Routinen, die von den Mainlines aufgerufen werden.
WSQLEX_Init Stellt eine Verbindung zur Datenbank her und ffnet den

Cursor
WSQLEX_Process_Command Verarbeitet Benutzerbefehle und

bedient den Cursor


WSQLEX_Finish Schliet 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 Befehle vom Benutzer abholt, und WSQL_Process_Command aufruft, bis der Benutzer das Programm beendet Die Routine WSQLEX_Finish aufzurufen

Die Verbindung mit der Datenbank wird mit dem Embedded SQL-Befehl CONNECT hergestellt, der die erforderliche Benutzer-ID und das Kennwort bereitstellt. Zustzlich zu diesen Beispielen knnen Sie als Teil von SQL Anywhere Studio weitere Programme und Quelldateien finden, die Eigenschaften des Servers fr bestimmte Betriebssystemplattformen veranschaulichen.

190

Kapitel 6 Programmieren mit Embedded SQL

Beispielprogramme erstellen
Dateien fr den Aufbau der Beispielprogramme werden mit dem Beispielcode geliefert. Bei Windows- und NetWare-Betriebssystemen mit Windows als HostBetriebssystem, verwenden Sie makeall.bat zum Kompilieren der Beispielprogramme. Fr UNIX verwenden Sie das Shell-Skript makeall. Fr Windows CE verwenden Sie die dcur.dsp-Projektdatei fr Microsoft Visual C++.

Die Syntax des Befehls ist wie folgt:


makeall {Beispiel} {Plattform} {Compiler}

Der erste Parameter ist der Name des Beispielprogramms, das Sie kompilieren wollen. Es ist eines der folgenden Programme:
CUR Beispiel fr statischen Cursor DCUR Beispiel fr dynamischen Cursor ODBC Beispiel fr ODBC

Der zweite Parameter ist die Zielplattform. Sie ist eines der folgenden Programme:
WINNT Fr Windows kompilieren NETWARE Fr NetWare NLM kompilieren

Der dritte Parameter ist der Compiler, mit dem das Programm kompiliert werden soll. Der Compiler kann einer der folgenden sein:
WC - Watcom C/C++ MC Microsoft C BC Borland C

Beispielprogramme ausfhren
Die ausfhrbaren Dateien befinden sich gemeinsam mit dem Quellcode im Verzeichnis Samples\ASA\C.
v So wird das Beispielprogramm fr einen statischen Cursor ausgefhrt:

Starten Sie das Programm: 191

Beispielprogramme mit Embedded SQL


2 Starten Sie die Personal Server Beispieldatenbank von Adaptive Server Anywhere. Fhren Sie die Datei Samples\ASA\C\curwnt.exe aus.

Befolgen Sie die Anweisungen auf dem Bildschirm. Die verschiedenen Befehle verndern einen Datenbankcursor und geben Abfrageergebnisse am Bildschirm aus. Geben Sie einfach den Buchstaben des Befehls ein, den Sie ausfhren wollen. Bei einigen Systemen mssen Sie anschlieend die Eingabetaste (ENTER) drcken, um den Befehl auszufhren.

v So wird das Beispielprogramm fr einen dynamischen Cursor ausgefhrt:

Starten Sie das Programm: Fhren Sie die Datei Samples\ASA\C\dcurwnt.exe aus.

Stellen Sie eine Verbindung zu einer Datenbank her: Alle Beispielprogramme haben eine Konsolen-Benutzeroberflche mit einer Eingabeaufforderung. Geben Sie die nachstehende Zeichenfolge ein, damit eine Verbindung mit der Beispieldatenbank hergestellt wird:
DSN=ASA 8.0 Sample

Whlen Sie eine Tabelle: Jedes einzelne Beispielprogramm fordert Sie auf, eine Tabelle anzugeben. Whlen Sie eine der Tabellen in der Beispieldatenbank. Sie knnen z.B. Customer oder Employee eingeben.

Befolgen Sie die Anweisungen auf dem Bildschirm. Die verschiedenen Befehle verndern einen Datenbankcursor und geben Abfrageergebnisse am Bildschirm aus. Geben Sie einfach den Buchstaben des Befehls ein, den Sie ausfhren wollen. Bei einigen Systemen mssen Sie anschlieend die Eingabetaste (ENTER) drcken, um den Befehl auszufhren.

Windows Beispiele

Die Windows-Versionen der Beispielprogramme sind echte WindowsProgramme. Um allerdings den Code fr die Benutzeroberflche nicht zu kompliziert zu gestalten, wurden einige Vereinfachungen vorgenommen. Im Besonderen schreiben diese Programme auf WM_PAINT-Nachrichten hin nicht die Fenster neu, sondern nur die Eingabeaufforderung.

192

Kapitel 6 Programmieren mit Embedded SQL

Beispiel fr statischen Cursor


Dieses Beispiel zeigt die Verwendung von Cursorn. Der Cursor, der hier verwendet wurde, ruft bestimmte Informationen aus der Tabelle employee in der Beispieldatenbank ab. Der Cursor wird statisch deklariert, das heit, die SQL-Anweisung, die die Information abruft, ist im Quellprogramm enthalten. Dies ist ein gutes Beispiel, um zu lernen, wie Cursor funktionieren. Das nchste Beispiel ("Beispiel fr dynamischen Cursor" auf Seite 193) konvertiert dieses erste Beispiel und verwendet dynamische SQLAnweisungen.

$ Wo der Quellcode zu finden ist und wie Sie dieses Beispielprogramm


kompilieren, finden Sie unter "Beispielprogramme mit Embedded SQL" auf Seite 190. Die open_cursor-Routine deklariert einen Cursor fr den jeweiligen SQLBefehl und ffnet ebenfalls den Cursor. Die print-Routine druckt eine Seite mit Informationen. Sie fhrt pagesizemal eine Schleife aus, die eine einzelne Zeile vom Cursor abruft und druckt. Beachten Sie, dass die Abrufroutine berprft, ob eine Warnsituation vorliegt (wie Row not found), und gegebenenfalls die erforderliche Fehlermeldung ausgibt. Auerdem positioniert das Programm den Cursor neu in der Zeile vor derjenigen, die am Anfang der aktuellen Datenseite ausgegeben wurde. Die Routinen move, top und bottom benutzen die geeignete Form der FETCH-Anweisung, um den Cursor zu positionieren. Beachten Sie bitte, dass diese Form der FETCH-Anweisung nicht tatschlich die Daten abruft, die Anweisung positioniert lediglich den Cursor. Auerdem wurde eine allgemeine Routine namens move zur relativen Positionierung implementiert, die abhngig vom Vorzeichen des Parameters den Cursor in die eine oder andere Richtung bewegt. Beendet der Benutzer das Programm, wird der Cursor geschlossen und die Datenbankverbindung getrennt. Der Cursor wird durch eine ROLLBACK WORK-Anweisung geschlossen und die Verbindung mit DISCONNECT getrennt.

Beispiel fr dynamischen Cursor


Dieses Beispiel veranschaulicht, wie Cursor fr eine dynamische SQLSELECT-Anweisung verwendet werden. Es ist eine leichte nderung des vorangehenden Beispiels. Bitte sehen Sie sich das vorangehende "Beispiel fr statischen Cursor" auf Seite 193 an, bevor Sie sich mit diesem Beispiel befassen.

193

Beispielprogramme mit Embedded SQL

$ Wo der Quellcode zu finden ist und wie Sie dieses Beispielprogramm


kompilieren, finden Sie unter "Beispielprogramme mit Embedded SQL" auf Seite 190. Das Programm dcur erlaubt dem Benutzer, mit dem n-Befehl eine Tabelle auszuwhlen, die er anschauen mchte. Das Programm zeigt dann so viele Informationen aus dieser Tabelle an, wie auf den Bildschirm passen. Wenn dieses Programm ausgefhrt wird, erwartet es eine Zeichenfolge fr die Verbindung der Form:
uid=DBA;pwd=SQL;dbf=c:\Programme\Sybase\SQL Anywhere 8\asademo.db

Das C-Programm mit Embedded SQL befindet sich im Unterverzeichnis Samples\ASA\C Ihres SQL Anywhere-Installationsverzeichnisses. Abgesehen von den Funktionen connect, open_cursor und print gleicht das Programm weitgehend dem vorigen Beispiel. Die Funktion connect benutzt die Embedded SQL-Schnittstellenfunktion db_string_connect, um die Verbindung zur Datenbank herzustellen. Diese Funktion liefert die zustzliche Funktionalitt, um die Zeichenfolge fr die Verbindung zu untersttzen, die benutzt wird, um die Verbindung zur Datenbank herzustellen. Die Routine open_cursor baut zuerst die SELECT-Anweisung auf:
SELECT * FROM Tabellenname

Wobei Tabellenname der Parameter ist, der an die Routine bergeben wird. Dann bereitet sie eine dynamische SQL-Anweisung mit Hilfe dieser Zeichenfolge vor. Der Embedded SQL-Befehl DESCRIBE wird benutzt, um die Ergebnisse der SELECT-Anweisung in die SQLDA-Struktur zu schreiben.
Gre der SQLDA

Zu Beginn wird die Gre der SQLDA geschtzt (3). Ist das nicht gro genug, wird die tatschliche Gre der Auswahlliste, die vom Datenbankserver zurckgegeben wurde, benutzt, um eine SQLDA der richtigen Gre zuzuweisen. Die SQLDA-Struktur wird dann mit Puffern gefllt, die Zeichenfolgen enthalten, die wiederum fr das Ergebnis der Abfrage stehen. Die Routine fill_s_sqlda konvertiert alle Datentypen in der SQLDA in DT_STRING und weist Puffer der passenden Gre zu. Dann wird fr diese Anweisung ein Cursor deklariert und geffnet. Die brigen Routinen zum Bewegen und Schlieen des Cursors sind die gleichen wie beim vorhergehenden Beispiel. 194

Kapitel 6 Programmieren mit Embedded SQL


Die fetch-Routine differiert leicht, sie schreibt die Ergebnisse in die SQLDA-Struktur statt in eine Liste von Hostvariablen. Die print-Routine ist leicht verndert, um Ergebnisse aus der SQLDA-Struktur bis zur vollen Bildschirmbreite auszugeben. Die print-Routine benutzt auch die Namenfelder des SQLDA-Bereichs, um berschriften fr die Spalten auszugeben.

Beispiele fr Dienste
Die Beispielprogramme cur.sqc und dcur.sqc werden optional als Dienste ausgefhrt, wenn sie fr eine Windows-Version kompiliert werden, auf denen Dienste laufen knnen. Die beiden Dateien, die den Beispielcode fr Windows-Dienste enthalten, sind die Quelldatei ntsvc.c und die Header-Datei ntsvc.h. Der Code ermglicht es, das damit gelinkte ausfhrbare Programm entweder als normales Programm oder als Windows-Dienst auszufhren.
v Um eines der kompilierten Beispiele als Windows-Dienst auszufhren, gehen Sie wie folgt vor:

1 2 3 4

Starten Sie Sybase Central und ffnen Sie das Verzeichnis "Dienste". Whlen Sie einen Diensttyp aus der Beispielanwendung aus und klicken Sie auf "OK". Geben Sie einen Dienstnamen in das entsprechende Feld ein. Whlen Sie das Beispielprogramm (curwnt.exe oder dcurwnt.exe) aus dem Unterverzeichnis Samples\ASA|C im SQL AnywhereInstallationsverzeichnis. Klicken Sie auf "OK", um den Dienst zu installieren. Klicken Sie auf "Start" im Hauptfenster, um den Dienst zu starten.

5 6

Wird das Programm als Dienst ausgefhrt, zeigt es, falls mglich, die normale Benutzeroberflche. Die Ausgabe wird in das Ereignisprotokoll der Anwendung geschrieben. Falls die Benutzeroberflche nicht gestartet werden kann, schreiben die Programme eine Seite in das Ereignisprotokoll der Anwendung und halten an. Diese Beispiele wurden mit dem Watcom C/C++ 10.5-Compiler und dem Microsoft Visual C++-Compiler getestet.

195

Datentypen in Embedded SQL

Datentypen in Embedded SQL


Um Informationen zwischen einem Programm und dem Datenbankserver austauschen zu knnen, mssen alle Datenelemente einen Datentyp haben. Die Konstanten fr Embedded SQL haben alle das Prfix DT_ und befinden sich in der Header-Datei sqldef.h. Eine Hostvariable kann jeden der untersttzten Datentypen haben. Sie knnen diese Datentypen auch in einer SQLDA-Struktur benutzen, um Daten mit der Datenbank auszutauschen. Sie knnen mit den DECL_-Makros in sqlca.h Variablen dieser Datentypen definieren. Beispielsweise kann mit DECL_BIGINT eine Variable mit einem BIGINT-Wert deklariert werden. Folgende Datentypen werden von der Embedded SQLProgrammierschnittstelle untersttzt:
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_DECIMAL gepackte Dezimalzahl typedef struct DECIMAL { char array[1]; } DECIMAL;

DT_STRING Mit Nullwert endende Zeichenfolge. Die Zeichenfolge wird mit Leerzeichen aufgefllt, wenn bei der Initialisierung der Datenbank mit Leerzeichen aufgefllte Zeichenfolgen verwendet werden. DT_DATE Mit Nullwert endende Zeichenfolge, die ein gltiges Datum

196

reprsentiert
DT_TIME Mit Nullwert endende Zeichenfolge, die eine gltige

Zeitangabe reprsentiert
DT_TIMESTAMP Mit Nullwert endende Zeichenfolge, die einen

gltigen Zeitstempel reprsentiert

Kapitel 6 Programmieren mit Embedded SQL



DT_FIXCHAR Zeichenfolge mit fester Lnge, mit Leerzeichen aufgefllt DT_VARCHAR Zeichenfolge variabler Lnge, mit einem 2-ByteLngenfeld. Wenn Sie dem Datenbankserver Informationen liefern, mssen Sie das Lngenfeld setzen. Wenn Sie Informationen vom Datenbankserver abholen, setzt der Datenbankserver das Lngenfeld (nicht aufgefllt). typedef struct VARCHAR { unsigned short int len; char array[1]; } VARCHAR;

DT_LONGVARCHAR Lange Zeichendaten mit unterschiedlicher Lnge. Das Makro definiert eine Struktur folgendermaen: #define DECL_LONGVARCHAR( size ) \ struct { a_sql_uint32 array_len; \ a_sql_uint32 stored_len; \ a_sql_uint32 untrunc_len; \ char array[size+1];\ }

Die DECL_LONGVARCHAR-Struktur kann mit Daten ber 32 Kbyte verwendet werden. Umfangreiche Daten knnen auf einmal, beziehungsweise in Abschnitten abgerufen werden, und zwar mit der GET DATA-Anweisung. Sie knnen an den Server auf einmal, beziehungsweise in Abschnitten bermittelt werden, indem sie an eine Datenbankvariable mit der SET-Anweisung angehngt werden. Die Daten werden nicht mit Nullwert abgeschlossen.

$ Weitere Hinweise finden Sie unter "Lange Werte senden und


abfragen" auf Seite 237.
DT_BINARY Binrdaten variabler Lnge mit einem 2-Byte-Lngenfeld.

Wenn Sie dem Datenbankserver Informationen liefern, mssen Sie das Lngenfeld setzen. Wenn Sie Informationen vom Datenbankserver abholen, setzt der Datenbankserver das Lngenfeld.
typedef struct BINARY { unsigned short int len; char array[1]; } BINARY;

DT_LONGBINARY Lange Binrdaten. Das Makro definiert eine Struktur

folgendermaen:
#define DECL_LONGBINARY( size ) struct { a_sql_uint32 array_len; a_sql_uint32 stored_len; a_sql_uint32 untrunc_len; char array[size]; } \ \ \ \ \

197

Datentypen in Embedded SQL


Die DECL_ LONGBINARY -Struktur kann mit Daten ber 32 Kbyte verwendet werden. Umfangreiche Daten knnen auf einmal beziehungsweise in Abschnitten abgerufen werden, und zwar mit der GET DATA-Anweisung. Sie knnen an den Server auf einmal, beziehungsweise in Abschnitten bermittelt werden, indem sie an eine Datenbankvariable mit der SET-Anweisung angehngt werden.

$ Weitere Hinweise finden Sie unter "Lange Werte senden und


abfragen" auf Seite 237.
DT_TIMESTAMP_STRUCT SQLDATETIME-Struktur mit Feldern fr

jeden Teil des Zeitstempels.


typedef struct sqldatetime { unsigned short year; /* z. B. 1999 */ unsigned char month; /* 0-11 */ unsigned char day_of_week; /* 0-6 0=Sonntag */ unsigned short day_of_year; /* 0-365 */ unsigned char day; /* 1-31 */ unsigned char hour; /* 0-23 */ unsigned char minute; /* 0-59 */ unsigned char second; /* 0-59 */ unsigned long microsecond; /* 0-999999 */ } SQLDATETIME;

Die SQLDATETIME-Struktur kann benutzt werden, um Felder vom Typ DATE, TIME und TIMESTAMP abzurufen (oder alles, was in einen dieser Datentypen konvertiert werden kann). Anwendungen haben hufig eigene Formate und einen eigenen Programmcode fr Zeit und Datum. Der Abruf von Daten in dieser Struktur, erleichtert dem Programmierer den Umgang damit. Beachten Sie, dass Felder vom Typ DATE, TIME und TIMESTAMP auch mit einem beliebigen Zeichendatentyp abgerufen und aktualisiert werden knnen. Wenn Sie eine SQLDATETIME-Struktur verwenden, um ein Datum, eine Zeit oder einen Zeitstempel in die Datenbank einzugeben, werden die Unterstze day_of_year und day_of_week ignoriert.

$ Nheres finden Sie unter den Datenbankoptionen


DATE_FORMAT, TIME_FORMAT, TIMESTAMP_FORMAT und DATE_ORDER in "Datenbankoptionen" auf Seite 597 der Dokumentation ASA Datenbankadministration.
DT_VARIABLE mit Nullwert abgeschlossene Zeichenfolge. Die Zeichenfolge muss der Name einer SQL-Variablen sein, deren Wert vom Datenbankserver benutzt wird. Dieser Datentyp wird ausschlielich benutzt, um Daten an den Datenbankserver zu liefern. Er kann nicht benutzt werden, um Daten vom Datenbankserver abzurufen.

198

Kapitel 6 Programmieren mit Embedded SQL


Die Strukturen sind in der Datei sqlca.h festgelegt. Die Datentypen VARCHAR, BINARY und DECIMAL enthalten ein Array, das aus einem einzigen Zeichen besteht und sind daher nicht geeignet, um Hostvariable zu deklarieren. Sie sind dagegen ntzlich, um Variable dynamisch zuzuweisen oder Variable zu konvertieren (typecasting). DatenbankDatentypen DATE und TIME Die Embedded SQL-Schnittstelle bietet keine Datentypen, die den verschiedenen Datenbank-Datentypen von DATE und TIME entsprechen. Diese Datenbank-Datentypen werden alle entweder mit der Struktur SQLDATETIME oder mit Zeichenfolgen abgerufen und aktualisiert.

$ 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.

199

Hostvariable benutzen

Hostvariable benutzen
Hostvariable sind C-Variable, die dem SQL-Prprozessor bekannt gemacht werden. Hostvariable knnen benutzt werden, um Werte an den Datenbankserver zu bergeben oder um Werte vom Datenbankserver abzurufen. Hostvariable sind recht einfach zu benutzen, aber sie unterliegen einigen Einschrnkungen. Dynamische SQL ist eine allgemeinere Art, um Informationen mit dem Datenbankserver auszutauschen, mit Hilfe einer Struktur namens SQL-Deskriptor-Bereich (SQL Descriptor Area - SQLDA). Der SQL-Prprozessor erzeugt fr jede einzelne Anweisung, in der Hostvariablen verwendet werden, automatisch ein SQLDA.

$ Weitere Hinweise zu dynamischem SQL finden Sie unter "Statische


und dynamische SQL" auf Seite 223.

Hostvariable deklarieren
Hostvariable werden definiert, indem sie in einen Deklarationsabschnitt eingefgt werden (declaration section). Wie in den Standards fr IBM SAA und ANSI Embedded SQL beschrieben, werden Hostvariable definiert, indem eine normale C-Variable mit folgenden Zeilen eingeschlossen wird:
EXEC SQL BEGIN DECLARE SECTION; /* Deklarationen der C-Variablen */ EXEC SQL END DECLARE SECTION;

Diese Hostvariable knnen dann an Stelle von konstanten Werten in jeder SQL-Anweisung verwendet werden. Wenn der Datenbankserver den Befehl ausfhrt, wird der Wert der Hostvariable benutzt. Beachten Sie, dass Hostvariable nicht an Stelle von Tabellen- oder Spaltennamen verwendet werden knnen: Dafr ist dynamisches SQL erforderlich. Der Variablenname hat in einer SQL-Anweisung einen Doppelpunkt (:) als Prfix, um ihn von anderen Namen zu unterscheiden, die in der Anweisung erlaubt sind. Ein standardmiger SQL-Prprozessor durchsucht nur den CProgrammcode, der innerhalb des Deklarationsabschnitts steht. TYPEDEFTypen und Strukturen sind also nicht zulssig. Variable knnen innerhalb des DECLARE-Abschnitts initialisiert werden.
Beispiel

Das folgende Beispiel zeigt den Gebrauch von Hostvariablen fr einen INSERT-Befehl. Die Variablen werden von dem Programm belegt und dann in die Datenbank eingefgt:

200

Kapitel 6 Programmieren mit Embedded SQL


EXEC SQL BEGIN DECLARE SECTION; long employee_number; char employee_name[50]; char employee_initials[8]; char employee_phone[15]; EXEC SQL END DECLARE SECTION; /* Das Programm belegt die Variablen mit passenden Werten*/ */ EXEC SQL INSERT INTO Employee VALUES (:employee_number, :employee_name, :employee_initials, :employee_phone );

$ Ein greres Beispiel finden Sie unter "Beispiel fr statischen


Cursor" auf Seite 193.

C-Hostvariablentypen
Nur eine begrenzte Anzahl von C-Datentypen werden als Hostvariable untersttzt. Andererseits haben bestimmte Hostvariable keinen entsprechenden Datentyp in C. In der Header-Datei sqlca.h festgelegte Makros knnen dazu verwendet werden, Hostvariable folgenden Typs zu definieren: VARCHAR, FIXCHAR, BINARY, PACKED DECIMAL, LONG VARCHAR, LONG BINARY oder SQLDATETIME. Sie werden wie folgt benutzt:
EXEC SQL BEGIN DECLARE SECTION; DECL_VARCHAR( 10 ) v_varchar; DECL_FIXCHAR( 10 ) v_fixchar; DECL_LONGVARCHAR( 32678 ) v_longvarchar; DECL_BINARY( 4000 ) v_binary; DECL_LONGBINARY( 128000 ) v_longbinary; DECL_DECIMAL( 10, 2 ) v_packed_decimal; DECL_DATETIME v_datetime; EXEC SQL END DECLARE SECTION;

Der Prprozessor erkennt diese Makros innerhalb eines Deklarationsabschnitts und behandelt Variable ihrem Typ entsprechend. Die folgende Tabelle zeigt die C-Variablentypen, die als Hostvariable erlaubt sind und die entsprechenden Datentypen der Embedded SQL-Schnittstelle.

201

Hostvariable benutzen

C-Datentyp short i; short int i; unsigned short int i; long l; long int l; unsigned long int l; float f; double d; DECL_DECIMAL(p,s) char a; /*n=1*/ DECL_FIXCHAR(n) a; DECL_FIXCHAR a[n]; char a[n]; /*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 aufgefllte Zeichenfolge fester Lnge. Mit Nullwert abgeschlossene Zeichenfolge. Die Zeichenfolge wird mit Leerzeichen aufgefllt, wenn bei der Initialisierung der Datenbank mit Leerzeichen aufgefllte Zeichenfolgen verwendet werden. Mit Nullwert abgeschlossene Zeichenfolge Zeichenfolge mit variabler Lnge mit 2-ByteLngenfeld, nicht mit Leerzeichen aufgefllt Zeichenfolge mit variabler Lnge mit 2-ByteLngenfeld SQLDATETIME-Struktur Lange Zeichenfolgen von variabler Lnge mit drei 4Byte-Lngenfeldern. Nicht mit Leerzeichen aufgefllt oder mit Nullwert endend. Lange Binrdaten von variabler Lnge mit drei 4Byte-Lngenfeldern. Nicht mit Leerzeichen aufgefllt.

DT_INT

DT_FLOAT DT_DOUBLE DT_DECIMAL(p,s) DT_FIXCHAR(n)

DT_STRING(n)

char *a; DECL_VARCHAR(n) a;

DT_STRING(32767) DT_VARCHAR(n)

DECL_BINARY(n) a;

DT_BINARY(n)

DECL_DATETIME a; DECL_LONGVARCHAR( n ) a;

DT_TIMESTAMP_STRUCT DT_LONGVARCHAR

DECL_LONGBINARY( n ) a;

DT_LONGBINARY

202

Kapitel 6 Programmieren mit Embedded SQL

Zeiger auf ein Zeichen (pointer to char)

Von einer Hostvariable, die als pointer to char (char *a) deklariert ist, nimmt die Datenbankschnittstelle an, dass sie 32.767 Bytes lang ist. Jede Hostvariable vom Typ pointer to char, die benutzt wird, um Informationen von der Datenbank abzurufen, muss auf einen Puffer zeigen, der gro genug ist, um jeden Wert enthalten zu knnen, der mglicherweise von der Datenbank zurckkommen knnte. Dies kann recht gefhrlich sein, denn jemand knnte die Definition der Spalte in der Datenbank ndern, sodass sie grer wird als zu dem Zeitpunkt, als das Programm geschrieben wurde. Dies wiederum knnte zu unvorhersehbaren Speicherbelegungen und daraus resultierenden Problemen fhren. Falls Sie einen 16-Bit-Compiler benutzen, knnten die erforderlichen 32.767 Bytes einen Programm-Stack-berlauf verursachen. Es ist daher vorzuziehen, ein deklariertes Array zu benutzen, auch als Parameter fr eine Funktion, die einen pointer to char erwartet. So erkennt die PREPAREAnweisung die Gre des Arrays.

Gltigkeitsbereich von Hostvariablen

Die Deklaration einer Hostvariablen kann im Allgemeinen berall dort stehen, wo auch eine C-Variablendeklaration stehen knnte. Das gilt auch fr den Parameterdeklarationsbereich einer C-Funktion. Die dort deklarierten CVariablen haben ihre normalen Aufgaben (sie stehen innerhalb des Blocks zur Verfgung, in dem sie definiert sind). Da aber der SQL-Prprozessor den C-Code nicht durchsucht, erkennt er keine C-Blcke. Fr den SQL-Prprozessor sind Hostvariable globale Variable: zwei Hostvariable knnen niemals den gleichen Namen haben.

Hostvariable benutzen
Hostvariable knnen unter folgenden Umstnden benutzt werden: In SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen sind sie berall dort erlaubt, wo eine Zahlen- oder Zeichenfolgenkonstante erlaubt sind. In der INTO-Klausel einer SELECT oder FETCH-Anweisung Hostvariable knnen auch in Embedded SQL-Befehlen benutzt werden an Stelle eines Anweisungsnamens, eines Cursornamens oder eines Optionsnamens. Im Fall von CONNECT, DISCONNECT und SET CONNECT kann eine Hostvariable benutzt werden an Stelle einer Benutzer-ID, eines Kennworts, eines Verbindungsnamens, einer Verbindungszeichenfolge oder eines Datenbank-Umgebungsnamens.

203

Hostvariable benutzen
Im Fall von SET OPTION und GET OPTION kann eine Hostvariable benutzt werden an Stelle einer Benutzer-ID, eines Optionsnamens oder eines Optionswerts. Hostvariable knnen nicht an Stelle eines Tabellennamens oder eines Spaltennamens in einer Anweisung benutzt werden. Folgendes ist gltiges Embedded SQL:
INCLUDE SQLCA; long SQLCODE; sub1() { char SQLSTATE[6]; exec SQL CREATE TABLE ... }

Beispiele

Folgendes ist nicht gltiges Embedded SQL:


INCLUDE SQLCA; sub1() { char SQLSTATE[6]; exec SQL CREATE TABLE ... } sub2() { exec SQL DROP TABLE... // Kein SQLSTATE im Gltigkeitsbereich dieser Anweisung }

SQLSTATE und SQLCODE sind besonders wichtig. Der ISO/ANSIStandard verlangt, dass sie exakt wie folgt definiert werden:
long SQLCODE; char SQLSTATE[6];

Indikatorvariable
Indikatorvariable sind C-Variable, die zustzliche Informationen liefern, wenn Sie Daten abrufen oder speichern. Indikatorvariable werden in folgenden Fllen benutzt:
NULL-Werte Damit eine Anwendung mit NULL-Werten umgehen kann. Gekrzte Zeichenfolgen Damit eine Anwendung Flle behandeln kann,

in denen ein abgerufener Wert gekrzt werden muss, um in eine Hostvariable zu passen.
Konvertierungsfehler Fr Fehlerinformationen

204

Kapitel 6 Programmieren mit Embedded SQL


Eine Indikatorvariable ist eine Hostvariable vom Typ short int, die in einer SQL-Anweisung unmittelbar auf eine normale Hostvariable folgt. In der folgenden INSERT-Anweisung zum Beispiel ist :ind_phone eine Indikatorvariable:
EXEC SQL INSERT INTO Employee VALUES (:employee_number, :employee_name, :employee_initials, :employee_phone:ind_phone );

Indikatorvariable fr die Behandlung von Nullwerten verwenden


In SQL-Daten reprsentiert NULL entweder ein unbekanntes Attribut oder eine nicht anwendbare Information. NULL in SQL darf nicht verwechselt werden mit der C-Konstante gleichen Namens (NULL). Die C-Konstante NULL wird benutzt, um nicht initialisierte oder ungltige Zeiger zu reprsentieren. In der Dokumentation zum Adaptive Server Anywhere bezieht sich eine Erwhnung von NULL immer auf die Bedeutung, die es in einer SQLDatenbank hat (wie oben definiert). Die gleichnamige C-Konstante wird dagegen als Null-Zeiger bezeichnet (Gro-/Kleinschreibung). NULL kann nicht fr einen Wert stehen, der dem fr die Spalte definierten Typ entspricht. Um einen NULL-Wert an die Datenbank zu bergeben oder NULL als Ergebnis von der Datenbank erhalten zu knnen, ist daher mehr als eine normale Hostvariable erforderlich. Indikatorvariable werden fr diesen Zweck eingesetzt. Indikatorvariable verwenden, um NULL einzufgen Eine INSERT-Anweisung knnte wie folgt eine Indikatorvariable einfgen:
EXEC SQL BEGIN DECLARE SECTION; short int employee_number; char employee_name[50]; char employee_initials[6]; char employee_phone[15]; short int ind_phone; EXEC SQL END DECLARE SECTION; /* Das Programm belegt empnum, empname, initials und homephone */ if( /* falls die Telefonnummer unbekannt ist */ ) { ind_phone = -1; } else { ind_phone = 0; } EXEC SQL INSERT INTO Employee VALUES (:employee_number, :employee_name, :employee_initials, :employee_phone:ind_phone );

205

Hostvariable benutzen
Hat die Indikatorvariable den Wert 1, wird NULL eingefgt. Hat sie den Wert 0, wird der tatschliche Wert von employee_phone eingefgt. Indikatorvariable verwenden, um NULL abzurufen Indikatorvariable werden auch benutzt, um Daten von der Datenbank abzurufen. Sie werden verwendet, um anzuzeigen, dass ein NULL-Wert abgerufen wurde (der Indikator ist negativ). Falls ein NULL-Wert von der Datenbank abgerufen wird und keine Indikatorvariable zur Verfgung steht, wird ein Fehler erzeugt (SQLE_NO_INDICATOR). Fehler werden im nchsten Abschnitt erklrt.

Indikatorvariable fr gekrzte Werte verwenden


Indikatorvariable zeigen an, ob irgendwelche abgerufenen Werte gekrzt wurden, um in eine Hostvariable zu passen. So knnen Anwendungen mit dem Krzen von Werten angemessen umgehen. Falls ein Wert beim Abrufen gekrzt wurde, wird die Indikatorvariable mit einem positiven Wert belegt. Dieser Wert gibt die Lnge an, den der aus der Datenbank abgerufene Wert vor dem Krzen hatte. Ist die Lnge des gekrzten Werts grer als 32.767, hat die Indikatorvariable den Wert 32.767.

Indikatorwerte fr Konvertierungsfehler verwenden


Als Voreinstellung ist die Datenbankoption CONVERSION_ERROR auf ON gesetzt, jede fehlgeschlagene Datentypkonvertierung fhrt zu einem Fehler und es wird keine Zeile zurckgegeben. Sie knnen Indikatorvariable verwenden, um festzustellen, in welcher Spalte eine fehlgeschlagene Datentypkonvertierung auftrat. Wenn Sie die Datenbankoption CONVERSION_ERROR auf OFF setzen, erzeugt jede fehlgeschlagene Datentypkonvertierung (statt eines Fehlers) die Warnung CANNOT_CONVERT. Hat die Spalte, in der der Konvertierungsfehler auftrat, eine Indikatorvariable, wird diese Variable mit 2 belegt. Wenn Sie beim Einfgen von Daten in die Datenbank die Datenbankoption CONVERSION_ERROR auf OFF setzen, wird der Wert NULL eingefgt, falls eine fehlgeschlagene Konvertierung auftritt.

Zusammenfassung: Werte fr Indikatorvariable


Folgende Tabelle bietet eine Zusammenfassung zum Gebrauch von Indikatorvariablen.

206

Kapitel 6 Programmieren mit Embedded SQL

Indikatorwert >0

Wert, an die Datenbank bergeben Wert der Hostvariable

Wert von der Datenbank erhalten

Der abgerufene Wert wurde gekrzt tatschliche Lnge in der Indikatorvariable Entweder das Abrufen war erfolgreich oder CONVERSION_ERROR ist auf ON gesetzt. Ergebnis NULL Konvertierungsfehler (nur wenn CONVERSION_ERROR auf OFF gesetzt ist). SQLCODE gibt die Warnung CANNOT_CONVERT aus. Ergebnis NULL

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.

207

SQL-Kommunikationsbereich (SQLCA)

SQL-Kommunikationsbereich (SQLCA)
Der SQL-Kommunikationsbereich (SQL Communication Area - SQLCA) ist ein Speicherbereich, der bei jeder Datenbankanforderung benutzt wird, um Statistiken und Fehlermeldungen von der Anwendung zum Datenbankserver zu bermitteln und umgekehrt. Der SQLCA-Bereich wird als Handle fr die Kommunikationsverbindung zwischen Anwendung und Datenbank benutzt. Er wird allen Datenbank-Bibliotheksfunktionen bergeben, die mit dem Datenbankserver kommunizieren mssen. Er wird implizit allen Embedded SQL-Anweisungen bergeben. Eine globale SQLCA-Variable ist in der Schnittstellenbibliothek definiert. Der Prprozessor erzeugt eine externe Referenz auf die globale SQLCAVariable und eine externe Referenz auf einen Zeiger auf die Variable. Die externe Referenz heit sqlca und ist vom Typ SQLCA. Der Zeiger heit sqlcaptr. Die globale Variable selbst wird in der Importbibliothek deklariert. Der SQLCA-Bereich ist in der Header-Datei sqlca.h definiert, die im Unterverzeichnis h Ihres Installationsverzeichnisses enthalten ist. SQLCA-Bereich bietet Fehlercodes Sie benutzen den SQLCA-Bereich, um auf einen bestimmten Fehlercode zu testen. Die Felder sqlcode und sqlstate enthalten Fehlercodes, falls eine Anforderung an die Datenbank einen Fehler hervorrief (siehe unten). Einige C-Makros sind definiert, um die Felder sqlcode, sqlstate und einige weitere anzusprechen.

SQLCA-Felder
Die SQLCA-Felder haben folgende Bedeutung:
sqlcaid 8-Byte Zeichenfeld, das die Zeichenfolge SQLCA enthlt (zur Identifizierung der SQLCA-Struktur). Dieses Feld untersttzt die Fehlersuche, wenn Sie Speicherinhalte untersuchen. sqlcabc Ganzzahl (long integer), die die Lnge der SQLCA-Struktur enthlt (136 Bytes) sqlcode Eine Ganzzahl ("long integer"), die den Fehlercode angibt, wenn die Datenbank einen Fehler bei einer Anforderung feststellt. Definitionen fr die Fehlercodes befinden sich in der Header-Datei sqlerr.h. Bei einer erfolgreichen Operation ist der Fehlercode 0 (Null), bei einer Warnung ist er positiv und bei einem Fehler ist er negativ.

$ Eine vollstndige Auflistung der Fehlercodes finden Sie unter


"Datenbank-Fehlermeldungen" auf Seite 1 der Dokumentation ASA Fehlermeldungen. 208

Kapitel 6 Programmieren mit Embedded SQL



sqlerrml Die Lnge der Daten im Feld sqlerrmc sqlerrmc Kann eine oder mehrere Zeichenfolgen enthalten, die in eine

Fehlermeldung einzufgen sind. Einige Fehlermeldungen enthalten eine oder mehr Platzhalter-Zeichenfolgen (%1, %2, ), die durch die Zeichenfolge in diesem Feld ersetzt werden. Wenn zum Beispiel ein Fehler Table Not Found erzeugt wird, enthlt sqlerrmc den Tabellennamen, der dann an passender Stelle in die Fehlermeldung eingefgt wird.

$ Eine vollstndige Auflistung der Fehlermeldungen finden Sie unter


"Datenbank-Fehlermeldungen" auf Seite 1 der Dokumentation ASA Fehlermeldungen.
sqlerrp Reserviert sqlerrd Array von Ganzzahlen ("long integer") sqlwarn Reserviert sqlstate SQLSTATE-Statuswert. Der ANSI SQL-Standard (SQL-92) definiert einen neuen Rckgabewerttyp fr SQL-Anweisungen, zustzlich zu dem in frheren Standards definierten SQLCODE. Der Wert von SQLSTATE ist immer eine fnf Zeichen lange mit 0 (Null) abgeschlossene Zeichenfolge, 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 Grobuchstabe von A bis Z.

Jede Klasse oder Unterklasse, die mit 0 bis 4 oder A bis H beginnt, ist durch den SQL-Standard definiert. Andere Klassen und Unterklassen sind durch die Implementierung definiert. Hat SQLSTATE den Wert '00000', ist kein Fehler und keine Warnung aufgetreten.

$ Weitere SQLSTATE-Werte finden Sie unter "DatenbankFehlermeldungen" auf Seite 1 der Dokumentation ASA Fehlermeldungen. sqlerror-Array Das Array sqlerror besteht aus folgenden Elementen:
sqlerrd[1] (SQLIOCOUNT) Die Anzahl der Eingabe/Ausgabe-Vorgnge, die erforderlich waren, um einen Befehl auszufhren.

Die Datenbank beginnt diese Zhlung nicht mit 0 (Null) fr jeden Befehl. Ihr Programm kann diese Variable vor der Ausfhrung einer Befehlssequenz auf 0 (Null) setzen. Nach dem letzten Befehl zeigt der Wert der Variablen die Gesamtzahl der Eingabe/Ausgabe-Vorgnge fr die gesamte Befehlssequenz an.
sqlerrd[2] (SQLCOUNT) Der Wert dieses Felds hngt davon ab, welche Anweisung ausgefhrt wurde.

209

SQL-Kommunikationsbereich (SQLCA)

INSERT-, UPDATE-, PUT und DELETE-Anweisungen Anzahl der

Zeilen, die von der Anweisung betroffen waren Bei Cursor OPEN wird das Feld belegt entweder mit der tatschlichen Anzahl der Zeilen im Cursor (ein Wert grer als oder gleich 0) oder mit einer Schtzung der Anzahl (ein negative Zahl, deren absoluter Wert die Schtzung ist). Es wird sich um die tatschliche Anzahl der Zeilen handeln, wenn der Datenbankserver sie errechnen kann, ohne die Zeilen zu zhlen. Die Datenbank kann auch so konfiguriert werden, dass sie immer die tatschliche Anzahl der Zeilen liefert (mit der Option ROW_COUNT).
FETCH Cursor-Anweisung Das Feld SQLCOUNT wird belegt,

falls eine SQLE_NOTFOUND-Warnung zurckgegeben wird. Es enthlt die Anzahl der Zeilen, um die eine FETCH RELATIVEoder eine FETCH ABSOLUTE-Anweisung den Bereich der mglichen Cursorpositionen berschritten hat. (Ein Cursor kann sich auf einer Zeile, vor der ersten Zeile oder nach der letzten Zeile befinden.) Bei weiten Abrufen entspricht SQLCOUNT der Anzahl der tatschlich abgerufenen Zeilen und ist kleiner oder gleich der Anzahl der angeforderten Zeilen. Whrend eines weiten Abrufs wird SQLE_NOTFOUND nicht festgelegt.

$ Weitere Hinweise zu weiten Abrufen finden Sie unter "Mehr


als eine Zeile auf einmal abrufen" auf Seite 218. Der Wert ist 0 (Null), falls die Zeile nicht gefunden wurde, die Position aber gltig ist, zum Beispiel wenn FETCH RELATIVE 1 ausgefhrt wird, und die Position ist auf der letzten Zeile eines Cursors. Der Wert ist positiv, falls das Abrufen jenseits des Cursors versucht wurde, und negativ, falls das Abrufen vor dem Anfang des Cursors versucht wurde.
GET DATA-Anweisung Das Feld SQLCOUNT enthlt die tatschliche Lnge des Werts. DESCRIBE-Anweisung In der Klausel WITH VARIABLE RESULT, die benutzt wird, um Prozeduren zu beschreiben, die mehr als ein Ergebnis haben knnen, wird SQLCOUNT auf einen der folgenden Werte gesetzt:

0 Die Ergebnismenge kann sich ndern: der Prozeduraufruf

sollte nach jeder OPEN-Anweisung neu beschrieben werden.


1 Die Ergebnismenge ist unvernderlich. Eine erneute

Beschreibung ist nicht erforderlich. Im Fall eines Syntaxfehlers, SQLE_SYNTAX_ERROR, enthlt dieses Feld die ungefhre Position des Zeichens innerhalb der Befehlszeichenfolge, wo der Fehler erkannt wurde. 210

Kapitel 6 Programmieren mit Embedded SQL

sqlerrd[3] (SQLIOESTIMATE) Die geschtzte Anzahl der Eingabe/Ausgabe-Vorgnge fr den Abschluss des Befehls. Dieses Feld wird bei einem OPEN- oder EXPLAIN-Befehl belegt.

SQLCA-Verwaltung fr Code mit mehreren Threads oder "reentrant"-Code


Sie knnen Embedded SQL-Anweisungen in Code mit mehreren Threads oder reentrant-Code benutzen. Wenn Sie allerdings eine einfache Verbindung benutzen, sind Sie auf eine aktive Anforderung pro Verbindung beschrnkt. In einer Applikation mit mehreren Threads sollten Sie es vermeiden, fr alle Threads dieselbe Verbindung zur Datenbank benutzen, auer wenn Sie Semaphore fr die Zugriffssteuerung benutzen. Sie knnen ohne Einschrnkung fr jeden Thread, der die Datenbank benutzen will, eine separate Verbindung ffnen. Der SQLCA-Bereich wird von der Laufzeitbibliothek benutzt, um zwischen den verschiedenen ThreadKontexten zu unterscheiden. Daher braucht jeder Thread, der eine Verbindung zur Datenbank bentigt, seinen eigenen SQCLA-Bereich. Jede einzelne Datenbankverbindung ist nur von einem einzelnen SQLCABereich aus zugnglich, auer bei der Abbruchanweisung, die von einem separaten Thread aus ausgegeben werden muss.

$ Hinweise zur Abbruchanforderung finden Sie unter "AnforderungsManagement implementieren" auf Seite 247.

Mehrere SQLCA-Bereiche benutzen


v Um mehrere SQLCA-Bereiche in Ihrer Anwendung zu benutzen, gehen Sie wie folgt vor:

Sie mssen fr den SQL-Prprozessor den Befehlszeilenschalter benutzen, der reentrant-Code erzeugt ( -r). Der reentrant-Code ist etwas umfangreicher und etwas langsamer, weil keine statisch initialisierten globalen Variablen benutzt werden knnen. Diese Auswirkungen sind allerdings minimal. Jeder SQLCA-Bereich, der in Ihrem Programm benutzt wird, muss mit einem Aufruf von db_init initialisiert und am Ende mit einem Aufruf von db_fini wieder freigegeben werden.

211

SQL-Kommunikationsbereich (SQLCA)

Vorsicht Wird unter NetWare nicht db_fini fr jedes db_init aufgerufen, kann das den Datenbankserver und den NetWare-Dateiserver zum Absturz bringen.

Die Embedded SQL-Anweisung SET SQLCA ("SET SQLCAAnweisung [ESQL]" auf Seite 588 der Dokumentation ASA SQLReferenzhandbuch) wird verwendet, um den SQL-Prprozessor anzuweisen, einen anderen SQLCA-Bereich fr Datenbankanforderungen zu benutzen. Ein Beispiel ist die folgende Anweisung: EXEC SQL SET SQLCA 'task_data->sqlca' wird zu Beginn eines Programms oder in einer Header-Datei benutzt, um SQLCAReferenzen so einzustellen, dass sie auf Task-spezifische Daten zeigen. Diese Anweisung erzeugt keinen Code und hat daher keinen Einfluss auf die Performance. Sie ndert den Status innerhalb des Prprozessors, sodass jede Referenz auf den SQLCA-Bereich die angegebene Zeichenfolge benutzt.

$ Weitere Hinweise zum Erstellen von SQLCA-Bereichen finden Sie


unter "SET SQLCA-Anweisung [ESQL]" auf Seite 588 der Dokumentation ASA SQL-Referenzhandbuch.

In welchen Fllen Sie mehrere SQLCA-Bereiche benutzen


Sie knnen die Untersttzung mehrfacher SQLCAs in jeder der untersttzten Embedded SQL-Umgebungen benutzen, sie ist jedoch nur fr reentrant-Code erforderlich. Die folgende Aufstellung gibt einen berblick ber die Umgebungen, in denen mehrfache SQLCAs benutzt werden mssen:
Anwendungen mit mehreren Threads Falls mehr als ein Thread

denselben SQLCA-Bereich benutzt, kann ein Kontextwechsel verursachen, dass zum gleichen Zeitpunkt mehr als ein Thread auf den SQLCA-Bereich zugreift. Jeder Thread braucht seinen eigenen SQLCABereich. Das kann auch geschehen, wenn Sie eine DLL haben, die Embedded SQL benutzt und die von mehr als einem Thread in Ihrer Anwendung aufgerufen wird.

212

Kapitel 6 Programmieren mit Embedded SQL

Dynamische Verknpfungsbibliotheken (DLL) und gemeinsam genutzte Bibliotheken Eine DLL hat nur ein Datensegment. Whrend

der Datenbankserver eine Anforderung von einer Anwendung bearbeitet, knnte er die Kontrolle an eine andere Anwendung bergeben, die ebenfalls eine Anforderung an den Datenbankserver richtet. Falls Ihre DLL den globalen SQLCA-Bereich benutzt, greifen beide Anwendungen gleichzeitig darauf zu. Jede Windows-Anwendung braucht ihren eigenen SQLCA-Bereich.
Eine DLL mit einem Datensegment Eine DLL kann mit nur einem

Datensegment erstellt werden oder mit einem Datensegment fr jede Anwendung. Falls Ihre DLL nur ein Datensegment hat, drfen Sie aus dem gleichen Grund nicht den globalen SQLCA-Bereich benutzen, aus dem eine DLL den globalen SQLCA-Bereich nicht benutzen kann. Jede Anwendung braucht ihren eigenen SQLCA-Bereich.

Verbindungsverwaltung mit mehreren SQLCA-Bereichen


Sie mssen nicht mehrere SQLCA-Bereiche benutzen, um Verbindungen zu mehr als einer Datenbank herzustellen oder um mehr als eine Verbindung zu einer einzelnen Datenbank zu halten. Jeder SQLCA-Bereich kann eine namenlose Verbindung haben. Jeder SQLCA-Bereich hat eine aktive oder aktuelle Verbindung (siehe "SET CONNECTION-Anweisung [Interactive SQL]" auf Seite 578 der Dokumentation ASA SQL-Referenzhandbuch). Alle Vorgnge, die sich auf eine angegebene Datenbankverbindung beziehen, mssen denselben SQLCA-Bereich benutzen, der verwendet wurde, als die Verbindung geffnet wurde.
Datensatz sperren

Vorgnge, die sich auf verschiedene Verbindungen beziehen, sind den normalen Datensatz-Sperrmechanismen unterworfen und knnen sich gegenseitig blockieren oder mglicherweise zu einer Deadlock-Situation fhren. Information ber Sperrmechanismen finden Sie im Kapitel "Transaktionen und Isolationsstufen verwenden" auf Seite 99 der Dokumentation ASA SQL-Benutzerhandbuch.

213

Daten abrufen

Daten abrufen
In Embedded SQL werden Daten mit der Anweisung SELECT abgerufen. Dabei werden zwei Flle unterschieden:
Die SELECT-Anweisung gibt mehr als eine Zeile zurck Verwenden

Sie eine INTO-Klausel, damit die zurckgegebenen Werte direkt Hostvariablen zugeordnet werden.

$ Hinweise dazu finden Sie unter "SELECT-Anweisungen, die


hchstens eine Zeile zurckgeben" auf Seite 214.
Die SELECT-Anweisung kann mehrere Zeilen zurckgeben

Verwenden Sie Cursor zur Verwaltung der Zeilen in der Ergebnismenge.

$ Weitere Hinweise finden Sie unter "Cursor in Embedded SQL


verwenden" auf Seite 215.

$ LONG VARCHAR- und LONG BINARY-Datentypen werden


unterschiedlich zu anderen Datentypen behandelt. Weitere Hinweise finden Sie unter "LONG-Daten abrufen" auf Seite 238.

SELECT-Anweisungen, die hchstens eine Zeile zurckgeben


Eine einzeilige Abfrage fragt hchstens eine Zeile von der Datenbank ab. In einer SELECT-Anweisung fr eine einzeilige Abfrage befindet sich eine INTO-Klausel nach der Auswahlliste und vor der FROM-Klausel. Die INTO-Klausel enthlt eine Liste der Hostvariablen, die die Werte der Auswahllisten-Elemente bernehmen sollen. Die Anzahl der Hostvariablen muss mit der Anzahl der Auswahllisten-Elemente bereinstimmen. Die Hostvariable knnen von Indikatorvariablen gefolgt sein, um NULLErgebnisse anzuzeigen. Sobald die SELECT-Anweisung ausgefhrt wird, ruft der Datenbankserver die Ergebnisse ab und schreibt sie in die Hostvariable. Falls die Abfrageergebnisse mehr als eine Zeile enthalten, gibt der Datenbankserver einen Fehler zurck. Falls das Abfrageergebnis ist, dass keine Zeile ausgewhlt ist, wird eine Row Not Found-Warnung zurckgeben. Fehler und Warnungen werden in der SQLCA-Struktur zurckgegeben, wie beschrieben in "SQLKommunikationsbereich (SQLCA)" auf Seite 208. Beispiel Folgendes Code-Fragment gibt zum Beispiel 1 zurck, falls eine Zeile der Tabelle "employee" erfolgreich abgerufen wird, 0, falls die Zeile nicht existiert, und 1, falls ein Fehler auftritt.
EXEC SQL BEGIN DECLARE SECTION;

214

Kapitel 6 Programmieren mit Embedded SQL


long emp_id; char name[41]; char sex; char birthdate[15]; short int ind_birthdate; EXEC SQL END DECLARE SECTION; . . . int find_employee( long employee ) { emp_id = employee; EXEC SQL SELECT emp_fname || || emp_lname, sex, birth_date INTO :name, :sex, :birthdate:ind_birthdate FROM "DBA".employee WHERE emp_id = :emp_id; if( SQLCODE == SQLE_NOTFOUND ) { return( 0 ); /* employee wurde nicht gefunden */ } else if( SQLCODE < 0 ) { return( -1 ); /* Fehler */ } else { return( 1 ); /* gefunden */ } }

Cursor in Embedded SQL verwenden


Ein Cursor wird benutzt, um Zeilen aus einer Abfrage abzurufen, die mehrere Zeilen in Ihrer Ergebnismenge hat. Ein Cursor ist ein Handle oder ein Name (identifier) fr die SQL-Abfrage und eine Position innerhalb der Ergebnismenge.

$ Eine Einfhrung zu Cursorn finden Sie unter "Mit Cursorn arbeiten"


auf Seite 20.
v So verwalten Sie einen Cursor in Embedded SQL:

1 2 3 4

Deklarieren Sie einen Cursor fr eine bestimmte SELECT-Anweisung mit der DECLARE-Anweisung. ffnen Sie den Cursor mit der Anweisung OPEN. Rufen Sie die Ergebnisse Zeile fr Zeile aus dem Cursor ab mit der FETCH-Anweisung. Wiederholen Sie das Abrufen der Zeilen, bis die Warnung Row Not Found zurckgegeben wird.

215

Daten abrufen
Fehler und Warnungen werden in der SQLCA-Struktur zurckgegeben, wie in "SQL-Kommunikationsbereich (SQLCA)" auf Seite 208 beschrieben. 5 Schlieen Sie den Cursor mit der CLOSE-Anweisung.

Als Voreinstellung werden Cursor automatisch am Ende der Transaktion geschlossen (bei COMMIT oder ROLLBACK). Cursor, die mit einer WITH HOLD-Klausel geffnet werden, bleiben fr folgende Transaktionen geffnet, bis sie explizit geschlossen werden. Das folgende einfache Beispiel zeigt den Gebrauch von Cursorn:
void print_employees( void ) { EXEC SQL BEGIN DECLARE SECTION; char name[50]; char sex; char birthdate[15]; short int ind_birthdate; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE C1 CURSOR FOR SELECT emp_fname || || emp_lname, sex, birth_date FROM "DBA".employee; EXEC SQL OPEN C1; for( ;; ) { EXEC SQL FETCH C1 INTO :name, :sex, :birthdate:ind_birthdate; if( SQLCODE == SQLE_NOTFOUND ) { break; } else if( SQLCODE < 0 ) { break; } if( ind_birthdate < 0 ) { strcpy( birthdate, "UNKNOWN" ); } printf( "Name: %s Sex: %c Birthdate: %s.n",name, sex, birthdate ); } EXEC SQL CLOSE C1; }

$ Vollstndige Beispiele fr Cursor finden Sie unter "Beispiel fr


statischen Cursor" auf Seite 193 und "Beispiel fr dynamischen Cursor" auf Seite 193. Cursor positionieren Ein Cursor wird an einer von drei Stellen positioniert: 216 Auf einer Zeile Vor der ersten Zeile

Kapitel 6 Programmieren mit Embedded SQL


Nach der letzten Zeile

Wird ein Cursor geffnet, ist er vor der ersten Zeile positioniert. 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, entweder bezogen auf den Anfang oder auf das Ende des Abfrageergebnisses. Er kann auch relativ zur aktuellen Cursorposition verschoben werden. Mit speziellen positioned-Versionen der Anweisungen UPDATE und DELETE knnen Sie die Zeile an der aktuellen Cursor-Position aktualisieren oder lschen. Ist der Cursor vor der ersten Zeile oder nach der letzten Zeile positioniert, wird der Fehler No Current Row of Cursor zurckgeben. Die Anweisung PUT kann verwendet werden, um eine Zeile in einen Cursor einzufgen. Cursorpositionierungsprobleme Einfgungen und einige Aktualisierungen zu DYNAMIC SCROLL-Cursorn knnen Probleme bei der Cursorpositionierung verursachen. Der Datenbankserver platziert eingefgte Zeilen an unvorhersehbaren Positionen innerhalb eines Cursors, falls die SELECT-Anweisung keine ORDER BYKlausel hat. In einigen Fllen erscheint die eingefgte Zeile berhaupt nicht, bis der Cursor geschlossen und wieder geffnet wurde.

217

Daten abrufen
Bei Adaptive Server Anywhere tritt dies auf, wenn zum ffnen eines Cursors eine temporre Tabelle erstellt werden musste.

$ Eine Beschreibung finden Sie unter "Arbeitstabellen in der


Abfrageverarbeitung verwenden" auf Seite 178 der Dokumentation ASA SQL-Benutzerhandbuch. Die UPDATE-Anweisung kann bewirken, dass sich eine Zeile im Cursor verschiebt. Das passiert, wenn der Cursor eine ORDER BY-Klausel hat, die einen vorhandenen Index benutzt (es wird keine temporre Tabelle erstellt).

Mehr als eine Zeile auf einmal abrufen


Die FETCH-Anweisung kann so modifiziert werden, dass sie mehr als eine Zeile auf einmal abruft. Das kann die Performance verbessern. Man nennt diese Methode mehrzeiliges Abrufen (wide fetch) oder auch ArrayAbrufen (array fetch).

$ Der Adaptive Server Anywhere untersttzt auch mehrzeiliges Speichern


(wide puts) und mehrzeiliges Einfgen (wide inserts). 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. Um mehrzeiliges Abrufen (wide fetches) in Embedded SQL zu verwenden, fgen Sie die Abrufanweisung wie folgt in Ihren Code ein:
EXEC SQL FETCH . . . ARRAY nnn

Dabei ist ARRAY nnn das letzte Element der FETCH-Anweisung. Die Abrufanzahl nnn kann eine Hostvariable sein. Die Anzahl der Variablen im SQLDA-Bereich muss das Produkt aus nnn multipliziert mit der Anzahl der Spalten pro Zeile sein. Die erste Zeile wird in die SQLDA-Variablen von 0 bis (Anzahl der Spalten pro Zeile)-1 geschrieben, und so fort. Jede Spalte muss in jeder Zeile des SQLDA-Bereichs vom selben Typ sein, sonst wird der Fehler SQLDA_INCONSISTENT ausgegeben. Der Server gibt in SQLCOUNT die Anzahl der Datenstze zurck, die abgerufen wurden. Diese Anzahl ist immer grer als 0 (Null), auer wenn ein Fehler oder eine Warnung ausgegeben wird. Bei einem mehrzeiligen Abruf gibt ein SQLCOUNT von 1 ohne Fehlerzustand an, dass eine gltige Zeile abgerufen wurde. Beispiel Der folgende Beispielcode zeigt den Gebrauch von mehrzeiligen Abrufen (wide fetches). Sie knnen diesen Code auch in samples\ASA\esqlwidefetch\widefetch.sqc in Ihrem SQL AnywhereVerzeichnis finden.

218

Kapitel 6 Programmieren mit Embedded SQL


#include #include #include #include EXEC SQL <stdio.h> <stdlib.h> <string.h> "sqldef.h" INCLUDE SQLCA;

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

219

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

220

Kapitel 6 Programmieren mit Embedded SQL


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

221

Daten abrufen
if( fetch_width < 2 ) { fetch_width = 2; } } } db_init( &sqlca ); EXEC SQL CONNECT "dba" IDENTIFIED BY "sql"; DoQuery( query_str, fetch_width ); EXEC SQL DISCONNECT; err: db_fini( &sqlca ); }

Hinweise zur Verwendung von mehrzeiligen Abrufen (wide fetches)

Die Funktion PrepareSQLDA weist den SQLDA-Bereich mit Hilfe der Funktion alloc_sqlda einem Speicherbereich zu. So wird Platz fr Indikatorvariable ermglicht, anstatt die Funktion alloc_sqlda_noind zu verwenden. Falls weniger als die angeforderte Anzahl von Zeilen, jedoch nicht Null, abgerufen wurden (zum Beispiel am Ende des Cursors), wird fr die nicht abgerufenen SQLDA-Elemente jeweils NULL zurckgegeben, indem der entsprechende Indikatorwert gesetzt wird. Falls keine Indikatorvariable vorhanden ist, wird ein Fehler erzeugt (SQLE_NO_INDICATOR: keine Indikatorvariable fr ein NULLErgebnis). Falls eine Zeile zurckgegeben wird, die aktualisiert wurde, und die eine Warnung SQLE_ROW_UPDATED_WARNING hervorgerufen hat, wird der Abruf in der Zeile angehalten, die die Warnung verursacht hat. Die Werte aller bis zu diesem Zeitpunkt abgearbeiteten Zeilen werden zurckgegeben (einschlielich der Zeile, die die Warnung verursacht hat). SQLCOUNT enthlt die Anzahl der Zeilen, die abgerufen wurden, einschlielich der Zeile, die die Warnung verursacht hat. Alle verbleibenden SQLDA-Elemente werden mit NULL gekennzeichnet. Falls eine Zeile, die abgerufen werden soll, gelscht oder gesperrt wurde und so einen Fehler hervorruft (SQLE_NO_CURRENT_ROW oder SQLE_LOCKED), enthlt SQLCOUNT die Anzahl der Zeilen, die vor dem Fehler gelesen wurden. Dies schliet nicht die Zeile ein, die den Fehler verursachte. Der SQLDA-Bereich enthlt keine Werte fr die Zeilen, denn bei Fehlern werden keine SQLDA-Werte zurckgegeben. Der Wert von SQLCOUNT kann verwendet werden, um den Cursor neu zu positionieren und, falls ntig, um die Zeilen zu lesen.

222

Kapitel 6 Programmieren mit Embedded SQL

Statische und dynamische SQL


Es gibt zwei Mglichkeiten, SQL-Anweisungen in ein C-Programm einzubetten: Statische Anweisungen Dynamische Anweisungen

Bis hier haben wir statische SQL erklrt. Dieser Abschnitt vergleicht statische und dynamische SQL.

Statische SQL-Anweisungen
Alle Standard-SQL-Anweisungen zur Datenmanipulation und Datendefinition knnen in ein C-Programm eingebettet werden, indem man sie mit dem Prfix EXEC SQL versieht und das Kommando mit einem Semikolon (;) abschliesst. Diese Anweisungen werden als statische Anweisungen bezeichnet. Statische Anweisungen knnen Referenzen auf Hostvariable enthalten, wie in "Hostvariable benutzen" auf Seite 200 beschrieben. Alle Beispiele bis hier haben statische Embedded SQL-Anweisungen benutzt. Hostvariable knnen nur an Stelle von Zeichenfolgen- und numerischen Konstanten benutzt werden. Sie knnen nicht verwendet werden, um Spalten- oder Tabellennamen zu ersetzen; fr diese Vorgnge sind dynamische Anweisungen erforderlich.

Dynamische SQL-Anweisungen
In C werden Zeichenfolgen in Zeichen-Arrays gespeichert. Dynamische Anweisungen werden in C-Zeichenfolgen konstruiert. Diese dynamischen Anweisungen knnen dann mit der PREPARE-Anweisung und der EXECUTE-Anweisung ausgefhrt werden. Solche SQL-Anweisungen knnen Hostvariable nicht in der gleichen Weise ansprechen wie statische Anweisungen, denn auf C-Variable kann nicht ber den Namen zugegriffen werden, solange das C-Programm ausgefhrt wird.

223

Statische und dynamische SQL


Um Informationen zwischen dynamischen SQL-Anweisungen und CVariablen auszutauschen, wird eine Datenstruktur namens SQLDeskriptorbereich (SQL Descriptor Area - SQLDA) verwendet. Diese Struktur wird vom SQL-Prprozessor erzeugt, wenn Sie beim EXECUTEBefehl in der USING-Klausel eine Liste von Hostvariablen spezifizieren. Jeder Variablen entspricht jeweils ein Platzhalter in der vorbereiteten Anweisung, zugeordnet ber die Position.

$ Informationen zum SQLDA-Bereich finden Sie unter "Der SQLDeskriptor-Bereich (SQLDA)" auf Seite 228. Ein Platzhalter wird in die Anweisung eingefgt, um anzuzeigen, wo auf Hostvariable zugegriffen wird. Ein Platzhalter ist entweder ein Fragezeichen (?) oder eine Referenz auf eine Hostvariable wie in statischen Anweisungen (ein Hostvariablen-Name mit einem vorangestellten Doppelpunkt). Im letzteren Fall dient der Name der Hostvariable, der im Text der Anweisung benutzt wird, nur als Platzhalter fr eine Referenz auf den SQLDeskriptorbereich. Eine Hostvariable, mit der Informationen an die Datenbank bergeben werden, wird eine Bindevariable genannt. Beispiel Zum Beispiel:
EXEC SQL BEGIN DECLARE SECTION; char comm[200]; char address[30]; char city[20]; short int cityind; long empnum; EXEC SQL END DECLARE SECTION; . . . sprintf( comm, "update %s set address = :?, city = :?" " where employee_number = :?", tablename ); EXEC SQL PREPARE S1 FROM :comm; EXEC SQL EXECUTE S1 USING :address, :city:cityind, :empnum;

Um diese Methode zu benutzen, muss der Programmierer wissen, wie viele Hostvariable in der Anweisung vorkommen. Normalerweise ist das nicht der Fall. Daher knnen Sie Ihre eigene SQLDA-Struktur aufsetzen und diesen SQLDA-Bereich in der USING-Klausel des EXECUTE-Befehls angeben. Die Anweisung DESCRIBE BIND VARIABLES gibt die Namen der Hostvariablen zu den Bindevariablen zurck, die in einem PreparedStatement gefunden wurden. Dies erleichtert es dem C-Programm, die Hostvariablen zu verwalten. Im Folgenden finden Sie die allgemeine Methode: 224

Kapitel 6 Programmieren mit Embedded SQL


EXEC SQL BEGIN DECLARE SECTION; char comm[200]; EXEC SQL END DECLARE SECTION; . . . sprintf( comm, "update %s set address = :address, city = :city" " where employee_number = :empnum", tablename ); EXEC SQL PREPARE S1 FROM :comm; /* Nehmen Sie an, dass es nicht mehr als 10 Hostvariable gibt. Siehe nchstes Beispiel, falls Sie keine Grenze festlegen knnen */ sqlda = alloc_sqlda( 10 ); EXEC SQL DESCRIBE BIND VARIABLES FOR S1 USING DESCRIPTOR sqlda; /* sqlda->sqld sagt Ihnen, wie viele Hostvariable gefunden wurden. */ /* SQLDA_VARIABLE-Felder mit Werten belegen, die auf den name-Feldern in sqlda basieren. . . . EXEC SQL EXECUTE S1 USING DESCRIPTOR sqlda; free_sqlda( sqlda );

SQLDA-Inhalt

Der SQLDA-Bereich besteht aus einem Array von Variablendeskriptoren. Jeder Deskriptor beschreibt die Attribute der entsprechenden Variablen des C-Programms, oder die Stelle, an der die Datenbank Daten speichert oder von der sie Daten abruft: den Datentyp die Lnge, falls type eine Zeichenfolge ist Gesamtstellen und Dezimalstellen, falls type ein nummerischer Datentyp ist Speicheradresse Indikatorvariable

$ Eine vollstndige Beschreibung der SQLDA-Struktur finden Sie unter


"Der SQL-Deskriptor-Bereich (SQLDA)" auf Seite 228 Indikatorvariable und NULL Die Indikatorvariable wird verwendet, um einen NULL-Wert an die Datenbank zu bergeben, oder um einen NULL-Wert von der Datenbank abzurufen. Die Indikatorvariable wird auch vom Datenbankserver verwendet, um anzuzeigen, unter welchen Bedingungen Werte whrend einer Datenbankoperation gekrzt wurden. Die Indikatorvariable wird mit einem positiven Wert besetzt, wenn nicht genug Platz zur Verfgung stand, um einen Wert von der Datenbank zu erhalten.

$ Weitere Hinweise finden Sie unter "Indikatorvariable" auf Seite 204.


225

Statische und dynamische SQL

Die dynamische SELECT-Anweisung


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

226

Kapitel 6 Programmieren mit Embedded SQL


} EXEC SQL CLOSE C1; EXEC SQL DROP STATEMENT S1;

Beenden Sie Anweisungen (drop), wenn sie nicht mehr gebraucht werden. So stellen Sie sicher, dass Anweisungen beendet werden, damit nicht unntigerweise Ressourcen gebunden bleiben.

$ Ein vollstndiges Beispiel fr den Gebrauch von Cursorn fr eine


dynamische Anweisung finden Sie unter "Beispiel fr dynamischen Cursor" auf Seite 193.

$ Detaillierte Informationen zu den oben erwhnten Funktionen finden


Sie unter "Referenz der Bibliotheksfunktion" auf Seite 253.

227

Der SQL-Deskriptor-Bereich (SQLDA)

Der SQL-Deskriptor-Bereich (SQLDA)


Der SQLDA-Bereich (SQL Descriptor Area) ist eine Schnittstellenstruktur, die fr dynamische SQL-Anweisungen verwendet wird. Die Struktur tauscht Informationen ber Hostvariable und Ergebnisse der SELECT-Anweisung mit der Datenbank aus. Der SQLDA-Bereich ist in der Header-Datei sqlda.h definiert.

$ In der Datenbank-Schnittstellenbibliothek oder DLL gibt es


Funktionen, die Sie zur Verwaltung der SQLDA-Bereiche verwenden knnen. Die Beschreibung dieser Funktionen finden Sie unter "Referenz der Bibliotheksfunktion" auf Seite 253. Wenn Hostvariable mit statischen SQL-Anweisungen verwendet werden, erzeugt der Prprozessor einen SQDLA-Bereich fr diese Hostvariable. Was dann mit der Datenbank ausgetauscht wird, ist tatschlich dieser SQLDABereich.

Die SQLDA-Header-Datei
Der Inhalt von sqlda.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.h" #endif #define SQL_MAX_NAME_LEN #define _sqldafar 30

_sqlfar

typedef short int a_SQL_type; struct sqlname { short int length; /* Lnge der Char-Daten */ char data[ SQL_MAX_NAME_LEN ]; /* Daten */ }; struct sqlvar { /* Array der Deskriptoren der Variablen */ short int sqltype; /* Typ der Hostvariablen */ short int sqllen; /* Lnge der Hostvariablen */ void _sqldafar *sqldata; /* Adresse der Variablen */ short int _sqldafar *sqlind; /* Indikatorvariablen-Zeiger */ struct sqlname sqlname; };

228

Kapitel 6 Programmieren mit Embedded SQL


struct sqlda{ unsigned char sqldaid[8]; /* Eye-catcher "SQLDA"*/ a_SQL_int32 sqldabc; /* Lnge der sqlda-Struktur*/ short int sqln; /* Deskriptorgre in Anzahl der Eintrge */ short int sqld; /* Anzahl der von DESCRIBE gefundenen Variablen*/ struct sqlvar sqlvar[1]; /* Array der Variablendeskriptoren */ }; #define SCALE(sqllen) ((sqllen)/256) #define PRECISION(sqllen) ((sqllen)&0xff) #define SET_PRECISION_SCALE(sqllen,precision,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.h" #endif #endif SQLDA; SQLVAR, SQLDA_VARIABLE; SQLNAME, SQLDA_NAME; ( sizeof( struct sqlda ) + \ (n-1) * sizeof( struct sqlvar) )

SQLDA-Felder
Die SQLDA-Felder haben folgende Bedeutung:
Feld sqldaid Beschreibung Ein 8-Byte-Zeichenfeld, das die Zeichenfolge SQLDA zur Identifizierung der SQLDA-Struktur enthlt. Dieses Feld untersttzt die Fehlersuche, wenn Sie Speicherinhalte untersuchen. Eine Ganzzahl (long integer), die die Lnge der SQLDA-Struktur enthlt Die Anzahl der Variablendeskriptoren im Array sqlvar Die Anzahl der gltigen Variablendeskriptoren (die eine Hostvariable beschreiben). Dieses Feld wird in der Regel von der DESCRIBE-Anweisung gesetzt, manchmal auch vom Programmierer, wenn Daten an den Datenbankserver geliefert werden. Ein Array, bestehend aus Deskriptoren vom Typ struct sqlvar, von denen jeder eine Hostvariable beschreibt

sqldabc sqln sqld

sqlvar

229

Der SQL-Deskriptor-Bereich (SQLDA)

SQLDA-Hostvariablen-Beschreibungen
Jede sqlvar-Struktur im SQLDA-Bereich beschreibt eine Hostvariable. Die Felder der sqlvar-Struktur haben folgende Bedeutung:
sqltype Der Typ der Variable, die von diesem Deskriptor beschrieben

wird (siehe "Datentypen in Embedded SQL" auf Seite 196) Das "low order Bit" zeigt an, ob NULL-Werte erlaubt sind. Gltige Typen- und Konstantendefinitionen befinden sich in der Header-Datei sqldef.h. Dieses Feld wird von der DESCRIBE-Anweisung belegt. Sie knnen dieses Feld mit jedem Typ belegen, wenn Sie Daten an den Datenbankserver liefern oder Daten vom Datenbankserver abrufen. Erforderliche Typkonvertierungen erfolgen automatisch.
sqllen Lnge der Variable. Was der Wert dieser Variable tatschlich

bedeutet, hngt von den Informationen zum Typ ab und davon, wie der SQLDA-Bereich verwendet wird. Fr DECIMAL-Typen wird dieses Feld in zwei je 1 Byte lange Felder aufgeteilt. Das "high byte" reprsentiert die Anzahl der Gesamtstellen und das "low byte" die Anzahl der Dezimalstellen. Die Gesamtstellen sind die Gesamtzahl der Ziffern. Die Dezimalstellen sind die Anzahl der Ziffern nach dem Dezimalzeichen. Bei LONG VARCHAR- und LONG BINARY-Datentypen wird das array_len-Feld der DT_LONGBINARY- und DT_LONGVARCHARDatentypstruktur anstelle des sqllen-Felds verwendet.

$ Weitere Informationen ber das Lngenfeld finden Sie unter


"SQLDA sqllen-Feldwerte" auf Seite 232.
sqldata Ein 4-Byte-Zeiger auf den Speicher, der von der Variable belegt wird. Dieser Speicherinhalt muss den Feldern sqltype und sqllen entsprechen.

$ Informationen ber Speicherformate finden Sie unter "Datentypen


in Embedded SQL" auf Seite 196. Beim UPDATE- und INSERT-Befehl spielt diese Variable keine Rolle fr den Vorgang, falls der sqldata-Zeiger ein Null-Zeiger ist. Bei FETCH werden keine Daten zurckgegeben, falls der sqldata-Zeiger ein Null-Zeiger ist. In anderen Worten, die vom Zeiger sqldata zurckgegebene Spalte ist eine entbundene Spalte.

230

Kapitel 6 Programmieren mit Embedded SQL


Falls die DESCRIBE-Anweisung LONG NAMES benutzt, enthlt dieses Feld den Langnamen der Ergebnismengen-Spalte. Falls die DESCRIBE-Anweisung darber hinaus eine DESCRIBE USER TYPES-Anweisung ist, dann enthlt dieses Feld den Langnamen des benutzerdefinierten Datentyps statt der Spalte. Ist der Typ ein ein vordefinierter Datentyp, ist das Feld leer.
sqlind Ein Zeiger auf den Indikatorwert. Ein Indikatorwert ist eine Ganzzahl (short int). Ein negativer Indikatorwert zeigt einen NULLWert an. Ein positiver Indikatorwert bedeutet, dass diese Variable von einer FETCH-Anweisung gekrzt wurde. Der Indikatorwert enthlt die Lnge der Daten, bevor sie gekrzt wurden. Ein Wert von 2 zeigt einen Konvertierungsfehler an, wenn die Datenbankoption CONVERSION_ERROR auf OFF gesetzt ist.

$ Weitere Hinweise finden Sie unter "Indikatorvariable" auf


Seite 204. Ist der sqlind-Zeiger ein Null-Zeiger, gehrt keine Indikatorvariable zu dieser Hostvariable. Das sqlind-Feld wird auch in der DESCRIBE-Anweisung verwendet, um Parametertypen anzuzeigen. Ist der Datentyp benutzerdefiniert, wird das Feld auf DT_HAS_USERTYPE_INFO gesetzt. In diesem Fall sollten Sie DESCRIBE USER TYPES ausfhren, um Informationen ber den benutzerdefinierten Datentyp zu erhalten.
sqlname Eine VARCHAR-Struktur, die einen Lngen- und einen Zeichenpuffer enthlt. Sie ist mit einer DESCRIBE-Anweisung belegt und wird nur dafr benutzt. Dieses Feld hat verschiedene Bedeutungen fr zwei Formate der DESCRIBE-Anweisung:

Auswahlliste (SELECT LIST) Der Namenpuffer ist belegt mit dem Spaltentitel des entsprechenden Elements in der ausgewhlten Liste. Bindevariable Der Namenpuffer ist belegt mit dem Namen der Hostvariable, die als Bindevariable benutzt wurde, oder mit "?" falls eine namenlose Parametermarkierung verwendet wurde.

Handelt es sich um einen DESCRIBE SELECT LIST-Befehl, sind alle vorhandenen Indikatorvariablen mit einer Markierung (flag) belegt, die anzeigt, ob das Listenelement aktualisierbar ist. Weitere Informationen ber diese Markierung finden Sie in der Header-Datei sqldef.h. Handelt es sich um eine DESCRIBE USER TYPES-Anweisung, dann enthlt dieses Feld den Langnamen des benutzerdefinierten Datentyps an Stelle der Spalte. Ist der Typ ein ein vordefinierter Datentyp, ist das Feld leer.

231

Der SQL-Deskriptor-Bereich (SQLDA)

SQLDA sqllen-Feldwerte
Die Feldlnge sqllen der sqlvar-Struktur in einem SQLDA-Bereich wird in drei verschiedenen Arten von Interaktionen mit dem Datenbankserver verwendet.
Werte beschreiben Mit der DESCRIBE-Anweisung erhalten Sie Informationen ber die Hostvariablen, die zum Speichern von Daten erforderlich sind, die von der Datenbank abgerufen wurden, oder ber Hostvariable, die zum bergeben von Daten an die Datenbank erforderlich sind.

$ Siehe "Werte beschreiben" auf Seite 232.



Werte abrufen Werte von der Datenbank abrufen.

$ Siehe "Werte abrufen" auf Seite 235.


Werte senden Informationen an die Datenbank senden.

$ Siehe "Werte senden" auf Seite 234.


Diese Interaktionen werden in diesem Abschnitt behandelt. Die folgenden Tabellen beschreiben detailliert jede dieser Interaktionen. Diese Tabellen enthalten die Schnittstellen-Konstantentypen (DT_-Typen), die in der Header-Datei sqldef.h zu finden sind. Es sind die Konstanten, die das SQLDA-Feld sqltype belegen knnen.

$ Hinweise ber sqltype-Feldwerte finden Sie unter "Datentypen in


Embedded SQL" auf Seite 196. Auch in statischem SQL wird ein SQLDA-Bereich verwendet, er wird allerdings vom SQL-Prprozessor erzeugt und vollstndig belegt. In diesem Fall zeigen die Tabellen die Entsprechungen zwischen den statischen CHostvariablentypen und den Schnittstellenkonstanten.

Werte beschreiben
Die folgende Tabelle zeigt die Werte der Strukturelemente sqllen und sqltype, die der DESCRIBE-Befehl fr verschiedene Datenbanktypen zurckgibt (sowohl SELECT LIST als auch BIND VARIABLE DESCRIBEAnweisungen). Im Fall eines benutzerdefinierten Datenbank-Datentyps wird der zu Grunde liegende Datentyp beschrieben. Ihr Programm kann entweder die Typen und Lngen benutzen, die DESCRIBE zurckgibt, oder es kann andere Typen benutzen. Der Datenbankserver wird jede erforderliche Typkonvertierung durchfhren. Der Speicherbereich, auf den das Feld sqldata zeigt, muss den Feldern sqltype und sqllen entsprechen. 232

Kapitel 6 Programmieren mit Embedded SQL

$ Weitere Hinweise zu Embedded SQL-Datentypen finden Sie unter


"Datentypen in Embedded SQL" auf Seite 196.
Datenbank-Feldtyp zurckgegebener Embedded SQL-Typ DT_BIGINT DT_BINARY DT_BIT DT_FIXCHAR DT_DATE von describe zurckgegebene Lnge 8 n 1 n die Lnge der lngsten formatierten Zeichenfolge das high byte des Lngenfelds im SQLDA-Bereich auf p setzen, das low byte auf s 8 4 4 32767 32767 4 2 die Lnge der lngsten formatierten Zeichenfolge die Lnge der lngsten formatierten Zeichenfolge 1 8 4 2 n

BIGINT BINARY(n) BIT CHAR(n) DATE

DECIMAL(p,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, wie Sie die Lnge eines Werts spezifizieren, wenn Sie im SQLDA-Bereich Daten an den Datenbankserver liefern. In diesem Fall sind nur die in der Tabelle gezeigten Datentypen erlaubt. Die Datentypen DT_DATE, DT_TIME und DT_TIMESTAMP werden genau so behandelt wie DT_STRING, wenn Informationen an die Datenbank geliefert werden. Der Wert muss eine mit Nullwert abgeschlossene Zeichenfolge in einem passenden Datumsformat sein.
Embedded SQL-Datentyp DT_BIGINT DT_BINARY(n) DT_BIT DT_DATE DT_DECIMAL(p,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 Lnge keine Aktion erforderlich die Lnge wird einem Feld in der Struktur BINARY entnommen keine Aktion erforderlich Lnge durch das abschlieende \0 bestimmt das high byte des Lngenfelds im SQLDABereich auf p setzen, das low byte auf s keine Aktion erforderlich das Lngenfeld im SQLDA-Bereich bestimmt die Lnge der Zeichenfolge keine Aktion erforderlich keine Aktion erforderlich Lngenfeld ignoriert. Siehe "LONG-Daten senden" auf Seite 240 Lngenfeld ignoriert. Siehe "LONG-Daten senden" auf Seite 240 keine Aktion erforderlich Lnge durch das abschlieende \0 bestimmt Lnge durch das abschlieende \0 bestimmt Lnge durch das abschlieende \0 bestimmt keine Aktion erforderlich

234

Kapitel 6 Programmieren mit Embedded SQL


Embedded SQL-Datentyp DT_UNSBIGINT DT_UNSINT DT_UNSSMALLINT DT_VARCHAR(n) DT_VARIABLE Programmaktion zur Einstellung der Lnge keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich die Lnge wird einem Feld in der Struktur VARCHAR entnommen Lnge durch das abschlieende \0 bestimmt

Werte abrufen
Die folgende Tabelle zeigt die Werte des Lngenfelds, wenn Sie Daten von der Datenbank abrufen und den SQLDA-Bereich verwenden. Das Feld sqllen wird beim Abrufen von Daten nie gendert. In diesem Fall sind nur die in der Tabelle gezeigten Datentypen erlaubt. Die Datentypen DT_DATE, DT_TIME und DT_TIMESTAMP werden genau so behandelt wie DT_STRING, wenn Informationen von der Datenbank abgerufen werden. Der Wert wird als Zeichenfolge im aktuellen Datumsformat formatiert.
Embedded SQLDatentyp Auf welchen Wert muss das Programm das Lngenfeld setzen, wenn es Daten von der Datenbank abruft? keine Aktion erforderlich Maximale Lnge der Struktur BINARY (n+2) keine Aktion erforderlich Lnge des Puffers Das "high byte" auf p setzen und das "low byte" auf s keine Aktion erforderlich Lnge des Puffers keine Aktion erforderlich Wie gibt die Datenbank Lngeninformationen zurck, nachdem ein Wert abgerufen wurde? keine Aktion erforderlich das Feld len der Struktur BINARY ist auf die tatschliche Lnge gesetzt keine Aktion erforderlich \0 am Ende der Zeichenfolge keine Aktion erforderlich

DT_BIGINT DT_BINARY(n)

DT_BIT DT_DATE DT_DECIMAL(p,s)

DT_DOUBLE DT_FIXCHAR(n) DT_FLOAT

keine Aktion erforderlich bis zur Lnge des Puffers aufgefllt mit Leerzeichen keine Aktion erforderlich

235

Der SQL-Deskriptor-Bereich (SQLDA)


Embedded SQLDatentyp Auf welchen Wert muss das Programm das Lngenfeld setzen, wenn es Daten von der Datenbank abruft? keine Aktion erforderlich Lnge-Feld ignoriert. Siehe "LONG-Daten abrufen" auf Seite 238 Lnge-Feld ignoriert. Siehe "LONG-Daten abrufen" auf Seite 238 keine Aktion erforderlich Lnge des Puffers Lnge des Puffers Lnge des Puffers keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich keine Aktion erforderlich Maximale Lnge der Struktur VARCHAR (n+2) Wie gibt die Datenbank Lngeninformationen zurck, nachdem ein Wert abgerufen wurde? keine Aktion erforderlich Lnge-Feld ignoriert. Siehe "LONG-Daten abrufen" auf Seite 238 Lnge-Feld ignoriert. 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 tatschliche Lnge 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

Kapitel 6 Programmieren mit Embedded SQL

Lange Werte senden und abfragen


Die Methode zum Senden und Abrufen von LONG VARCHAR- und LONG BINARY-Werten in Embedded SQL-Anwendungen ist anders als bei den brigen Datentypen. Sie knnen auch die Standard-SQLDA-Felder verwenden, allerdings sind diese auf 32-Kbyte-Daten beschrnkt, da die Felder, die die Informationen enthalten (sqldata, sqllen, sqlind), 16-BitWerte sind. Eine nderung dieser Werte auf 32-Bit-Werte wrde vorhandene Anwendungen zerstren. Die Methode zur Beschreibung von LONG VARCHAR- und LONG BINARY-Werten ist dieselbe wie bei anderen Datentypen.

$ Hinweise ber das Abrufen und Senden von Werten finden Sie unter
"LONG-Daten abrufen" auf Seite 238 und "LONG-Daten senden" auf Seite 240. Verwendung von statischem SQL Es werden separate Struktuten verwendet, um die zugeordneten, gespeicherten und ungekrzten Lngen von LONG BINARY- und LONG VARCHAR-Datentypen aufzunehmen. Die statischen SQL-Datentypen werden in sqlca.h folgendermaen definiert:
#define DECL_LONGVARCHAR( size ) \ struct { a_sql_uint32 array_len; \ a_sql_uint32 stored_len; \ a_sql_uint32 untrunc_len; \ char array[size+1];\ } #define DECL_LONGBINARY( size ) struct { a_sql_uint32 array_len; a_sql_uint32 stored_len; a_sql_uint32 untrunc_len; char array[size]; } \ \ \ \ \

Verwendung von dynamischem SQL

Bei dynamischem SQL ist das Einstellen des sqltype-Felds auf DT_LONGVARCHAR oder DT_LONGBINARY ausreichend. Die zugeordneten LONGBINARY- und LONGVARCHAR-Sturkturen sehen folgendermaen aus:

237

Lange Werte senden und abfragen


typedef struct LONGVARCHAR { a_sql_uint32 array_len; /* Anzahl der zugeordneten Byte im Array */ a_sql_uint32 stored_len; /* Anzahl der im Array gespeicherten Byte * (nie hher als array_len) */ a_sql_uint32 untrunc_len; /* Anzahl der Byte in nicht-gekrztem * Ausdruck(kann hher sein als array_len) */ char array[1]; /* die Daten */ } LONGVARCHAR, LONGBINARY;

$ Hinweise darber, wie Sie diese Funktion in Ihren Anwendungen


implementieren, finden Sie unter "LONG-Daten abrufen" auf Seite 238 und "LONG-Daten senden" auf Seite 240.

LONG-Daten abrufen
Dieser Abschnitt beschreibt, wie Sie LONG-Werte aus der Datenbank abrufen. Hintergrundinformationen finden Sie unter "Lange Werte senden und abfragen" auf Seite 237. Die Prozeduren unterscheiden sich abhngig davon, ob Sie statisches oder dynamisches SQL verwenden.
v So rufen Sie einen LONG VARCHAR- oder LONG BINARY-Wert ab (statisches SQL):

1 2

Deklarieren Sie eine Hostvariable vom Typ DECL_LONGVARCHAR oder DECL_LONGBINARY, wie erforderlich. Rufen Sie die Daten mit FETCH, GET DATA oder EXECUTE INTO ab. Adaptive Server Anywhere stellt die folgenden Informationen ein:
Indikatorvariable Die Indikatorvariable ist negativ, wenn der Wert NULL ist, oder 0, wenn es keine Krzung gibt; beziehungsweise die positive ungekrzte Lnge in Byte bis zu einem Hchstwert von 32767.

$ Weitere Hinweise finden Sie unter "Indikatorvariable" auf


Seite 204.
stored_len Dieses DECL_LONGVARCHAR- oder

DECL_LONGBINARY-Feld enthlt die Anzahl von Byte, die in das Array abgerufen werden. Der Wert ist niemals grer als array_len.

238

Kapitel 6 Programmieren mit Embedded SQL

untrunc_len Dieses DECL_LONGVARCHAR- oder

DECL_LONGBINARY-Feld enthlt die Anzahl von Byte, die vom Datenbankserver gehalten werden. Dieser Wert muss kleiner/gleich dem stored_len-Wert sein. Er wird auch gesetzt, wenn der Datenwert ungekrzt ist.
v So nehmen Sie einen Wert in eine LONGVARCHAR- oder LONGBINARY-Struktur auf (dynamisches SQL):

1 2

Stellen Sie das sqltype-Feld auf DT_LONGVARCHAR oder DT_LONGBINARY ein, wie erforderlich. Stellen Sie das sqldata-Feld so ein, dass es auf die LONGVARCHARoder LONGBINARY-Struktur zeigt. Sie knnen das LONGVARCHARSIZE( n )- oder LONGBINARYSIZE( n )-Makro verwenden, um die Gesamtanzahl der Bytes zu bestimmen, die zugeordnet werden mssen, um n-Byte von Daten im Array-Feld aufzunehmen.

Stellen Sie das array_len-Feld der LONGVARCHAR- oder LONGBINARY-Struktur auf die Anzahl der Bytes ein, die dem ArrayFeld zugeordnet sind. Rufen Sie die Daten mit FETCH, GET DATA oder EXECUTE INTO ab. Adaptive Server Anywhere stellt die folgenden Informationen ein:
* sqlind Dieses sqlda-Feld ist negativ, wenn der Wert NULL ist,

oder 0, wenn es keine Krzung gibt, beziehungsweise die positive ungekrzte Lnge in Byte bis zu einem Hchstwert von 32767.
stored_len Dieses LONGVARCHAR- oder LONGBINARY-Feld

enthlt die Anzahl von Byte, die in das Array abgerufen werden. Der Wert ist niemals grer als array_len.
untrunc_len Dieses LONGVARCHAR- oder LONGBINARY-Feld

enthlt die Anzahl von Byte, die vom Datenbankserver gehalten werden. Dieser Wert muss kleiner/gleich dem stored_len-Wert sein. Er wird auch gesetzt, wenn der Datenwert ungekrzt ist. Der folgende Codeabschnitt illustriert den Mechanismus, der zum Abrufen von LONG VARCHAR-Daten mittels dynamischem Embedded SQL verwendet wird. Er dient nur zur Illustration und ist nicht fr eine tatschliche Verwendung bestimmt.

239

Lange Werte senden und abfragen


#define DATA_LEN 128000 void get_test_var() /*****************/ { LONGVARCHAR *longptr; SQLDA *sqlda; SQLVAR *sqlvar; sqlda = alloc_sqlda( 1 ); longptr = (LONGVARCHAR *)malloc( LONGVARCHARSIZE( DATA_LEN ) ); if( sqlda == NULL || longptr == NULL ) { fatal_error( "Allocation failed" ); } // longptr fr Datenaufnahme initialisieren longptr->array_len = DATA_LEN; // _ // (sqllen wird nicht mit DT_LONG-Typen verwendet) sqlda->sqld = 1; // 1 sqlvar verwenden sqlvar = &sqlda->sqlvar[0]; sqlvar->sqltype = DT_LONGVARCHAR; sqlvar->sqldata = longptr; printf( "fetching test_var\n" ); EXEC SQL PREPARE select_stmt FROM 'SELECT test_var'; EXEC SQL EXECUTE select_stmt INTO DESCRIPTOR sqlda; EXEC SQL DROP STATEMENT select_stmt; printf( "stored_len: %d, untrunc_len: %d, 1st char: %c, last char: %c\n", longptr->stored_len, longptr->untrunc_len, longptr->array[0], longptr->array[DATA_LEN-1] ); free_sqlda( sqlda ); free( longptr ); }

LONG-Daten senden
Dieser Abschnitt beschreibt, wie Sie LONG-Werte an die Datenbank von Embedded SQL-Anwendungen senden. Hintergrundinformationen finden Sie unter "Lange Werte senden und abfragen" auf Seite 237. Die Prozeduren unterscheiden sich abhngig davon, ob Sie statisches oder dynamisches SQL verwenden.

240

Kapitel 6 Programmieren mit Embedded SQL


v So senden Sie einen LONG VARCHAR- oder LONG BINARY-Wert (statisches SQL):

1 2

Deklarieren Sie eine Hostvariable vom Typ DECL_LONGVARCHAR oder DECL_LONGBINARY, wie erforderlich. Wenn Sie NULL senden und eine Indikatorvariable verwenden, stellen Sie die Indikatorvariable auf einen negativen Wert ein.

$ Weitere Hinweise finden Sie unter "Indikatorvariable" auf


Seite 204. 3 Stellen Sie das stored_len-Feld der DECL_LONGVARCHAR- oder DECL_LONGBINARY-Struktur auf die Anzahl von Byte der Daten im Array-Feld ein. Senden Sie die Daten, indem Sie den Corsor ffnen oder die Anweisung ausfhren.

Der folgende Codeabschnitt illustriert den Mechanismus, der zum Senden von LONG VARCHAR-Daten mittels statischem Embedded SQL verwendet wird. Er dient nur zur Illustration und ist nicht fr eine tatschliche Verwendung bestimmt.
#define DATA_LEN 12800 EXEC SQL BEGIN DECLARE SECTION; // SQLPP initialisiert longdata.array_len DECL_LONGVARCHAR(128000) longdata; EXEC SQL END DECLARE SECTION; void set_test_var() /*****************/ { // longdata fr das Senden von Daten initialisieren memset( longdata.array, 'a', DATA_LEN ); longdata.stored_len = DATA_LEN; printf( "Setting test_var to %d a's\n", DATA_LEN ); EXEC SQL SET test_var = :longdata; }

v So senden Sie einen Wert mittels einer LONGVARCHAR- oder LONGBINARY-Struktur (dynamisches SQL):

1 2 3

Stellen Sie das sqltype-Feld auf DT_LONGVARCHAR oder DT_LONGBINARY ein, wie erforderlich. Wenn Sie NULL senden, stellen Sie * sqlind auf einen negativen Wert ein. Stellen Sie das sqldata-Feld so ein, dass es auf die LONGVARCHARoder LONGBINARY-Struktur zeigt. 241

Lange Werte senden und abfragen


Sie knnen das LONGVARCHARSIZE( n )- oder LONGBINARYSIZE( n )-Makro verwenden, um die Gesamtanzahl an Byte zu bestimmen, die zugeordnet werden mssen, um n-Byte von Daten im Array-Feld aufzunehmen. 4 Stellen Sie das array_len-Feld der LONGVARCHAR- oder LONGBINARY-Struktur auf die Anzahl an Byte ein, die dem ArrayFeld zugeordnet sind. Stellen Sie das stored_len-Feld der LONGVARCHAR- oder LONGBINARY-Struktur auf die Anzahl an Byte der Daten im ArrayFeld ein. Dieser Wert darf nicht grer als array_len sein. Senden Sie die Daten, indem Sie den Cursor ffnen oder die Anweisung ausfhren.

242

Kapitel 6 Programmieren mit Embedded SQL

Gespeicherte Prozeduren verwenden


In diesem Abschnitt wird die Verwendung von SQL-Prozeduren in Embedded SQL beschrieben.

Einfache gespeicherte Prozeduren verwenden


Sie knnen gespeicherte Prozeduren in Embedded SQL erstellen und aufrufen. Eine CREATE PROCEDURE-Anweisung kann wie jede andere Datendefinitions-Anweisung, z.B. CREATE TABLE, eingebettet werden. Sie knnen auch eine CALL-Anweisung einbetten, um eine gespeicherte Prozedur auszufhren. Das folgende Code-Fragment veranschaulicht das Erstellen und Ausfhren einer gespeicherten Prozedur in Embedded SQL
EXEC SQL CREATE PROCEDURE pettycash( IN amount DECIMAL(10,2) ) BEGIN UPDATE account SET balance = balance - amount WHERE name = bank; UPDATE account SET balance = balance + amount WHERE name = pettycash expense; END; EXEC SQL CALL pettycash( 10.72 );

Wenn Sie Werte von Hostvariablen an eine gespeicherte Prozedur weitergeben oder die Ausgabevariable abrufen wollen, bereiten Sie eine CALL-Anweisung vor und fhren Sie sie aus. Das folgende Code-Fragment veranschaulicht die Verwendung von Hostvariablen. Sowohl die USING als auch die INTO-Klausel werden in der EXECUTE-Anweisung benutzt.
EXEC SQL BEGIN DECLARE SECTION; double hv_expense; double hv_balance; EXEC SQL END DECLARE SECTION;

243

Gespeicherte Prozeduren verwenden


// hier Code schreiben EXEC SQL CREATE PROCEDURE pettycash( IN expense DECIMAL(10,2), OUT endbalance DECIMAL(10,2) ) BEGIN UPDATE account SET balance = balance - expense WHERE name = bank; UPDATE account SET balance = balance + expense WHERE name = pettycash expense; SET endbalance = ( SELECT balance FROM account WHERE name = bank ); END; EXEC SQL PREPARE S1 FROM CALL pettycash( ?, ? ); EXEC SQL EXECUTE S1 USING :hv_expense INTO :hv_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.

Gespeicherte Prozeduren mit Ergebnismengen


Eine Datenbankprozedur kann auch eine SELECT-Anweisung enthalten. Die Prozedur wird mit einer RESULT-Klausel deklariert, um Anzahl, Name und Typen der Spalten in der Ergebnismenge zu spezifizieren. Die Spalten einer Ergebnismenge unterscheiden sich von den Ausgabeparametern. In einer Prozedur mit Ergebnismenge kann die CALL-Anweisung an Stelle der SELECT-Anweisung in der Cursordeklaration verwendet werden:
EXEC SQL BEGIN DECLARE SECTION; char hv_name[100]; EXEC SQL END DECLARE SECTION; EXEC SQL CREATE PROCEDURE female_employees() RESULT( name char(50) ) BEGIN SELECT emp_fname || emp_lname FROM employee WHERE sex = f; END; EXEC SQL PREPARE S1 FROM CALL female_employees(); EXEC SQL DECLARE C1 CURSOR FOR S1; EXEC SQL OPEN C1; for(;;) {

244

Kapitel 6 Programmieren mit Embedded SQL


EXEC SQL FETCH C1 INTO :hv_name; if( SQLCODE != SQLE_NOERROR ) break; printf( "%s\\n", hv_name ); } EXEC SQL CLOSE C1;

In diesem Beispiel wurde die Prozedur mit einer OPEN-Anweisung statt einer EXECUTE-Anweisung aufgerufen. Nach der OPEN-Anweisung wird die Prozedur ausgefhrt, bis sie eine SELECT-Anweisung erreicht. Zu diesem Zeitpunkt ist C1 ein Cursor fr die SELECT-Anweisung innerhalb der Datenbankprozedur. Sie knnen alle Arten des FETCH-Befehls verwenden (rckwrts und vorwrts scrollen) solange Sie sie bentigen. Die CLOSE-Anweisung beendet die Ausfhrung der Prozedur. Nach der SELECT-Anweisung wird in der Prozedur keine weitere Anweisung ausgefhrt. Um Anweisungen nach dem SELECT auszufhren, benutzen Sie den Befehl RESUME Cursorname. Der RESUME-Befehl gibt entweder die Warnung SQLE_PROCEDURE_COMPLETE zurck oder SQLE_NOERROR, und zeigt damit an, dass es noch einen weiteren Cursor gibt. Das folgende Beispiel zeigt eine zweifache Auswahlprozedur:
EXEC SQL CREATE PROCEDURE people() RESULT( name char(50) ) BEGIN SELECT emp_fname || emp_lname FROM employee; SELECT fname || lname FROM customer; END; EXEC SQL PREPARE S1 FROM CALL people(); EXEC SQL DECLARE C1 CURSOR FOR S1; EXEC SQL OPEN C1; while( SQLCODE == SQLE_NOERROR ) { for(;;) { EXEC SQL FETCH C1 INTO :hv_name; if( SQLCODE != SQLE_NOERROR ) break; printf( "%s\\n", hv_name ); } EXEC SQL RESUME C1; } EXEC SQL CLOSE C1;

Dynamische Cursor fr CALLAnweisungen

Diese Beispiele haben statische Cursor verwendet. Dynamische Cursor knnen auch fr die CALL-Anweisung verwendet werden.

$ Eine Beschreibung von dynamischen Cursorn finden Sie unter "Die


dynamische SELECT-Anweisung" auf Seite 226. 245

Gespeicherte Prozeduren verwenden


Die DESCRIBE-Anweisung funktioniert ohne Einschrnkung fr Prozeduraufrufe. DESCRIBE OUTPUT erzeugt einen SQLDA-Bereich mit einer Beschreibung fr jede Spalte der Ergebnismenge. Hat die Prozedur keine Ergebnismenge, enthlt der SQLDA-Bereich eine Beschreibung fr jeden INOUT- oder OUT-Parameter der Prozedur. Eine DESCRIBE INPUT-Anweisung erzeugt einen SQLDA-Bereich mit einer Beschreibung fr jeden IN- oder INOUT-Parameter der Prozedur. DESCRIBE ALL DESCRIBE ALL beschreibt IN-, INOUT-, OUT- und RESULT-Parameter. DESCRIBE ALL benutzt die Indikatorvariablen im SQLDA-Bereich, um zustzliche Information zu liefern. Die Bits fr DT_PROCEDURE_IN und DT_PROCEDURE_OUT werden in den Indikatorvariablen gesetzt, wenn eine CALL-Anweisung beschrieben wird. DT_PROCEDURE_IN gibt einen IN- oder INOUT-Parameter an, und DT_PROCEDURE_OUT gibt einen INOUT- oder OUT-Parameter an. In RESULT-Spalten von Prozeduren sind beide Bits bereinigt. Nach einem Beschreibungs-OUTPUT knnen diese Bits benutzt werden, um zwischen Anweisungen zu unterscheiden, die Ergebnismengen haben (mssen OPEN, FETCH, RESUME, CLOSE benutzen), und Anweisungen, die keine Ergebnismengen haben (mssen EXECUTE benutzen).

$ Eine vollstndige Beschreibung finden Sie unter "DESCRIBEAnweisung [ESQL]" auf Seite 426 der Dokumentation ASA SQLReferenzhandbuch. Mehrfache Ergebnismengen Haben Sie eine Prozedur, die mehrere Ergebnismengen zurckgibt, mssen Sie sie nach jeder RESUME-Anweisung neu beschreiben, falls sich die Form der Ergebnismengen ndert. Sie mssen den Cursor beschreiben, nicht die Anweisung, um die aktuelle Position des Cursors neu zu beschreiben.

246

Kapitel 6 Programmieren mit Embedded SQL

Programmiertechniken fr Embedded SQL


Dieser Abschnitt enthlt eine Reihe von Tipps fr Entwickler von Programmen mit Embedded SQL.

Anforderungs-Management implementieren
Das voreingestellte Verhalten der Schnittstellen-DLL fr Anwendungen beinhaltet es, zu warten, bis eine Anforderung an die Datenbank ausgefhrt wurde und erst dann andere Funktionen auszufhren. Dieses Verhalten knnen Sie mit Hilfe der Funktionen fr die Anforderungsverwaltung ndern. Zum Beispiel ist bei Interactive SQL das Betriebssystem weiterhin aktiv, whrend Interactive SQL auf eine Antwort der Datenbank wartet und inzwischen andere Aufgaben ausfhrt. Sie knnen eine Anwendung aktivieren, whrend eine Anforderung an die Datenbank abgearbeitet wird, indem Sie eine Callback-Funktion zur Verfgung stellen. In dieser Callback-Funktion setzen Sie eine weitere Datenbankanforderung - keine db_cancel_request - ab. Sie knnen die Funktion db_is_working in Ihren Message-Handlers verwenden, um festzustellen, ob gerade eine Anforderung an die Datenbank abgearbeitet wird. Die Funktion db_register_a_callback wird verwendet, um die CallbackFunktionen Ihrer Anwendung zu registrieren:

$ Weitere Hinweise finden Sie im Folgenden.


"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 untersttzt online-Sicherungen in Anwendungen mit Embedded SQL. Das Sicherungsdienstprogramm setzt diese Funktion ein. Sie brauchen nur dann ein Programm zu schreiben, das diese Funktion verwendet, falls Ihre Sicherungsanforderungen die Leistung des Sicherungsdienstprogramms von Adaptive Server Anywhere bersteigen.

247

Programmiertechniken fr Embedded SQL

BACKUP-Anweisung wird empfohlen

Obwohl diese Funktion ein Mglichkeit bietet, einer Anwendung Sicherungsfunktionen hinzuzufgen, wird empfohlen, diese Aufgabe ber die BACKUP-Anweisung zu auszufhren. Weitere Hinweise finden Sie unter "BACKUP-Anweisung" auf Seite 268 der Dokumentation ASA SQL-Referenzhandbuch.

$ Sie knnen mit der Funktion DBBackup der Datenbank-Tools auch


direkt auf das Sicherungsdienstprogramm zugreifen. Weitere Hinweise ber diese Funktion finden Sie im Abschnitt "DBBackup-Funktion" auf Seite 323.

$ Weitere Hinweise finden Sie unter "db_backup-Funktion" auf


Seite 254.

248

Kapitel 6 Programmieren mit Embedded SQL

SQL-Prprozessor
Der SQL-Prprozessor bearbeitet ein C- oder C++-Programm, das Embedded SQL-Code enthlt, bevor der Compiler gestartet wird.
Syntax sqlpp [ Parameter ] SQL-Dateiname [ Ausgabedateiname ] Parameter c "Schlsselwort=Wert;..." d e Ebene f -g h Zeilenbreite k -m Version n o Betriebssys p Projekt q r s Zeichenfolgenlnge w Ebene x z Sequenz Siehe auch: Beschreibung Referenzparameter fr die Datenbankverbindung bereitstellen [UltraLite] Bevorzugte Datengre Nicht-konforme SQL-Syntax als Fehler kennzeichnen Das Schlsselwort "far" in erzeugte statische Daten schreiben UltraLite-Warnungen nicht anzeigen Maximale Zeilenlnge der Ausgabe begrenzen Benutzerdeklarationation von SQLCODE einfgen Versionsnamen fr generierte Synchronisationsskripten angeben Zeilennummern Ziel-Betriebssystem. UltraLite-Projektname Stiller Modus: Keinen Vorspann ausgeben Wieder-eintretender Code Maximale Zeichenfolgenlnge fr den Compiler Nicht-konforme SQL-Syntax als Warnung kennzeichnen Mehrbyte-SQL-Zeichenfolgen in Escapesequenzen umwandeln Sortierfolge angeben

"berblick" auf Seite 182

249

SQL-Prprozessor

Beschreibung

Der SQL-Prprozessor bearbeitet ein C- oder C++-Programm, das Embedded SQL-Code enthlt, bevor der Compiler gestartet wird. SQLPP bersetzt die SQL-Anweisungen in Eingabedatei in Quellcode der Sprache C, der in Ausgabedatei gelegt wird. Die normale Dateinamenerweiterung fr Quelldateien mit Embedded SQL ist .sqc. Der voreingestellte Name fr die Ausgabedatei ist der Name der SQL-Datei mit der Erweiterung .c. Falls der Name der SQL-Datei bereits die Erweiterung .c hat, erhlt die Ausgabedatei standardmig die Erweiterung .cc.
c Erforderlich, wenn Dateien, die Teil einer UltraLite-Anwendung sind, mit

Optionen

dem Prprozessor bearbeitet werden. Die Verbindungszeichenfolge muss dem SQL-Prprozessor Zugriff zum Lesen und ndern Ihrer Referenzdatenbank geben.
d Code erzeugen, der die Gre des Datenbereichs reduziert.

Datenstrukturen werden vor der Verwendung zur Ausfhrungszeit wieder benutzt und initialisiert. Dies erhht die Code-Gre.
e Diese Option kennzeichnet Embedded SQL-Code, der nicht Teil eines

bestimmten Sets von SQL/92 ist, als Fehler. Die zulssigen Werte von Ebene und ihre Bedeutung sind wie folgt:
e Kennzeichnet Syntax, die nicht Einstiegsebene-SQL/92-Syntax ist i Kennzeichnet Syntax, die nicht Zwischenebene-SQL/92-Syntax ist f Kennzeichnet Syntax, die nicht vollstndige SQL/92-Syntax ist t Nicht-Standard-Hostvariablentypen markieren u Kennzeichnet Syntax, die nicht von UltraLite untersttzt wird w Lsst die gesamte untersttzte Syntax zu

-g Keine Warnungen im Hinblick auf die Erzeugung von UltraLite-Code h Begrenzt die maximale Lnge von Ausgabezeilen durch sqlpp auf

Zeilenbreite. Das Fortsetzungszeichen ist ein Rckstrich (\) und der Mindestwert von Zeilenbreite ist zehn.
k Teilt dem Prprozessor mit, dass das zu kompilierende Programm eine

Benutzerdeklaration von SQLCODE enthlt


-m Geben Sie den Versionsnamen fr die erzeugten Synchronisationsskripts

an. Die erzeugten Synchronisationsskripts knnen in einer MobiLinkkonsolidierten Datenbank fr einfache Synchronisation verwendet werden.

250

Kapitel 6 Programmieren mit Embedded SQL


n Erzeugt Zeilennummerinformationen in der C-Datei. Diese umfassen

#line-Direktiven an den betreffenden Stellen im erzeugten C-Code. Wenn der von Ihnen verwendete Compiler die Anweisung #line untersttzt, lsst diese Option den Compiler Fehler in Zeilennummern in der SQC-Datei protokollieren (der Datei mit Embedded SQL), und zwar im Gegensatz zum Protokollieren von Fehlern in Zeilennummern in der C-Datei, die vom SQLPrprozessor erzeugt wird. Ebenso werden die #line-Anweisungen indirekt vom Source Level Debugger verwendet, sodass Sie bei der Fehlersuche gleichzeitig die SQC-Quelldatei sehen knnen.
o Geben Sie das Ziel-Betriebssystem an. Beachten Sie, dass diese Option

mit dem Betriebssystem bereinstimmen muss, auf dem das Programm ausgefhrt werden soll. In Ihrem Programm wird eine Referenz auf ein bestimmtes Symbol erzeugt. Dieses Symbol ist in der Schnittstellenbibliothek definiert. Wenn Sie die falsche BetriebssystemSpezifikation oder die falsche Bibliothek verwenden, wird vom Linker ein Fehler erkannt. Folgende Betriebssysteme werden untersttzt:
WINDOWS Windows 95/98/Me, Windows CE WINNT Microsoft Windows NT/2000/XP NETWARE Novell NetWare UNIX UNIX

p Kennzeichnet das UltraLite-Projekt, zu dem die Embedded SQL-Dateien gehren. Diese Option kann nur verwendet werden, wenn Dateien verarbeitet werden, die Teil einer UltraLite-Anwendung sind. q Kein Banner drucken. r Weitere Hinweise zum reentrant-Code finden Sie unter "SQLCA-

Verwaltung fr Code mit mehreren Threads oder "reentrant"-Code" auf Seite 211.
s Setzt die maximale Gre fr Zeichenfolgen fest, die der Prprozessor in

die C-Datei ausgibt. Zeichenfolgen, die lnger als dieser Wert sind, werden mit Hilfe einer Liste von Zeichen initialisiert (a,b,c usw.). Die meisten CCompiler sind in der Gre der Zeichenfolgenliterale begrenzt, die Sie handhaben knnen. Mit dieser Option wird die obere Grenze festgesetzt. Der Standardwert ist 500.
w Diese Option kennzeichnet jeden Embedded SQL-Code als Warnung, der

nicht Teil eines bestimmten Sets von SQL/92 ist. Die zulssigen Werte von Ebene und ihre Bedeutung sind wie folgt:
e Kennzeichnet Syntax, die nicht Einstiegsebene-SQL/92-Syntax ist

251

SQL-Prprozessor

i Kennzeichnet Syntax, die nicht Zwischenebene-SQL/92-Syntax ist f Kennzeichnet Syntax, die nicht vollstndige SQL/92-Syntax ist t Nicht-Standard-Hostvariablentypen markieren u Kennzeichnet Syntax, die nicht von UltraLite untersttzt wird w Lsst die gesamte untersttzte Syntax zu

x ndert Mehrbyte-Zeichenfolgen in Escape-Sequenzen, sodass sie vom

Compiler verarbeitet werden knnen.


z Mit dieser Option wird die Kollatierungssequenz angegeben. Um eine Liste mit den empfohlenen Kollatierungssequenzen zu erhalten, geben Sie dbinit l an der Eingabeaufforderung ein.

Die Kollatierungssequenz hilft dem Prprozessor, die Zeichen zu verstehen, die im Quellcode oder Programm verwendet werden, z.B. bei der Identifizierung von alphabetischen Zeichen, die fr die Verwendung in Bezeichnern geeignet sind. Wenn -z nicht angegeben wird, versucht der Prprozessor, auf Grund des Betriebssystems und der Umgebungsvariablen SQLLOCALE eine geeignete Kollatierung zu ermitteln.

252

Kapitel 6 Programmieren mit Embedded SQL

Referenz der Bibliotheksfunktion


Der SQL-Prprozessor erzeugt Funktionsaufrufe in der Schnittstellenbibliothek oder DLL. Zustzlich zu den vom SQL-Prprozessor erzeugten Funktionsaufrufen wird dem Benutzer eine Gruppe von Bibliotheksfunktionen zur Verfgung gestellt, mit denen Datenbankvorgnge leichter ausgefhrt werden knnen. Prototypen dieser Funktionen werden durch den Befehl EXEC SQL INCLUDE SQLCA eingefgt. Dieser Abschnitt enthlt eine Referenzbeschreibung der verschiedenen Funktionen, geordnet nach Kategorien. DLL-Eintrittspunkte Die DLL-Eintrittspunkte sind gleich, abgesehen davon, dass die Prototypen einen fr DLLs passenden Zusatz haben. Sie knnen die Eintrittspunkte auf portierbare Weise unter Verwendung von _esqlentry_ deklarieren, was in sqlca.h definiert ist. Es wird in den Wert __stdcall aufgelst:

alloc_sqlda-Funktion
Prototyp Beschreibung SQLDA *alloc_sqlda( unsigned numvar );

Diese Funktion weist einen SQLDA-Bereich mit Deskriptoren fr die numvar zu. Das Feld sqln des SQLDA-Bereichs wird mit der numvar initialisiert. Den Indikatorvariablen wird Speicherplatz zugewiesen, die Indikatorzeiger werden auf diesen Speicherplatz gesetzt und der Indikatorwert wird mit 0 (Null) initialisiert. Ein Null-Zeiger wird zurckgegeben, falls kein Speicher zugewiesen werden konnte. Es wird empfohlen, dass Sie diese Funktion an Stelle der Funktion alloc_sqlda_noind verwenden.

alloc_sqlda_noind-Funktion
Prototyp Beschreibung SQLDA *alloc_sqlda_noind( unsigned numvar );

Diese Funktion weist einen SQLDA-Bereich mit Deskriptoren fr die numvar zu. Das Feld sqln des SQLDA-Bereichs wird mit der numvar initialisiert. Den Indikatorvariablen wird kein Speicherplatz zugewiesen; die Indikatorzeiger werden auf den Null-Zeiger gesetzt. Ein Null-Zeiger wird zurckgegeben, falls kein Speicher zugewiesen werden konnte.

253

Referenz der Bibliotheksfunktion

db_backup-Funktion
Prototyp void db_backup( SQLCA * sqlca, int op, int file_num, unsigned long page_num, SQLDA * sqlda);

ZugriffsBerechtigung

Um die Sicherungsfunktionen benutzen zu knnen, mssen Sie mit einer Benutzer-ID mit DBA-Berechtigung oder mit REMOTE DBA-Berechtigung (SQL Remote) verbunden sein.
BACKUP-Anweisung wird empfohlen

Beschreibung

Obwohl diese Funktion ein Mglichkeit bietet, einer Anwendung Sicherungsfunktionen hinzuzufgen, wird empfohlen, diese Aufgabe ber die BACKUP-Anweisung zu auszufhren. Weitere Hinweise finden Sie unter "BACKUP-Anweisung" auf Seite 268 der Dokumentation ASA SQL-Referenzhandbuch. Welche Aktion ausgefhrt wird, hngt vom Wert des Parameters op ab:
DB_BACKUP_START Mu aufgerufen werden, bevor eine Sicherung

beginnen kann. Zu einem Zeitpunkt kann immer nur eine Sicherung auf einem gegebenen Datenbankserver laufen. Datenbank-Checkpoints sind deaktiviert, bis die Sicherung vollstndig ist (db_backup wird mit dem Wert op fr DB_BACKUP_END aufgerufen). Kann die Sicherung nicht starten, wird der SQLCODE mit SQLE_BACKUP_NOT_STARTED belegt. Andernfalls wird das Feld SQLCOUNT des sqlca mit der Gre der Datenbankseiten belegt. (Sicherungen werden Seite fr Seite durchgefhrt.) Die Parameter file_num, page_num und sqlda werden nicht beachtet.
DB_BACKUP_OPEN_FILE ffnet die mit file_num angegebene Datenbankdatei, sodass Seiten der angegebenen Datei mit DB_BACKUP_READ_PAGE gesichert werden knnen. Gltige Dateinummern sind 0 (Null) bis DB_BACKUP_MAX_FILE fr die Stamm-Datenbankdateien, DB_BACKUP_TRANS_LOG_FILE fr die Transaktionslogdatei und DB_BACKUP_WRITE_FILE fr die Datenbank-Write-Datei, falls sie existiert. Falls die angegebene Datei nicht existiert, wird SQLCODE mit SQLE_NOTFOUND belegt. Andernfalls enthlt SQLCOUNT die Anzahl der Seiten in der Datei, SQLIOESTIMATE enthlt einen 32-Bit-Wert (POSIX time_t), der die Zeit angibt, zu der die Datenbankdatei erstellt wurde, der Name der Betriebssystemdatei befindet sich im Feld sqlerrmc des SQLCABereichs.

254

Kapitel 6 Programmieren mit Embedded SQL


Die Parameter page_num und sqlda werden nicht beachtet.
DB_BACKUP_READ_PAGE Eine Seite der Datenbankdatei lesen, die

mit file_num angegeben wird. page_num sollte einen Wert von 0 bis 1 weniger als die Seitenanzahl haben, die von einem erfolgreichen Aufruf von db_backup mit dem Vorgang DB_BACKUP_OPEN_FILE in SQLCOUNT zurckgegeben wurde. Andernfalls wird SQLCODE mit SQLE_NOTFOUND belegt. Der sqlda-Deskriptor sollte mit einer Variablen vom Typ DT_BINARY eingerichtet werden, die auf einen Puffer zeigt. Der Puffer sollte gro genug sein, um Binrdaten in der Gre zu speichern, wie sie im Feld SQLCOUNT beim Aufruf von db_backup mit dem Vorgang DB_BACKUP_START zurckgegeben werden. Die Daten in DT_BINARY enthalten eine 2 Byte lange Lngenangabe, gefolgt von den eigentlichen Binrdaten, sodass der Puffer mindestens 2 Byte lnger sein muss als die Seitengre.
Die Anwendung muss den Puffer speichern

Dieser Aufruf erzeugt eine der angegebenen Datenbankseiten im Puffer, aber es bleibt der Anwendung berlassen, den Pufferinhalt auf einem Sicherungsdatentrger zu speichern.
DB_BACKUP_READ_RENAME_LOG Die gleiche Aktion wie bei

DB_BACKUP_READ_PAGE, auer dass nach der letzten Seite das Transaktionslog zurckgegeben wurde; der Datenbankserver das bestehende Transaktionslog umbenennt und ein ein neues startet Falls der Datenbankserver nicht in der Lage ist, das Log zu diesem Zeitpunkt umzubenennen (z.B. knnen in Datenbanken der Version 7.x oder lter unvollstndige Transaktionen auftreten) tritt der Fehler SQLE_BACKUP_CANNOT_RENAME_LOG_YET auf. In diesem Fall benutzen Sie nicht die zurckgegebene Seite, sondern erneuern Sie die Anforderung, bis Sie SQLE_NOERROR erhalten und schreiben Sie dann die Seite. Fahren Sie mit dem Lesen der Seiten fort, bis Sie den Zustand SQLE_NOTFOUND erhalten. Die Fehlermeldung SQLE_BACKUP_CANNOT_RENAME_LOG_YET kann mehrere Male und fr mehrere Seiten auftreten. In Ihrer Wiederholungsschleife sollten Sie eine Verzgerung einbauen, um den Server nicht mit zu vielen Anforderungen zu verlangsamen. Erhalten Sie die Bedingung SQLE_NOTFOUND, wurde das Transaktionslog erfolgreich gesichert und die Datei umbenannt. Der Name der alten Transaktiondatei wird im Feld sqlerrmc des SQLCABereichs zurckgegeben. 255

Referenz der Bibliotheksfunktion


Den Wert von sqlda->sqlvar[0].sqlind sollten Sie berprfen, nachdem Sie db_backup aufgerufen haben. Ist dieser Wert grer als 0 (Null), wurde die letzte Logseite geschrieben und die Logdatei wurde umbenannt. Der neue Name befindet sich nach wie vor in sqlca.sqlerrmc, aber der Wert von SQLCODE ist SQLE_NOERROR. Danach sollten Sie db_backup nicht nochmals aufrufen, auer Sie mchten Dateien schlieen und die Sicherung beenden. Falls Sie das tun, erhalten Sie eine zweite Kopie Ihrer gesicherten Logdatei und SQLE_NOTFOUND.
DB_BACKUP_CLOSE_FILE Muss aufgerufen werden, wenn die Bearbeitung einer Datei abgeschlossen ist, um die mit file_num angegebene Datenbankdatei zu schlieen.

Die Parameter page_num und sqlda werden nicht beachtet.


DB_BACKUP_END Mu beim Beenden der Sicherung aufgerufen werden. Keine andere Sicherung kann beginnen, bevor die letzte beendet wurde. Checkpoints werden wieder aktiviert.

Die Parameter file_num, page_num und sqlda werden nicht beachtet. Das Programm dbbackup verwendet folgenden Algorithmus. Beachten Sie, dass es sich nicht um C-Code handelt, und dass keine Fehlerberprfung enthalten ist.
db_backup( ... DB_BACKUP_START ... ) allocate page buffer based on page size in SQLCODE sqlda = alloc_sqlda( 1 ) sqlda->sqld = 1; sqlda->sqlvar[0].sqltype = DT_BINARY sqlda->sqlvar[0].sqldata = allocated buffer for file_num = 0 to DB_BACKUP_MAX_FILE db_backup( ... DB_BACKUP_OPEN_FILE, file_num ... ) if SQLCODE == SQLE_NO_ERROR /* Datei vorhanden */ num_pages = SQLCOUNT file_time = SQLE_IO_ESTIMATE open backup file with name from sqlca.sqlerrmc for page_num = 0 to num_pages - 1 db_backup( ... DB_BACKUP_READ_PAGE, file_num, page_num, sqlda ) write page buffer out to backup file next page_num close backup file db_backup( ... DB_BACKUP_CLOSE_FILE, file_num ... ) 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

Kapitel 6 Programmieren mit Embedded SQL


db_backup( ... DB_BACKUP_END ... )

db_cancel_request-Funktion
Prototyp Beschreibung int db_cancel_request( SQLCA *sqlca );

Diese Funktion bricht die gerade aktive Anforderung an den Datenbankserver ab. Sie berprft, ob die Anforderung an den Datenbankserver aktiv ist, bevor sie die Abbruchsanforderung sendet. Wenn die Funktion 1 zurckgibt, wurde die Abbruchsanforderung gesendet; wenn sie 0 zurckgibt, wurde keine Anforderung gesendet. Ein Rckgabewert ungleich 0 bedeutet nicht, dass die Anforderung abgebrochen wurde. Es gibt einige kritische zeitliche berschneidungen, wenn sich die Abbruchsanforderung und die Antwort von der Datenbank oder vom Server berschneiden. In diesen Fllen findet einfach kein Abbruch statt, obwohl die Funktion weiterhin TRUE zurckgibt. Die Funktion db_cancel_request kann asynchron aufgerufen werden. Diese und die Funktion db_is_working sind die einzigen Funktionen in der Schnittstellenbibliothek der Datenbank, die asynchron aufgerufen werden knnen, weil sie einen SQLCA-Bereich benutzen, der schon von einer anderen Anforderung verwendet werden knnte. Wenn Sie eine Anforderung abbrechen, die eine Cursoroperation durchfhrt, ist die Position des Cursors unbestimmt. Sie mssen den Cursor entweder mit seiner absoluten Position festlegen oder ihn nach dem Abbrechen schlieen.

db_delete_file-Funktion
Prototyp void db_delete_file( SQLCA * sqlca, char * filename );

ZugriffsBerechtigung

Um die Sicherungsfunktionen benutzen zu knnen, mssen Sie mit einer Benutzer-ID mit DBA-Berechtigung oder mit REMOTE DBA-Berechtigung (SQL Remote) verbunden sein. Die Funktion db_delete_file fordert vom Datenbankserver das Lschen der Datei namens filename an. Diese Funktion kann nach dem Sichern und Umbenennen des Transaktionslogs verwendet werden (siehe oben, DB_BACKUP_READ_RENAME_LOG in "db_backup-Funktion" auf Seite 254), um das alte Transaktionslog zu lschen. Sie mssen mit einer Benutzer-ID mit DBA-Berechtigung verbunden sein.

Beschreibung

257

Referenz der Bibliotheksfunktion

db_find_engine-Funktion
Prototyp unsigned short db_find_engine( SQLCA *sqlca, char *name );

Beschreibung

Diese Funktion gibt eine kurze Ganzzahl ohne Vorzeichen zurck, die Statusinformationen ber den Datenbankserver namens name anzeigt. Falls kein Server mit dem angegebenen Namen gefunden werden kann, ist der Rckgabewert 0 (Null). Ein Rckgabewert ungleich 0 bedeutet, dass der angegebene Server gerade luft. Jedes Bit des Rckgabewert enthlt eine spezifische Information. Die Header-Datei sqldef.h definiert Konstanten fr diese Informationen. Falls ein Null-Zeiger fr name angegeben wird, gibt die Funktion Information ber die voreingestellte Datenbank zurck.

db_fini-Funktion
Prototyp Beschreibung unsigned short db_fini( *sqlca );

Diese Funktion gibt Ressourcen frei, die von der Datenbankschnittstelle benutzt wurden. Nachdem Sie db_fini aufgerufen haben, sind keine weiteren Bibliotheksaufrufe und keine weiteren Embedded SQL-Befehle erlaubt. Wenn whrend der Verarbeitung ein Fehler auftritt, wird der Fehlercode in SQLCA eingestellt und die Funktion gibt 0 zurck. Wenn es keine Fehler gegeben hat, wird ein Nicht-Nullwert zurckgegeben. Sie mssen db_fini einmal fr jeden benutzten SQLCA-Bereich aufrufen.
Vorsicht Wird unter NetWare nicht db_fini fr jedes db_init aufgerufen, kann das den Datenbankserver und den NetWare-Dateiserver zum Absturz bringen.

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.

db_get_property-Funktion
Prototyp unsigned int db_get_property( SQLCA * sqlca, a_db_property property, char * value_buffer, int value_buffer_size );

258

Kapitel 6 Programmieren mit Embedded SQL

Beschreibung

Diese Funktion wird verwendet, um die Adressen der Server zu erhalten, zu denen derzeit eine Verbindung besteht. Sie wird vom Dienstprogramm dbping verwendet, um die Serveradresse auszudrucken. Die Funktion kann auch benutzt werden, um den Wert der Datenbankeigenschaften zu erhalten. Datenbankeigenschaften knnen auch auf eine schnittstellenunabhngige Weise abgerufen werden, nmlich durch Ausfhren einer SELECT-Anweisung, siehe "Eigenschaften von Datenbanken" auf Seite 690 der Dokumentation ASA Datenbankadministration. Es gelten die folgenden Argumente:
a_db_property Ein enum mit dem Wert DB_PROP_SERVER_ADDRESS. DB_PROP_SERVER_ADDRESS ruft die Servernetzwerkadresse der derzeitigen Verbindung als ausdruckbare Zeichenfolge zurck. Gemeinsamer Speicher und NamedPipes-Protokolle geben immer die leere Zeichenfolge fr die Adresse zurck. TCP/IP- und SPX-Protokolle geben nicht-leere Zeichenfolgeadressen zurck. value_buffer Dieses Argument wird mit dem Eigenschaftswert als


Siehe auch:

Zeichenfolge mit einer abschlieenden Null gefllt.


value_buffer_size Die maximale Lnge der Zeichenfolge value_buffer, einschlielich des abschlieenden Nullzeichens.

"Eigenschaften von Datenbanken" auf Seite 690 der Dokumentation ASA Datenbankadministration

db_init-Funktion
Prototyp Beschreibung unsigned short db_init( SQLCA *sqlca );

Diese Funktion initialisiert die Schnittstellenbibliothek der Datenbank. Diese Funktion muss aufgerufen werden, bevor ein anderer Bibliotheksaufruf erfolgen kann und bevor ein Embedded SQL-Befehl ausgefhrt wird. Die Ressourcen, die die Schnittstellenbibliothek fr Ihr Programm braucht, werden bei diesem Aufruf zugewiesen und initialisiert. Geben Sie mit db_fini am Ende Ihres Programms die Ressourcen frei. Falls whrend der Prozessverarbeitung Fehler auftreten, werden sie im SQLCABereich zurckgegeben und der Rckgabewert ist 0 (Null). Treten keine Fehler auf, ist der Rckgabewert ungleich 0 (Null) und Sie knnen beginnen, Embedded SQL-Befehle und -Funktionen zu benutzen.

259

Referenz der Bibliotheksfunktion


In den meisten Fllen sollte diese Funktion nur einmal aufgerufen werden, um die Adresse der globalen Variable sqlca weiterzugeben, die in der Header-Datei sqlca.h definiert ist. Falls Sie mit Embedded SQL eine DLL oder eine Anwendung schreiben, die mehrfache Threads hat, rufen Sie db_init einmal fr jeden SQLCA-Bereich auf, der benutzt wird.

$ Weitere Hinweise finden Sie unter "SQLCA-Verwaltung fr Code mit


mehreren Threads oder "reentrant"-Code" auf Seite 211.
Vorsicht Wenn Sie unter NetWare db_fini nicht fr jedes db_init aufrufen, kann dies einen Absturz des Datenbankservers und des NetWare-Dateiservers verursachen.
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.

db_is_working-Funktion
Prototyp Beschreibung unsigned db_is_working( SQLCA *sqlca );

Diese Funktion gibt 1 zurck, falls eine Datenbankanforderung Ihrer Anwendung luft, die den angegebenen sqlca benutzt. Sie gibt 0 (Null) zurck, falls keine Anwendung luft, die den angegebenen sqlca benutzt. Diese Funktion kann asynchron aufgerufen werden. Diese und die Funktion db_cancel_request sind die einzigen Funktionen in der Schnittstellenbibliothek der Datenbank, die asynchron aufgerufen werden knnen, weil sie einen SQLCA-Bereich benutzen, der schon von einer anderen Anforderung verwendet werden knnte.

db_locate_servers-Funktion
Prototyp unsigned int db_locate_servers( SQLCA *sqlca, SQL_CALLBACK_PARM callback_address, void *callback_user_data );

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 Callback-Funktion muss folgende Syntax haben:

260

Kapitel 6 Programmieren mit Embedded SQL


int (*)( SQLCA *sqlca, a_server_address *server_addr, void *callback_user_data );

Die Callback-Funktion wird fr jeden gefundenen Server ausgefhrt. Wenn die Callback-Funktion den Wert 0 zurckgibt, stoppt db_locate_servers die Suche nach Servern. Die an die Callback-Funktion bergebenen Parameter sqlca und callback_user_data sind dieselben Parameter, die an db_locate_servers bergeben werden. Der zweite Parameter ist ein Zeiger auf eine a_server_address-Struktur. a_server_address wird mit folgender Definition in sqlca.h festgelegt:
typedef struct a_server_address { a_SQL_uint32 port_type; a_SQL_uint32 port_num; char *name; char *address; } a_server_address;

port_type Ist hier immer PORT_TYPE_TCP (laut Definition 6 in sqlca.h) port_num Ist die TCP-Portnummer, die der Server abhrt name Zeigt auf einen Puffer, der den Servernamen enthlt address Zeigt auf einen Puffer, der die IP-Adresse des Servers enthlt

$ Weitere Hinweise finden Sie unter "Das ServerpositionDienstprogramm" auf Seite 554 der Dokumentation ASA Datenbankadministration.

db_register_a_callback-Funktion
Prototyp void db_register_a_callback( SQLCA *sqlca, a_db_callback_index index, ( SQL_CALLBACK_PARM ) callback );

Beschreibung

Diese Funktion registriert Callback-Funktionen: Falls Sie keine Callback-Funktion DB_CALLBACK_WAIT registrieren, ist die voreingestellte Reaktion, nichts zu tun. Ihre Anwendung ist blockiert, wartet auf die Antwort von der Datenbank und Windows zeigt den Cursor als Sanduhr an. Um einen Callback zu lschen, bergeben Sie einen Null-Zeiger als callback-Funktion.

261

Referenz der Bibliotheksfunktion


Die folgenden Werte sind fr den Parameter index erlaubt:
DB_CALLBACK_DEBUG_MESSAGE Die bereitgestellte Funktion wird

fr jede Fehlersuchmeldung einmal aufgerufen. Ihr wird eine auf Null endende Zeichenfolge bergeben, die den Text der Debug-Meldung enthlt. Die Zeichenfolge enthlt gewhnlich eine Zeilenendmarke (\n) unmittelbar vor dem beendenden Nullwertzeichen. Der Prototyp der Callback-Funktion lautet folgendermaen:
void SQL_CALLBACK debug_message_callback( SQLCA *sqlca, char * message_string );

DB_CALLBACK_START Der Callback-Prototyp sieht wie folgt aus: void SQL_CALLBACK start_callback( SQLCA *sqlca );

Diese Funktion wird unmittelbar vor dem Absenden einer Datenbankanforderung an den Server aufgerufen. DB_CALLBACK_START wird nur unter Windows verwendet.
DB_CALLBACK_FINISH Der Callback-Prototyp sieht wie folgt aus: void SQL_CALLBACK finish_callback( SQLCA * sqlca );

Diese Funktion wird aufgerufen, nachdem die Antwort auf eine Datenbankanforderung von der Schnittstellen-DLL empfangen wurde. DB_CALLBACK_FINISH wird nur unter Windows-Betriebssystemen verwendet.
DB_CALLBACK_CONN_DROPPED Die Syntax sieht wie folgt aus: void SQL_CALLBACK conn_dropped_callback ( SQLCA *sqlca, char *conn_name );

Diese Funktion wird aufgerufen, wenn der Datenbankserver im Begriff ist, die Verbindung aufgrund einer Zeitberschreitung zu verlieren, von einer DROP CONNECTION-Anweisung oder weil der Server heruntergefahren wird. Der Verbindungsname conn_name wird bergeben, sodass Sie zwischen den Verbindungen unterscheiden knnen. Wenn die Verbindung nicht benannt war, hat sie den Wert NULL.
DB_CALLBACK_WAIT Der Callback-Prototyp sieht wie folgt aus: void SQL_CALLBACK wait_callback( SQLCA *sqlca );

Diese Funktion wird wiederholt von der Schnittstellenbibliothek aufgerufen, whrend der Datenbankserver oder die Clientbibliothek mit dem Abarbeiten Ihrer Datenbankanforderung beschftigt sind. So wrden Sie diesen Callback registrieren: 262

Kapitel 6 Programmieren mit Embedded SQL


db_register_a_callback( &sqlca, DBCALLBACK_WAIT, (SQL_CALLBACK_PARM)&db_wait_request );

DB_CALLBACK_MESSAGE Diese Funktion ermglicht es der

Anwendung, Nachrichten vom Server zu verarbeiten, whrend sie eine Anforderung abarbeitet. Der Callback-Prototyp sieht wie folgt aus:
void SQL_CALLBACK message_callback( SQLCA* sqlca, unsigned short msg_type, an_SQL_code code, unsigned length, char* msg );

Der msg_type-Parameter gibt an, wie wichtig die Nachricht ist und mehrere unterschiedliche Nachrichtentypen knnen unterschiedlich behandelt werden. Die mglichen Nachrichtentypen sind MESSAGE_TYPE_INFO, MESSAGE_TYPE_WARNING, MESSAGE_TYPE_ACTION und MESSAGE_TYPE_STATUS. Diese Konstanten sind in sqldef.h definiert. Das code-Feld ist ein Identifizierer. Das Lngen-Feld gibt an, wie lang die Nachricht ist. Die Meldung ist nicht mit Nullwert abgeschlossen. Zum Beispiel zeigt die Interactive SQL Callback-Funktion STATUSund INFO-Nachrichten in einem Nachrichtenfenster an, whrend Nachrichten vom Typ ACTION und WARNING in einem Dialogfenster erscheinen. Wenn eine Anwendung diese Callback-Funktion nicht registriert, gibt es eine Standard-Callback-Funktion, die alle Nachrichten in die Serverlogdatei schreibt (wenn der Debug-Modus eingestellt und eine Logdatei angegeben ist). Zustzlich werden Nachrichten vom Typ MESSAGE_TYPE_WARNING und MESSAGE_TYPE_ACTION betriebssystemabhngig aufflliger dargestellt.

db_start_database-Funktion
Prototyp Argumente unsigned int db_start_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 Semikolon-getrennte

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

263

Referenz der Bibliotheksfunktion

$ Eine Liste der Verbindungsparameter finden Sie unter


"Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration.
Beschreibung

Diese Funktion startet eine Datenbank auf einem vorhandenen Server, falls die Datenbank nicht bereits luft. Die Schritte, die zum Starten einer Datenbank ausgefhrt werden, sind unter "Personal Server starten" auf Seite 88 der Dokumentation ASA Datenbankadministration beschrieben. Der Rckgabewert ist wahr, falls die Datenbank bereits lief oder erfolgreich gestartet werden konnte. Informationen ber Fehler werden im SQLCABereich zurckgegeben. Falls eine Benutzer-ID und ein Kennwort in den Parametern bergeben wurden, werden sie ignoriert.

$ 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_start_engine-Funktion
Prototyp Argumente unsigned int db_start_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 enhlt, 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

Mit dieser Funktion wird der Datenbankserver gestartet, falls er nicht bereits luft. Die Schritte, die diese Funktion ausfhrt, sind dieselben, wie sie unter "Personal Server starten" auf Seite 88 der Dokumentation ASA Datenbankadministration beschrieben sind. Der Rckgabewert ist gltig, falls der Datenbankserver gefunden wurde oder falls er erfolgreich gestartet werden konnte. Informationen ber Fehler werden im SQLCA-Bereich zurckgegeben.

264

Kapitel 6 Programmieren mit Embedded SQL


Der folgende Aufruf von db_start_engine startet den Datenbankserver und nennt ihn asademo, er ldt 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, fgen 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 luft. 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, htte 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 enhlt, 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 Rckgabewert 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 enhlt, 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 fhrt den Datenbankserver herunter. Folgende Schritte werden von dieser Funktion ausgefhrt: 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, schlgt die Funktion fehl. Die Funktion sendet eine Anforderung an den Server, alle Datenbanken zu finden und zu beenden. Sie entldt 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 Rckgabewert TRUE, sind keine Fehler aufgetreten. Die Verwendung von db_stop_engine hngt 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 enhlt, 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 zustzliche Funktionalitt ber den Embedded SQL-Befehl CONNECT hinaus. Diese Funktion fhrt eine Verbindung aus, wobei der Algorithmus verwendet wird, der in "Fehlerbehandlung bei Verbindungen" auf Seite 82 der Dokumentation ASA Datenbankadministration beschrieben wird. Der Rckgabewert 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 zurckgegeben.

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 enhlt, 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 Rckgabewert ist wahr, falls eine Verbindung erfolgreich getrennt wurde. Informationen ber Fehler werden im SQLCA-Bereich zurckgegeben. Diese Funktion fhrt 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 luft.

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 enthlt. 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) zurckgegeben, 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 zurckgegeben, 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 gengend Speicherplatz zugewiesen, um die eine Reprsentation des Datentyps als Zeichenfolge zu speichern, der ursprnglich im SQLDABereich angegeben wurde, und zwar bis zu maximal maxlen Byte. Die Lngenfelder im SQLDA-Bereich (sqllen) werden dementsprechend gendert. Die Funktion gibt im Erfolgsfall sqlda zurck und den Null-Zeiger, falls nicht gengend Speicherplatz zur Verfgung 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 gengend Speicherplatz zugewiesen fr den im Deskriptor angegebenen Datenbanktyp und die angegebene Lnge. Die Funktion gibt im Erfolgsfall sqlda zurck und den Null-Zeiger, falls nicht gengend Speicherplatz zur Verfgung 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 zurck, der anzeigt, ob eine Zeichenfolge mit Anfhrungszeichen eingeschlossen werden muss, wenn sie als SQL-Name (identifier) benutzt wird. Sie formuliert eine Anforderung an den Datenbankserver, um festzustellen, ob Anfhrungszeichen ntig sind. Die relevante Information wird im Feld sqlcode gespeichert. Wir unterscheiden drei unterschiedliche Kombinationen von Rckgabewert und Code:
return = FALSE, sqlcode = 0 In diesem Fall braucht die Zeichenfolge

mit Sicherheit keine Anfhrungszeichen.


return = TRUE In diesem Fall ist sqlcode immer mit SQLE_WARNING

belegt und die Zeichenfolge braucht mit Sicherheit Anfhrungszeichen.


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 Speichergre zurck, die erforderlich wre, um jeden mglichen 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 Lnge zurck, die eine C-Zeichenfolge (Typ DT_STRING) haben msste, um die Variable sqlda->sqlvar[varno] aufzunehmen (unabhngig vom Datentyp).

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

Diese Funktion gibt einen Zeiger auf eine Zeichenfolge zurck, die eine Fehlermeldung enthlt. Die Fehlermeldung enthlt den Text fr den Fehlercode im SQLCA-Bereich. Wurde kein Fehler gemeldet, wird ein NullZeiger zurckgegeben. Die Fehlermeldung wird in dem gelieferten Puffer gespeichert, falls erforderlich, gekrzt auf die Lnge max.

271

Befehlszusammenfassung fr Embedded SQL

Befehlszusammenfassung fr 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 zustzliche Formate, die nur in Embedded SQL zur Verfgung stehen. Die zustzlichen Formate gehren 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 fr Embedded SQL und knnen 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. Standardmige Datenbearbeitung und Datendefinitions-Anweisungen knnen von Embedded SQL-Anwendungen verwendet werden. Darber hinaus gelten die folgenden Anweisungen speziell fr die Programmierung von Embedded SQL:
ALLOCATE DESCRIPTOR Speicher fr einen Deskriptor zuweisen

$ Siehe "ALLOCATE DESCRIPTOR-Anweisung [ESQL]" auf


Seite 222 der Dokumentation ASA SQL-Referenzhandbuch
CLOSE Einen Cursor schlieen

$ 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 fr 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 fr 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

lschen

$ Siehe "DELETE-Anweisung (positionsbasiert) [ESQL] [GP]" auf


Seite 424 der Dokumentation ASA SQL-Referenzhandbuch
DESCRIBE Die Hostvariable fr eine bestimmte SQL-Anweisung

deklarieren

$ Siehe "DESCRIBE-Anweisung [ESQL]" auf Seite 426 der


Dokumentation ASA SQL-Referenzhandbuch
DISCONNECT Die Verbindung mit dem Datenbankserver lsen

$ 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 ausfhren

$ Siehe "EXECUTE-Anweisung [ESQL]" auf Seite 449 der


Dokumentation ASA SQL-Referenzhandbuch
EXPLAIN Die Strategie zur Optimierung eines bestimmten Cursors

erklren

$ 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 fr 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 einschlieen

$ 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 einfgen

$ 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

Kapitel 6 Programmieren mit Embedded SQL

WHENEVER Angeben, welche Aktionen bei Fehlern in SQLAnweisungen erfolgen sollen

$ Siehe "WHENEVER-Anweisung [ESQL]" auf Seite 636 der


Dokumentation ASA SQL-Referenzhandbuch

275

Befehlszusammenfassung fr Embedded SQL

276

K A P I T E L

ODBC-Programmierung

ber dieses Kapitel

In diesem Kapitel finden Sie Hinweise zum Entwickeln von Anwendungen, die die ODBC-Programmierschnittstelle direkt aufrufen. Die primre Dokumentation fr die Entwicklung von ODBC-Anwendungen ist die Microsoft ODBC SDK Documentation, die als Teil des Microsoft Data Access Components (MDAC) SDK verfgbar ist. Dieses Kapitel enthlt einfhrende Unterlagen sowie eine Beschreibung der spezifischen Funktionen fr Adaptive Server Anywhere. Sie ist jedoch keine umfassende Anleitung fr die Entwicklung von ODBC-Anwendungen. Einige Tools zur Entwicklung von Anwendungen, die bereits ODBC untersttzen, haben eine eigene Programmierschnittstelle, die die ODBCSchnittstelle verbirgt. Dieses Kapitel richtet sich nicht an die Benutzer dieser Tools.

Inhalt

Thema Einfhrung in ODBC ODBC-Anwendungen erstellen ODBC-Beispiele ODBC-Handles Verbindung mit einer Datenquelle herstellen SQL-Anweisungen ausfhren Mit Ergebnismengen arbeiten Gespeicherte Prozeduren aufrufen Umgang mit Fehlern

Seite 278 280 285 287 290 294 299 304 306

277

Einfhrung in ODBC

Einfhrung in ODBC
Open Database Connectivity (ODBC) ist eine Programmierschnittstelle, die von der Microsoft Corporation als Standardschnittstelle fr DatenbankManagementsysteme in Windows-Betriebssystemen definiert wurde. ODBC ist eine aufrufbasierte Schnittstelle. Um ODBC-Anwendungen fr Adaptive Server Anywhere zu entwickeln, brauchen Sie: Adaptive Server Anywhere. Einen C-Compiler, mit dem Sie Programme in Ihrer Betriebssystemumgebung erstellen knnen Das Microsoft ODBC Software Development Kit. Sie finden es im Microsoft Developer Network. Es umfasst Dokumentation und Tools, um ODBC-Anwendungen zu testen.

Untersttzte Plattformen

Adaptive Server Anywhere untersttzt die ODBC API auer unter Windows auch unter UNIX und Windows CE. Die plattformunabhngige ODBCUntersttzung erleichtert die Entwicklung portabler Datenbankanwendungen.

$ Weitere Informationen zur Auflistung von ODBC-Treibern in verteilten


Transaktionen finden Sie unter "Dreischichtige Datenverarbeitung und verteilte Transaktionen" auf Seite 399.

ODBC-bereinstimmung
Adaptive Server Anywhere bietet Untersttzung fr ODBC 3.52. Stufen der ODBCUntersttzung ODBC-Funktionen werden nach Kompatibilittsstufen eingeordnet. Eine Funktion ist entweder Kern, Stufe 1, oder Stufe 2, wobei Stufe 2 den Standard am besten untersttzt. Diese Funktionen sind aufgefhrt in der Dokumentation ODBC Programmers Reference, die von der Microsoft Corporation als Teil des ODBC Software Development Kits bzw. von der Microsoft Website unter http://msdn.microsoft.com/library/default.asp?url=/library/enus/odbc/htm/odbcabout_this_manual.asp bezogen werden kann. Der Adaptive Server Anywhere untersttzt die ODBC 3,52 Spezifikation.
Kernbereinstimmung Der Adaptive Server Anywhere untersttzt alle

Von Adaptive Server Anywhere untersttzte Funktionen

Kernfunktionen.

278

Kapitel 7 ODBC-Programmierung

bereinstimmung mit Stufe 1 Adaptive Server Anywhere untersttzt alle Funktionen der Stufe 1, abgesehen von der asynchronen Ausfhrung von ODBC-Funktionen.

Adaptive Server Anywhere untersttzt die gemeinsame Nutzung einer Verbindung durch mehrfache Threads. Die Anforderungen von verschiedenen Threads werden von Adaptive Server Anywhere serialisiert.
bereinstimmung mit Stufe 2 Adaptive Server Anywhere untersttzt alle Funktionen der Stufe 2, mit Ausnahme der folgenden:

ODBC-RckwrtsKompatibilitt

Dreiteilige Namen von Tabellen und Ansichten. Dies ist auf Adaptive Server Anywhere nicht anwendbar. Asynchrone Ausfhrung von ODBC-Funktionen fr bestimmte einzelne Anweisungen Die Fhigkeit, Login-Anforderungen und SQL-Anforderungen nach einer gegebenen Zeit abzubrechen (time out)

Anwendungen, die mit lteren Versionen von ODBC entwickelt wurden, sind weiter kompatibel mit Adaptive Server Anywhere und dem neueren ODBC-Treiber-Manager. Die neuen ODBC Funktionen stehen in den lteren Anwendungen nicht zur Verfgung. Der ODBC-Treiber-Manager gehrt zu der mit Adaptive Server Anywhere ausgelieferten ODBC-Software. ODBC-Treiber-Manager Version 3 hat eine neue Schnittstelle fr die Konfiguration von ODBC-Datenquellen.

Der ODBC-TreiberManager

279

ODBC-Anwendungen erstellen

ODBC-Anwendungen erstellen
In diesem Abschnitt wird beschrieben, wie einfache ODBC-Anwendungen kompiliert und gelinkt werden.

ODBC-Header-Datei einbeziehen
Jede C-Quelldatei, die ODBC-Funktionen aufruft, muss eine plattformspezifische ODBC-Header-Datei einbeziehen. Jede plattformspezifische Header-Datei schliet die wichtigste ODBC-HeaderDatei odbc.h ein, die alle Funktionen, Datentypen und Konstanten definiert, die erforderlich sind, um ein ODBC-Programm zu schreiben.
v So wird die ODBC-Header-Datei in eine C-Quelldatei einbezogen:

Fgen Sie eine Include-Zeile hinzu, die die betreffende plattformspezifische Header-Datei referenziert. Folgende Zeilen mssen benutzt werden:
Betriebssystem Windows UNIX Windows CE Include-Zeile #include "ntodbc.h" #include "unixodbc.h" #include "ntodbc.h"

Fgen Sie das Verzeichnis, das die Header-Datei enthlt, dem IncludePfad Ihres Compilers hinzu. Die plattformspezifischen Header-Dateien und odbc.h werden im Unterverzeichnis h Ihres SQL Anywhere-Verzeichnisses installiert.

ODBC-Anwendungen unter Windows verknpfen


Dieser Abschnitt betrifft nicht Windows CE. Weitere Hinweise finden Sie unter "ODBC-Anwendungen unter Windows CE verknpfen" auf Seite 281. Wenn Sie Ihre Anwendung linken, mssen Sie diese mit der geeigneten Importbibliothekdatei verbinden. Damit ist der Zugriff auf die ODBCFunktionen gewhrleistet: Mit der Importbibliothek werden Eintrittspunkte fr den ODBC Driver Manager odbc32.dll definiert. Der Treiber-Manager seinerseits ldt den Adaptive Server Anywhere-ODBC-Treiber dbodbc8.dll.

280

Kapitel 7 ODBC-Programmierung
Separate Importbibliotheken werden fr Microsoft-, Watcom- und BorlandCompiler angeboten.
v So wird eine ODBC-Anwendung verknpft (Windows):

Fgen Sie das Verzeichnis mit der plattformspezifischen Importbibliothek der Liste der Bibliothekenverzeichnisse hinzu. Die Importbibliotheken werden im Unterverzeichnis lib des Verzeichnisses mit den ausfhrbaren 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.lib wodbc32.lib bodbc32.lib dbodbc8.lib

ODBC-Anwendungen unter Windows CE verknpfen


In Windows CE-Betriebssystemen gibt es keinen ODBC-Treiber-Manager. Mit der Importbibliothek (dbodbc8.lib) werden die Eintrittspunkte direkt in den Adaptive Server Anywhere-ODBC-Treiber dbodbc8.dll definiert. Fr die verschiedenen Chips, auf denen Windows CE verfgbar ist, werden separate Versionen dieser DLL zur Verfgung gestellt. Die Dateien befinden sich in betriebssystemspezifischen Unterverzeichnissen des Verzeichnisses ce in Ihrem SQL Anywhere-Verzeichnis. Zum Beispiel befindet sich der ODBC-Treiber fr Windows CE mit dem SH3-Chip an folgendem Speicherort:
C:\Programme\Sybase\SQL Anywhere 8\ce\SH3

$ Eine Liste der untersttzten Versionen von Windows CE finden Sie


unter "Erforderliche Systemausstattung fr Adaptive Server Anywhere" auf Seite 31 der Dokumentation ASA Erste Schritte.
v So wird eine ODBC-Anwendung gelinkt (Windows CE):

Fgen Sie das Verzeichnis mit der plattformspezifischen Importbibliothek der Liste der Bibliothekenverzeichnisse hinzu.

281

ODBC-Anwendungen erstellen
Die Importbibliothek trgt den Namen dbodbc8.lib und ist an einem betriebssystemabhngigen Ort im Verzeichnis ce in Ihrem SQL Anywhere-Verzeichnis gespeichert. Zum Beispiel befindet sich die Importbibliothek fr Windows CE mit dem SH3-Chip an folgendem Speicherort:
C:\Programme\Sybase\SQL Anywhere 8\ce\SH3\lib

Belegen Sie den Parameter DRIVER= in der VerbindungsZeichenfolge, die an die Funktion SQLDriverConnect weitergegeben wird.
szConnStrIn = "driver=BSSuchpfad\dbodbc8.dll;dbf=c:\asademo.db"

wobei BSSuchpfad der vollstndige Suchpfad bis zum Chip-spezifischen Unterverzeichnis Ihres SQL Anywhere-Verzeichnisses auf dem Windows CE-Gert ist. Zum Beispiel:
\Programme\Sybase\SQL Anywhere 8\ce\SH3\lib

Das Beispielprogramm (odbc.c) verwendet eine Dateidatenquelle (FileDSNVerbindungsparameter) mit dem Namen ASA 8.0 Sample.dsn. Sie knnen Dateidatenquellen auf Ihrem Desktopsystem aus dem ODBC-TreiberManager erstellen und sie dann auf Ihr Windows CE-Gert kopieren. Windows CE und Unicode Adaptive Server Anywhere verwendet die Codierung UTF-8 ist; hierbei handelt es sich um eine Mehrbyte-Zeichenkodierung, die fr die Codierung von Unicode verwendet werden kann. Der Adaptive Server Anywhere ODBC-Treiber untersttzt entweder ASCII (8-Bit)-Zeichenfolgen oder Unicode (Wide Character)-Zeichenfolgen. Das UNICODE-Makro steuert, ob ODBC-Funktionen ASCII- oder UnicodeZeichenfolgen erwarten. Wenn Ihre Anwendung mit dem definierten UNICODE-Makro erstellt werden muss, Sie aber die ASCII ODBCFunktionen nutzen mchten, mssen Sie ebenfalls das SQL_NOUNICODEMAP-Makro definieren. Die Beispieldatei Samples\ASA\C\odbc.c veranschaulicht, wie Sie die Unicode ODBC-Funktionen anwenden.

ODBC-Anwendungen auf UNIX verknpfen


Adaptive Server Anywhere umfasst keinen ODBC-Treiber-Manager, es gibt jedoch Treiber-Manager von Drittherstellern. In diesem Abschnitt wird beschrieben, wie ODBC-Anwendungen aufgebaut werden, die den ODBCTreiber-Manager nicht verwenden.

282

Kapitel 7 ODBC-Programmierung

ODBC-Treiber

Der ODBC-Treiber ist ein gemeinsam genutztes Objekt oder eine gemeinsam genutzte Bibliothek. Separate Versionen der Adaptive Server AnywhereODBC-Treiber werden fr Anwendungen mit einfachem sowie mit mehreren Threads angeboten. Die ODBC-Treiber sind folgende Dateien:
Betriebssystem Solaris/Sparc Solaris/Sparc Tread-Modell Ein Thread Mehrere Threads ODBC-Treiber

dbodbc8.so (dbodbc8.so.1) dbodbc_r.so (dbodbc_r.so.1)

Die Bibliotheken sind mit einer Versionsnummer (in Klammern) als symbolische Verknpfungen mit der gemeinsam benutzten Bibliothek installiert.
v So wird eine ODBC-Anwendung gelinkt (UNIX):

1 2

Linken Sie Ihre Anwendung direkt mit dem geeigneten ODBC-Treiber. Wenn Sie Ihre Anwendung bereitstellen, achten Sie darauf, dass der geeignete ODBC-Treiber im Bibliotheks-Suchpfad des Benutzersystems enthalten ist.

Datenquelleninformation

Wenn Adaptive Server Anywhere keinen ODBC-Treiber-Manager findet, verwendet er die Datei ~/.odbc.ini als Datenquelleninformation.

ODBC-Treiber-Manager unter UNIX


ODBC-Treiber-Manager fr UNIX werden von Drittherstellern angeboten. Ein ODBC-Treiber-Manager beinhaltet die folgenden Dateien:
Betriebssystem Solaris/Sparc Dateien

libodbc.so (libodbc.so.1) libodbcinst.so (libodbcinst.so.1)

Solaris/Sparc

libodbc.so (libodbc.so.1) libodbcinst.so (libodbcinst.so.1)

Wenn Sie eine Anwendung bereitstellen, die einen ODBC-Treiber-Manager erfordert, und Sie keinen Treiber-Manager eines Drittanbieters benutzen, erstellen Sie symbolische Verknpfungen fr die gemeinsam genutzten Bibliotheken libodbc und libodbcinst zum Adaptive Server AnywhereODBC-Treiber.

283

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

284

Kapitel 7 ODBC-Programmierung

ODBC-Beispiele
Mit Adaptive Server Anywhere werden mehrere Beispiele geliefert. Die Beispiele finden Sie im Unterverzeichnis Samples\ASA Ihres SQL Anywhere-Verzeichnisses. Standardmig ist dies
C:\Programme\Sybase\SQL Anywhere 8\Samples\ASA

Die Beispiele in Verzeichnissen, die mit ODBC beginnen, veranschaulichen separate und einfache ODBC-Aufgaben, wie etwa eine Verbindung mit einer Datenbank herstellen und Anweisungen ausfhren. Ein vollstndiges ODBCBeispielprogramm finden Sie unter Samples\ASA\C\odbc.c. Das Programm fhrt dieselben Aktionen aus wie das Beispielprogramm fr einen dynamischen Cursor in Embedded SQL, das sich im gleichen Verzeichnis befindet.

$ Eine Beschreibung des entsprechenden Embedded SQL-Programms


finden Sie unter "Beispielprogramme mit Embedded SQL" auf Seite 190.

ODBC-Beispielprogramm erstellen
Das ODBC-Beispielprogramm in Samples\ASA\C umfasst eine Stapelverarbeitungsdatei (Shell-Skript fr UNIX), die eingesetzt werden kann, um die Beispielanwendung zu kompilieren und zu linken.
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. Fhren Sie die Stapeldatei makeall oder das Shell-Skript aus. Die Syntax des Befehls ist wie folgt:
makeall API Plattform Compiler

Die Parameter sind wie folgt: API Geben Sie odbc an, damit das ODBC-Beispiel kompiliert wird und nicht eine Embedded SQL-Version der Anwendung. Plattform Geben Sie WINNT an wenn Sie fr WindowsBetriebssystem kompilieren wollen. Compiler Geben Sie den Compiler an, mit dem das Programm kompiliert werden soll. Folgende Compiler sind mglich:
WC - Watcom C/C++ MC - Microsoft Visual C++

285

ODBC-Beispiele

BC - Borland C++ Builder

ODBC-Beispielprogramm ausfhren
Das Beispielprogramm odbc.c kann als Dienst laufen, wenn es fr WindowsVersionen kompiliert wurde, die Dienste untersttzen. Die beiden Dateien, die den Beispielcode fr Windows-Dienste enthalten, sind die Quelldatei ntsvc.c und die Header-Datei ntsvc.h. Der Code ermglicht es, das damit gelinkte ausfhrbare Programm entweder als normales Programm oder als Windows-Dienst auszufhren.
v So wird das ODBC-Beispiel ausgefhrt:

Starten Sie das Programm: Fhren Sie die Datei Samples\ASA\C\odbcwnt.exe aus.

Whlen Sie eine Tabelle: Whlen Sie eine der Tabellen in der Beispieldatenbank. Sie knnen z.B. Customer oder Employee eingeben.

v Um das ODBC-Beispiel als Windows-Dienst auszufhren, gehen Sie wie folgt vor:

1 2 3

Starten Sie Sybase Central und ffnen Sie den Ordner "Dienste". Klicken Sie auf "Dienst hinzufgen". Folgen Sie den Anweisungen, um das Beispielprogramm den NT-Diensten hinzuzufgen. Rechtsklicken Sie auf das Dienstsymbol und klicken Sie auf "Start", um den Dienst zu starten.

Wird das Programm als Dienst ausgefhrt, zeigt es, falls dies mglich ist, die normale Benutzeroberflche. Es schreibt die Ausgabe in die Ereignisanzeige unter der Rubrik "Anwendungen". Falls die Benutzeroberflche nicht gestartet werden kann, schreibt das Programm eine Seite in die Ereignisanzeige und hlt an.

286

Kapitel 7 ODBC-Programmierung

ODBC-Handles
ODBC-Anwendungen verwenden eine kleine Anzahl von Handles, um grundlegende Funktionen wie Datenbankverbindungen und SQLAnweisungen zu definieren. Ein Handle ist ein 32-Bit-Wert. Die folgenden Handles werden in nahezu allen ODBC-Anwendungen eingesetzt.
Umgebung Das Umgebungs-Handle liefert einen globalen Kontext, in

dem auf Daten zugegriffen wird. Jede ODBC-Anwendung muss beim Start genau einen Umgebungs-Handle zuweisen und es bei Beendigung wieder freigeben. Der folgende Code veranschaulicht, wie ein Umgebungs-Handle zugewiesen wird:
SQLHENV env; SQLRETURN rc; rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL _NULL_HANDLE, &env );

Verbindung Ein Verbindungs-Handle wird von einem ODBC-Treiber

und einer Datenquelle angegeben. Eine Anwendung kann ber mehrere, ihrer Umgebung zugeordnete Verbindungen verfgen. Ein VerbindungsHandle zuzuweisen heit nicht, eine Verbindung herzustellen. Ein Verbindungs-Handle muss zunchst zugewiesen und dann verwendet werden, wenn die Verbindung hergestellt ist. Der folgende Code veranschaulicht, wie ein Verbindungs-Handle zugewiesen wird:
SQLHDBC dbc; SQLRETURN rc; rc = SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc );

Anweisung Ein Anweisungs-Handle bietet Zugriff auf eine SQL-

Anweisung und damit verbundene Daten, wie etwa Ergebnisgruppen und Parameter. Jede Verbindung kann mehrere Anweisungen haben. Anweisungen werden sowohl fr Cursorvorgnge (Daten abrufen) als auch fr die Ausfhrung einfacher Anweisungen benutzt (z.B. INSERT, UPDATE und DELETE). Der folgende Code veranschaulicht, wie ein Anweisungs-Handle zugewiesen wird:
SQLHSTMT stmt; SQLRETURN rc; rc = SQLAllocHandle( SQL_HANDLE_STMT, dbc, &stmt );

287

ODBC-Handles

ODBC-Handles zuweisen
Die fr ODBC-Programme erforderlichen Handle-Typen sind:
Element Umgebung Verbindung Anweisung Deskriptor Handle-Typ SQLHENV SQLHDBC SQLHSTMT SQLHDESC

v So wird ein ODBC-Handle verwendet:

Funktion SQLAllocHandle aufrufen. SQLAllocHandle nimmt die folgenden Parameter an: Einen Bezeichner fr den Typ des zuzuweisenden Elements Das Handle des bergeordneten Elements Einen Zeiger auf den Ort, an dem das Handle zugewiesen wird

$ Eine vollstndige Beschreibung finden Sie unter SQLAllocHandle


in der Microsoft-Dokumentation ODBC Programmers Reference. 2 3 Das Handle in nachfolgenden Funktionsaufrufen verwenden. Das Objekt mit SQLFreeHandle freisetzen. SQLFreeHandle nimmt die folgenden Parameter an: Einen Bezeichner fr den Typ des freizusetzenden Elements Das Handle des freizusetzenden Elements

$ Eine vollstndige Beschreibung finden Sie unter SQLFreeHandle


in der Microsoft-Dokumentation ODBC Programmer's Reference. Beispiel Mit dem folgenden Codefragment wird ein Umgebungs-Handle zugewiesen und freigesetzt:
SQLHENV env; SQLRETURN retcode; retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env ); if( retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO ) { // Erfolg: Hier den Anwendungscode } SQLFreeHandle( SQL_HANDLE_ENV, env );

$ Weitere Hinweise zu Rckgabecodes und Fehlerbehandlung finden Sie


unter "Umgang mit Fehlern" auf Seite 306. 288

Kapitel 7 ODBC-Programmierung

Ein erstes ODBC-Beispiel


Es folgt ein einfaches ODBC-Programm, dass eine Verbindung mit der Adaptive Server Anywhere-Beispieldatenbank herstellt und diese sofort wieder trennt.

$ Dieses Beispiel finden Sie als


Samples\ASA\ODBCConnect\odbcconnect.cpp in Ihrem SQL Anywhere-

Verzeichnis.
#include <stdio.h> #include "ntodbc.h" int main(int argc, char* argv[]) { SQLHENV env; SQLHDBC dbc; SQLRETURN retcode; retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env ); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "env allocated\n" ); /* Umgebungsattribut ODBC-Version setzen */ retcode = SQLSetEnvAttr( env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); retcode = SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc ); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "dbc allocated\n" ); retcode = SQLConnect( dbc, (SQLCHAR*) "ASA 8.0 Sample", SQL_NTS, (SQLCHAR* ) "DBA", SQL_NTS, (SQLCHAR*) "SQL", SQL_NTS ); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "Successfully connected\n" ); } SQLDisconnect( dbc ); } SQLFreeHandle( SQL_HANDLE_DBC, dbc ); } SQLFreeHandle( SQL_HANDLE_ENV, env ); return 0; }

289

Verbindung mit einer Datenquelle herstellen

Verbindung mit einer Datenquelle herstellen


In diesem Abschnitt wird beschrieben, wie ODBC-Funktionen zum Herstellen einer Verbindung mit einer Adaptive Server AnywhereDatenbank eingesetzt werden.

Eine ODBC-Verbindungsfunktion whlen


ODBC bietet eine Reihe von Verbindungsfunktionen. Welche Sie verwenden, hngt davon ab, wie Ihre Anwendung bereitgestellt und benutzt werden soll:
SQLConnect Die einfachste Verbindungsfunktion.

SQLConnect nimmt einen Datenquellennamen und eine fakultative Benutzer-ID und ein fakultatives Benutzkennkennwort an. Verwenden Sie SQLConnect, wenn Sie einen Datenquellennamen in Ihrer Anwendung hartcodieren.

$ Weitere Hinweise finden Sie unter SQLConnect in der Microsoft


Dokumentation ODBC Programmers Reference.
SQLDriverConnect Stellt mit Hilfe einer Verbindungszeichenfolge eine

Verbindung zu einer Datenquelle her. Mit SQLDriverConnect kann die Anwendung Adaptive Server Anywhere-spezifische Verbindungsdaten verwenden, die unabhngig von der Datenquelle sind. Darber hinaus knnen Sie SQLDriverConnect benutzen, um anzufordern, dass der Adaptive Server Anywhere-Treiber zur Eingabe von Verbindungsdaten auffordert. SQLDriverConnect kann auch benutzt werden, um eine Verbindung herzustellen, ohne dass eine Datenquelle angegeben wird.

$ Weitere Hinweise finden Sie unter SQLDriverConnect in der


Microsoft Dokumentation ODBC Programmers Reference.
SQLBrowseConnect Stellt wie SQLDriverConnect mit Hilfe einer Verbindungszeichenfolge eine Verbindung zu einer Datenquelle her.

Mit SQLBrowseConnect kann Ihre Anwendung eigene Dialogfelder aufbauen, die zur Eingabe von Verbindungsdaten auffordern und nach Datenquellen suchen, 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 Programmers Reference.

290

Kapitel 7 ODBC-Programmierung
In den Beispielen in diesem Kapitel wird hauptschlich SQLDriverConnect verwendet.

$ Eine vollstndige Liste der Verbindungsparameter, die in


Verbindungszeichenfolgen eingesetzt werden knnen, finden Sie unter "Verbindungsparameter" auf Seite 182 der Dokumentation ASA Datenbankadministration.

Eine Verbindung herstellen


Ihre Anwendung muss eine Verbindung herstellen, bevor sie Datenbankvorgnge ausfhren kann.
v So wird eine ODBC-Verbindung hergestellt:

ODBC-Umgebung zuweisen. Zum Beispiel:


SQLHENV env; SQLRETURN retcode; retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env );

ODBC-Version deklarieren. Wenn Sie deklarieren, dass die Anwendung ODBC Version 3 befolgen soll, werden SLQSTATE-Werte und einige andere versionsabhngige Funktionen auf das entsprechende Verhalten eingestellt. Zum Beispiel:
retcode = SQLSetEnvAttr( env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

Falls erforderlich, die Datenquelle oder Verbindungszeichenfolge zusammenstellen. Je nach Ihrer Anweisung knnen Sie eine Datenquelle oder Verbindungszeichenfolge hartcodieren oder sie fr erhhte Flexibilitt extern speichern.

Ein ODBC-Verbindungselement zuweisen. Zum Beispiel:


retcode = SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc );

Diejenigen Verbindungsattribute festlegen, die vor dem Verbinden eingerichtet sein mssen.

291

Verbindung mit einer Datenquelle herstellen


Einige Verbindungsattribute mssen festgelegt werden, bevor eine Verbindung hergestellt wird, whrend andere vorher oder nachher eingerichtet werden knnen. Zum Beispiel:
retcode = SQLSetConnectAttr( dbc, SQL_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0 );

$ Weitere Hinweise finden Sie unter "Verbindungsattribute


festlegen" auf Seite 292. 6 ODBC-Verbindungsfunktion aufrufen. Zum Beispiel:
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) { printf( "dbc allocated\n" ); retcode = SQLConnect( dbc, (SQLCHAR*) "ASA 8.0 Sample", SQL_NTS, (SQLCHAR* ) "DBA", SQL_NTS, (SQLCHAR*) "SQL", SQL_NTS ); if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){ // Verbindung erfolgreich hergestellt.

$ Ein vollstndiges Beispiel finden Sie in


Samples\ASA\ODBCConnect\odbcconnect.cpp in Ihrem SQL Anywhere-

Verzeichnis. Hinweise
SQL_NTS Jede Zeichenfolge, die an ODBC bergeben wird, hat eine entsprechende Lnge. Ist die Lnge unbekannt, knnen Sie SQL_NTS als Argument verwenden, um anzuzeigen, dass es sich um einen Null Terminated String handelt, dessen Ende durch das Nullzeichen gekennzeichnet ist (\0). SQLSetConnectAttr Voreingestellt arbeitet ODBC im Autocommit-

Modus. Dieser Modus wird abgeschaltet, indem SQL_AUTOCOMMIT auf "false" gesetzt wird.

$ Weitere Hinweise finden Sie unter "Verbindungsattribute


festlegen" auf Seite 292.

Verbindungsattribute festlegen
Die Funktion SQLSetConnectAttr wird eingesetzt, um Verbindungsdetails zu steuern. Zum Beispiel deaktiviert die folgende Anweisung das ODBCAutocommit-Verhalten.
retcode = SQLSetConnectAttr( dbc, SQL_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0 );

292

Kapitel 7 ODBC-Programmierung

$ Weitere Hinweise sowie eine Liste der Verbindungsattribute finden Sie


unter SQLSetConnectAttr in der Microsoft Dokumentation ODBC Programmers Reference . Viele Aspekte der Verbindung knnen ber die Verbindungsparameter gesteuert werden. Hinweise finden Sie unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration.

Threads und Verbindungen in ODBC-Anwendungen


Sie knnen ODBC-Anwendungen mit mehreren Threads fr Adaptive Server Anywhere entwickeln. Es wird empfohlen, dass Sie fr jeden Thread eine eigene Verbindung benutzen. Sie knnen fr mehrfache Threads eine einfache Verbindung benutzen. Der Datenbankserver erlaubt allerdings nicht mehr als eine aktive Anforderung fr eine Verbindung zur gleichen Zeit. Falls ein Thread eine Anweisung ausfhrt, die lange braucht, mssen alle anderen Threads warten, bis die Anforderung abgeschlossen ist.

293

SQL-Anweisungen ausfhren

SQL-Anweisungen ausfhren
ODBC umfasst mehrere Funktionen zum Ausfhren von SQL-Anweisungen:
Direkte Ausfhrung Adaptive Server Anywhere fhrt eine syntaktische Analyse der SQL-Anweisung durch, bereitet einen Zugriffsplan vor und fhrt die Anweisung aus. Das syntaktische Analysieren und das Vorbereiten des Zugriffsplans wird Vorbereitung der Anweisung genannt. Vorbereitete Ausfhrung Die Vorbereitung der Anweisung erfolgt

getrennt von der Ausfhrung. Bei Anweisungen, die wiederholt ausgefhrt werden sollen wird damit vermieden, dass wiederholt vorbereitet werden muss. Damit wird die Performance verbessert.

$ Siehe "Vorbereitete Anweisungen ausfhren" auf Seite 297.

Anweisungen direkt ausfhren


Mit der Funktion SQLExecDirect wird eine SQL-Anweisung vorbereitet und ausgefhrt. Die Anweisung kann auch Parameter enthalten. Das folgende Codefragment veranschaulicht, wie eine Anweisung ohne Parameter ausgefhrt wird. Die Funktion SQLExecDirect nimmt ein Anweisungs-Handle, eine SQL-Zeichenfolge und eine Lnge bzw. ein Abschlusszeichen an, falls ein Zeichenfolgeindikator mit Nullabschlusszeichen erforderlich ist. Das in diesem Abschnitt beschriebene Verfahren ist zwar einfach, aber unflexibel. Die Anweisung kann keine Benutzereingabe zur nderung der Anweisung annehmen. Flexiblere Methoden zum Aufbau von Anweisungen finden Sie unter "Anweisungen mit gebundenen Parametern ausfhren" auf Seite 295.
v So wird eine SQL-Anweisung in einer ODBC-Anwendung ausgefhrt:

Der Anweisung mit SQLAllocHandle ein Handle zuweisen. Mit der folgenden Anweisung wird z.B. bei einer Verbindung mit dem Handle dbc ein Handle vom Typ SQL_HANDLE_STMT mit dem Namen stmt zugewiesen:
SQLAllocHandle( SQL_HANDLE_STMT, dbc, &stmt );

Funktion SQLExecDirect aufrufen und die Anweisung ausfhren:

294

Kapitel 7 ODBC-Programmierung
Mit den folgenden Zeilen wird z.B. eine Anweisung deklariert und ausgefhrt. Die Deklaration von deletestmt wrde normalerweise am Anfang der Funktion auftreten:
SQLCHAR deletestmt[ STMT_LEN ] = "DELETE FROM department WHERE dept_id = 201"; SQLExecDirect( stmt, deletestmt, SQL_NTS) ;

$ Ein vollstndiges Beispiel mit Fehlerprfung finden Sie unter


Samples\ASA\ODBCExecute\odbcexecute.cpp.

$ Weitere Hinweise zu SQLExecDirect finden Sie unter SQLExecDirect


in der Microsoft-Dokumentation ODBC Programmers Reference.

Anweisungen mit gebundenen Parametern ausfhren


In diesem Abschnitt wird beschrieben, wie eine SQL-Anweisung aufgebaut und ausgefhrt wird, bei der zum Festlegen der Werte von Anweisungsparametern gebundene Parameter eingesetzt werden.
v So wird eine SQL-Anweisung mit gebundenen Parametern in einer ODBC-Anwendung ausgefhrt:

Der Anweisung mit SQLAllocHandle ein Handle zuweisen. Mit der folgenden Anweisung wird z.B. bei einer Verbindung mit dem Handle dbc ein Handle vom Typ SQL_HANDLE_STMT mit dem Namen stmt zugewiesen:
SQLAllocHandle( SQL_HANDLE_STMT, dbc, &stmt );

Anweisungsparameter mit SQLBindParameter binden. Zum Beispiel werden mit den folgenden Zeilen Variable deklariert, die Werte fr Abteilungs-ID, Abteilungsname und Manager-ID, sowie die Anweisungszeichenfolge selbst enthalten sollen. Als Nchstes werden Parameter an den ersten, zweiten und dritten Parameter einer Anweisung gebunden, die mit dem Anweisungs-Handle stmt ausgefhrt wird.

295

SQL-Anweisungen ausfhren
#defined DEPT_NAME_LEN 20 SQLINTEGER cbDeptID = 0, cbDeptName = SQL_NTS, cbManagerID = 0; SQLCHAR deptname[ DEPT_NAME_LEN ]; SQLSMALLINT deptID, managerID; SQLCHAR insertstmt[ STMT_LEN ] = "INSERT INTO department " "( dept_id, dept_name, dept_head_id )" "VALUES (?, ?, ?,)"; SQLBindParameter( stmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &deptID, 0, &cbDeptID); SQLBindParameter( stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, DEPT_NAME_LEN, 0, deptname, 0,&cbDeptName); SQLBindParameter( stmt, 3, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &managerID, 0, &cbManagerID);

Den Parametern Werte zuweisen. Mit den folgenden Zeilen werden z.B. den Parametern im Fragment von Schritt 2 Werte zugewiesen.
deptID = 201; strcpy( (char * ) deptname, "Sales East" ); managerID = 902;

Im Allgemeinen werden diese Variablen als Reaktion auf eine Benutzerhandlung festgelegt. 4 Fhren Sie die Anweisung mit SQLExecDirect aus. Mit der folgenden Zeile wird z.B. eine Anweisungszeichenfolge ausgefhrt, die sich in insertstmt im Anweisungs-Handle stmt befindet.
SQLExecDirect( stmt, insertstmt, SQL_NTS) ;

Gebundene Parameter werden auch mit vorbereiteten Anweisungen verwendet, um die Performance von Anweisungen zu steigern, die mehr als einmal ausgefhrt werden sollen. Weitere Hinweise finden Sie unter "Vorbereitete Anweisungen ausfhren" auf Seite 297.

$ Die obigen Codefragmente enthalten keine Fehlerprfung. Ein


vollstndiges Beispiel mit Fehlerprfung finden Sie unter
Samples\ASA\ODBCExecute\odbcexecute.cpp.

$ Weitere Hinweise zu SQLExecDirect finden Sie unter SQLExecDirect


in der Microsoft-Dokumentation ODBC Programmers Reference.

296

Kapitel 7 ODBC-Programmierung

Vorbereitete Anweisungen ausfhren


Vorbereitete Anweisungen bieten Performance-Vorteile bei hufig benutzten Anweisungen. ODBC bietet eine vollstndige Menge von Funktionen fr vorbereitete Anweisungen.

$ Eine Einfhrung in vorbereitete Anweisungen finden Sie unter


"Anweisungen vorbereiten" auf Seite 12.
v So wird eine vorbereitete Anweisung ausgefhrt:

Die Anweisung mit SQLPrepare vorbereiten. Das folgende Codefragment veranschaulicht z.B., wie eine INSERTAnweisung vorbereitet wird:
SQLRETURN retcode; SQLHSTMT stmt; retcode = SQLPrepare( stmt, "INSERT INTO department ( dept_id, dept_name, dept_head_id ) VALUES (?, ?, ?,)", SQL_NTS);

In diesem Beispiel gilt: 2


retcode Enthlt einen Rckgabecode, der auf Erfolg oder

Fehlschlag des Vorgangs berprft werden sollte


stmt Liefert ein Handle zu der Anweisung, sodass sie spter referenziert werden kann. ? Die Fragezeichen sind Platzhalter fr Anweisungsparameter.

Mit SQLBindParameter Anweisungsparameter mit Werten belegen. Der folgende Funktionsaufruf zum Beispiel belegt den Wert der Variablen dept_id:
SQLBindParameter( stmt, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &sDeptID, 0, &cbDeptID);

In diesem Beispiel gilt:


stmt ist das Anweisungs-Handle

297

SQL-Anweisungen ausfhren

1 zeigt an, dass dieser Aufruf den ersten Platzhalter mit einem Wert

belegt.
SQL_PARAM_INPUT zeigt an, dass der Parameter eine

Eingabeanweisung ist.
SQL_C_SHORT zeigt den C-Datentyp an, der in der Anwendung

verwendet wird.
SQL_INTEGER zeigt den SQL-Datentyp an, der in der Datenbank

verwendet wird. Die nchsten beiden Parameter zeigen die Spaltengre und die Anzahl der Dezimalstellen an: beide sind mit 0 (Null) fr Ganzzahlen belegt.
&sDeptID ist ein Zeiger auf einen Puffer fr den Parameterwert. 0 gibt die Lnge des Puffers in Byte an. &cbDeptID ist ein Zeiger auf einen Puffer fr die Lnge des

3 4

Parameterwerts. Die beiden anderen Parameter binden und sDeptId Werte zuordnen. Die Anweisung ausfhren:
retcode = SQLExecute( stmt);

Schritte 2 bis 4 knnen mehrfach ausgefhrt werden. 5 Anweisung lschen. Das Lschen der Anweisung setzt die der Anweisung zugewiesenen Ressourcen frei. Anweisungen werden mit SQLFreeHandle gelscht.

$ Ein vollstndiges Beispiel mit Fehlerprfung finden Sie unter


Samples\ASA\ODBCPrepare\odbcprepare.cpp.

$ Weitere Hinweise zu SQLPrepare finden Sie unter SQLPrepare in der


Microsoft-Dokumentation ODBC Programmers Reference.

298

Kapitel 7 ODBC-Programmierung

Mit Ergebnismengen arbeiten


ODBC-Anwendungen verwenden Cursor zum Bearbeiten und Aktualisieren von Ergebnismengen. Adaptive Server Anywhere bietet umfassende Untersttzung fr verschiedene Arten von Cursorn und Cursorvorgngen.

$ Eine Einfhrung zu Cursorn finden Sie unter "Mit Cursorn arbeiten"


auf Seite 20.

Cursor-Eigenschaften whlen
ODBC-Funktionen, die Anweisungen ausfhren und Ergebnismengen verarbeiten, verwenden fr diese Aufgaben Cursor. Anwendungen ffnen implizit einen Cursor, wenn sie eine Funktion SQLExecute oder SQLExecDirect ausfhren. Bei Anwendungen, die sich nur vorwrts durch eine Ergebnismenge bewegen und sie nicht aktualisieren, ist das Cursor-Verhalten recht einfach. Standardmig erwarten ODBC-Anwendungen dieses Verhalten. ODBC definiert einen Nur-Lesen-Cursor, der nur vorwrts liest und Adaptive Server Anywhere liefert einen Cursor, der fr diesen Fall auf Performance optimiert ist.

$ Ein einfaches Beispiel fr einen nur vorwrts lesenden Cursor finden


Sie unter "Daten abrufen" auf Seite 300. Bei Anwendungen, die sowohl vorwrts als auch rckwrts durch die Ergebnismenge blttern mssen, wie etwa Anwendungen mit grafischer Benutzeroberflche, ist das Cursor-Verhalten komplexer. Wie reagiert die Anwendung, wenn sie eine Zeile zurckgibt, die von einer anderen Anwendung aktualisiert wurde? ODBC definiert eine Reihe von abrollenden Cursorn, damit Sie das gewnschte Verhalten in Ihre Anwendung einbauen knnen. Adaptive Server Anywhere liefert eine vollstndige Gruppe von Cursorn, die mit den abrollenden ODBCCursortypen bereinstimmen. Die erforderlichen Cursor-Merkmale werden mit der Funktion SQLSetStmtAttr gesetzt, die die Anweisungsattribute definiert. Sie mssen SQLSetStmtAttr aufrufen, bevor Sie eine Anweisung ausfhren, die eine Ergebnismenge erzeugt. Viele Cursor-Merkmale knnen mit SQLSetStmtAttr festgelegt werden. Folgende Merkmale bestimmen den von Adaptive Server Anywhere gelieferten Cursortyp:

299

Mit Ergebnismengen arbeiten

SQL_ATTR_CURSOR_SCROLLABLE Fr einen abrollenden Cursor

auf SQL_SCROLLABLE setzen und auf SQL_NONSCROLLABLE fr Vorwrts-Cursor. SQL_NONSCROLLABLE ist der Standardwert.
SQL_ATTR_CONCURRENCY Auf einen der folgenden Werte setzen:

SQL_CONCUR_READ_ONLY Aktualisierungen deaktivieren. SQL_CONCUR_READ_ONLY ist der Standardwert. SQL_CONCUR_LOCK Verwenden Sie die niedrigste Sperrstufe, die ausreicht, um eine Zeile zu aktualisieren. SQL_CONCUR_ROWVER Verwenden Sie optimistische

Parallelittssteuerung, bei der Zeilenversionen verglichen werden, wie z.B. SQLBase ROWID oder Sybase TIMESTAMP.
SQL_CONCUR_VALUES Verwenden Sie optimistische

Parallelittssteuerung, bei der Werte verglichen werden.

$ Weitere Hinweise finden Sie unter SQLSetStmtAttr in der MicrosoftDokumentation ODBC Programmers Reference. Beispiel Fr das folgende Fragment ist ein abrollender Nur-Lesen-Cursor erforderlich:
SQLAllocHandle( SQL_HANDLE_STMT, dbc, &stmt ); SQLSetStmtAttr( stmt, SQL_ATTR_CURSOR_SCROLLABLE, SQL_SCROLLABLE, 0 );

Daten abrufen
Um Zeilen aus einer Datenbank abzurufen, fhren Sie mit SQLExecute oder SQLExecDirect eine SELECT-Anweisung aus. Damit wird ein Cursor fr die Anweisung geffnet. Als Nchstes verwenden Sie SQLFetch oder SQLExtendedFetch, damit ber den Cursor Zeilen abgerufen werden. Wenn eine Anwendung die Anweisung mit Hilfe von SQLFreeHandle freigibt, wird der Cursor geschlossen. Um Werte von einem Cursor abzurufen, kann die Anwendung entweder SQLBindCol oder SQLGetData verwenden. Falls Sie SQLBindCol benutzen, werden die Werte mit jedem Abruf (fetch) abgeholt. Falls Sie SQLGetData benutzen, mssen Sie sie fr jede Spalte nach jedem Abruf (fetch) aufrufen. SQLGetData wird benutzt, um Werte in Teilen fr Spalten wie LONG VARCHAR oder LONG BINARY einzulesen. Alternativ knnen Sie das SQL_MAX_LENGTH-Anweisungsattribut auf einen Wert setzen, der gro genug ist, um den Wert fr die gesamte Spalte aufzunehmen. Der Standardwert fr SQL_ATTR_MAX_LENGTH ist 256 KByte. 300

Kapitel 7 ODBC-Programmierung
Mit dem folgenden Codefragment wird ein Cursor fr eine Abfrage geffnet und Daten ber den Cursor abgerufen. Auf eine Fehlerberprfung wurde verzichtet, um das Beispiel leichter lesbar zu halten. Das Fragment stammt aus dem vollstndigen Beispiel Samples\ASA\ODBCSelect\odbcselect.cpp.
SQLINTEGER cbDeptID = 0, cbDeptName = SQL_NTS, cbManagerID = 0; SQLCHAR deptname[ DEPT_NAME_LEN ]; SQLSMALLINT deptID, managerID; SQLHENV env; SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN retcode; SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env ); SQLSetEnvAttr( env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc ); SQLConnect( dbc, (SQLCHAR*) "ASA 8.0 Sample", SQL_NTS, (SQLCHAR*) "DBA", SQL_NTS, (SQLCHAR*) "SQL", SQL_NTS ); SQLAllocHandle( SQL_HANDLE_STMT, dbc, &stmt ); SQLBindCol( stmt, 1, SQL_C_SSHORT, &deptID, 0, &cbDeptID); SQLBindCol( stmt, 2, SQL_C_CHAR, deptname, sizeof(deptname), &cbDeptName); SQLBindCol( stmt, 3, SQL_C_SSHORT, &managerID, 0, &cbManagerID); SQLExecDirect( stmt, (SQLCHAR * ) "SELECT dept_id, dept_name, dept_head_id FROM DEPARTMENT " "ORDER BY dept_id", SQL_NTS ); while( ( retcode = SQLFetch( stmt ) ) != SQL_NO_DATA ){ printf( "%d %20s %d\n", deptID, deptname, managerID ); } SQLFreeHandle( SQL_HANDLE_STMT, stmt ); SQLDisconnect( dbc ); SQLFreeHandle( SQL_HANDLE_DBC, dbc ); SQLFreeHandle( SQL_HANDLE_ENV, env );

Die Anzahl der Zeilenpositionen, die Sie mit einem Fetch-Vorgang abrufen knnen, wird durch die Gre einer Ganzzahl bestimmt. Mit einem FetchVorgang knnen Sie Zeilen bis zu Nummer 2147483646 abrufen, wobei es sich um die grtmgliche Ganzzahl minus 1 handelt. Wenn Sie negative Werte verwenden (Zeilen in Bezug auf das Ende), knnen Sie FetchVorgnge nach unten bis zum niedrigsten negativen Wert, der in einer Ganzzahl mglich ist, plus 1 ausfhren.

301

Mit Ergebnismengen arbeiten

Zeilen ber einen Cursor aktualisieren und lschen


Im Dokument "Microsoft ODBC Programmers Reference" wird empfohlen, dass Sie SELECT ... FOR UPDATE benutzen, um anzuzeigen, dass eine Abfrage mit positionierten Vorgngen aktualisierbar ist. In Adaptive Server Anywhere brauchen Sie die Klausel FOR UPDATE nicht zu benutzen: SELECT-Anweisungen knnen automatisch aktualisiert werden, sofern die folgenden Bedingungen erfllt sind: Die zu Grunde liegende Abfrage untersttzt Aktualisierungen. Unter der Voraussetzung, dass eine Datennderungsanweisung fr die Spalten im Ergebnis sinnvoll ist, kann also die Datennderungsanweisung im Cursor ausgefhrt werden. Die Datenbankoption ANSI_UPDATE_CONSTRAINTS schrnkt den Typ aktualisierbarer Abfragen ein.

$ Weitere Hinweise finden Sie unter


"ANSI_UPDATE_CONSTRAINTS" auf Seite 615 der Dokumentation ASA Datenbankadministration. Der Cursortyp untersttzt Aktualisierungen. Wenn Sie einen Nur-Lese-Cursor verwenden, knnen Sie die Ergebnismenge nicht aktualisieren. Es gibt in ODBC zwei Alternativen, um positionsbasierte Updates und positionsbasiertes Lschen durchzufhren. Die Funktion SQLSetPos. Abhngig von den angegebenen Parametern (SQL_POSITION, SQL_REFRESH, SQL_UPDATE, SQL_DELETE) legt SQLSetPos die Cursorposition fest und ermglicht es der Anwendung, die Darstellung der Daten in der Ergebnismenge oder die Daten selbst zu aktualisieren oder die Daten zu lschen. Diese Methode muss bei Adaptive Server Anywhere angewendet werden. Mit Hilfe von SQLExecute positionsbasierte UPDATE- und DELETEANWEISUNGEN senden. Diese Methode darf nicht bei Adaptive Server Anywhere angewendet werden.

302

Kapitel 7 ODBC-Programmierung

Bookmarks verwenden
ODBC bietet Bookmarks, die benutzt werden, um Zeilen in einem Cursor zu identifizieren. Adaptive Server Anywhere untersttzt Lesezeichen (Bookmarks, Textmarken) fr alle Arten von Cursorn, mit Ausnahme von dynamischen Cursorn. Vor der ODBC-Version 3.0 konnte eine Datenbank nur angeben, ob sie Bookmarks untersttzt oder nicht: Es gab keine Schnittstelle, die diese Informationen fr jeden Cursortyp bereitstellte. Der Datenbankserver hatte keine Mglichkeit, anzugeben, welche Typen von Cursor-Bookmarks untersttzt werden. Fr ODBC 2-Anwendungen gibt Adaptive Server Anywhere nur zurck, dass er Bookmarks untersttzt. ODBC wird Sie also nicht an dem Versuch hindern, Bookmarks mit dynamischen Cursorn zu benutzen; Sie sollten diese Kombination allerdings vermeiden.

303

Gespeicherte Prozeduren aufrufen

Gespeicherte Prozeduren aufrufen


In diesem Abschnitt wird beschrieben, wie gespeicherte Prozeduren aufgerufen und die Ergebnisse in einer ODBC-Anwendung bearbeitet werden.

$ Eine vollstndige Beschreibung von gespeicherten Prozeduren und


Triggern finden Sie unter "Prozeduren, Trigger und Anweisungsfolgen verwenden" auf Seite 565 der Dokumentation ASA SQL-Benutzerhandbuch. Prozeduren und Ergebnismengen Es gibt zwei Arten von Prozeduren: Prozeduren, die Ergebnismengen zurckgeben und solche, die keine zurckgeben. Sie knnen SQLNumResultCols verwenden, um den Unterschied festzustellen: die Anzahl der Ergebnisspalten ist 0 (Null), falls die Prozedur keine Ergebnismenge zurckgibt. Falls eine Ergebnismenge zurckgegeben wird, knnen Sie die Werte mit SQLFetch oder SQLExtendedFetch abrufen, wie bei jedem anderen Cursor. Parameter mssen an Prozeduren mit Parametermarkierungen (Fragezeichen) bergeben werden. Verwenden Sie SQLBindParameter, um jeder Parametermarkierung einen Speicherbereich zuzuweisen: INPUT, OUTPUT oder INOUT. Um mehrfache Ergebnismengen verarbeiten zu knnen, muss ODBC den aktuell ausgefhrten Cursor beschreiben, und nicht die von der Prozedur definierte Ergebnismenge. Deshalb bezeichnet ODBC die Spaltennamen nicht immer so, wie sie in der RESULT-Klausel der gespeicherten Prozedur definiert sind. Um dieses Problem zu vermeiden, knnen Sie im Ergebnismengencursor Ihrer Prozedur einen Spaltenalias verwenden. Beispiel Mit diesem Beispiel wird eine Prozedur erstellt und aufgerufen, die keine Ergebnismenge zurckgibt. Die Prozedur bernimmt einen INOUTParameter und erhht seinen Wert. Im Beispiel wird die Variable num_col den Wert 0 (Null) haben, denn die Prozedur gibt keine Ergebnismenge zurck. Auf eine Fehlerberprfung wurde verzichtet, um das Beispiel leichter lesbar zu halten.
HDBC dbc; HSTMT stmt; long i; SWORD num_col; /* Prozedur erstellen */ SQLAllocStmt( dbc, &stmt ); SQLExecDirect( stmt, "CREATE PROCEDURE Increment( INOUT a INT )" \ " BEGIN" \ " SET a = a + 1" \ " END", SQL_NTS );

304

Kapitel 7 ODBC-Programmierung

/* Prozedur zur Erhhung von 'i' aufrufen */ i = 1; SQLBindParameter( stmt, 1, SQL_C_LONG, SQL_INTEGER, 0, 0, &i, NULL ); SQLExecDirect( stmt, "CALL Increment( ? )", SQL_NTS ); SQLNumResultCols( stmt, &num_col ); do_something( i );

Beispiel

Mit dem folgenden Beispiel wird eine Prozedur aufgerufen, die eine Ergebnismenge zurckgibt. Im Beispiel hat die Variable num_col den Wert 2, denn die Prozedur gibt eine Ergebnismenge mit zwei Spalten zurck. Auf eine Fehlerberprfung wurde auch hier verzichtet, um das Beispiel leichter lesbar zu halten.
HDBC dbc; HSTMT stmt; SWORD num_col; RETCODE retcode; char emp_id[ 10 ]; char emp_lame[ 20 ]; /* Prozedur erstellen */ SQLExecDirect( stmt, "CREATE PROCEDURE employees()" \ " RESULT( emp_id CHAR(10), emp_lname CHAR(20))"\ " BEGIN" \ " SELECT emp_id, emp_lame FROM employee" \ " END", SQL_NTS ); /* Prozedur aufrufen - Ergebnisse ausgeben */ SQLExecDirect( stmt, "CALL employees()", SQL_NTS ); SQLNumResultCols( stmt, &num_col ); SQLBindCol( stmt, 1, SQL_C_CHAR, &emp_id, sizeof(emp_id), NULL ); SQLBindCol( stmt, 2, SQL_C_CHAR, &emp_lname, sizeof(emp_lname), NULL ); for( ;; ) { retcode = SQLFetch( stmt ); if( retcode == SQL_NO_DATA_FOUND ) { retcode = SQLMoreResults( stmt ); if( retcode == SQL_NO_DATA_FOUND ) break; } else { do_something( emp_id, emp_lname ); } }

305

Umgang mit Fehlern

Umgang mit Fehlern


Fehler in ODBC werden mit dem Rckgabewert jedes einzelnen ODBCFunktionsaufrufs und entweder mit der Funktion SQLError oder der Funktion SQLGetDiagRec gemeldet. Die Funktion SQLError wurde in ODBC-Versionen bis Version 3 (ausschlielich Version 3) verwendet. Ab Version 3 wird die Funktion SQLError nicht mehr weiter entwickelt und durch die Funktion SQLGetDiagRec ersetzt. Jede ODBC-Funktion gibt einen SQLRETURN zurck, der einen der folgenden Statuscodes annehmen kann:
Statuscode SQL_SUCCESS SQL_SUCCESS_WITH_INFO Beschreibung Kein Fehler. Die Funktion wurde vollstndig ausgefhrt, aber ein Aufruf von SQLError zeigt eine Warnung an. Der hufigste Grund fr diesen Status ist, dass ein Wert zurckgegeben wurde, der fr den von der Anwendung zur Verfgung gestellten Puffer zu lang ist. SQL_ERROR Die Funktion wurde wegen eines Fehlers nicht vollstndig ausgefhrt. Sie knnen SQLError ausfhren, um mehr Informationen ber das Problem zu erhalten. Ein ungltiger Umgebungs-, Verbindungs- oder Statement-Handle wurden als Argument bergeben. Dies passiert hufig, wenn ein Handle benutzt wird, nachdem es freigegeben wurde, oder falls das Handle ein Null-Zeiger ist. SQL_NO_DATA_FOUND Keine Hinweise verfgbar. Der hufigste Grund fr diesen Staus ist, dass beim Abrufen von einem Cursor - keine weiteren Zeilen mehr in dem Cursor waren. SQL_NEED_DATA Fr einen Parameter werden Daten bentigt. Dies ist eine erweiterte Funktion, die in der Hilfedatei unter SQLParamData und SQLPutData beschrieben wird.

SQL_INVALID_HANDLE

306

Kapitel 7 ODBC-Programmierung
Mit jeder Umgebung, jeder Verbindung und jedem Statement-Handle knnen ein oder mehrere Fehler oder Warnungen verbunden sein. Jeder Aufruf von SQLError oder SQLGetDiagRec gibt Hinweise fr einen Fehler zurck und entfernt die Hinweise ber diesen Fehler. Falls Sie SQLError oder SQLGetDiagRec nicht aufrufen, um alle Fehlermeldungen zu entfernen, werden die Fehlermeldungen beim nchsten Funktionsaufruf entfernt, der das gleiche Handle als Parameter bergibt. Jeder Aufruf von SQLError kann drei Handles fr Umgebung, Verbindung und Anweisung bergeben. Der erste Aufruf benutzt SQL_NULL_HSTMT, um den mit einer Verbindung zusammenhngenden Fehler zu erhalten. Auf die gleiche Weise gibt ein Aufruf mit SQL_NULL_DBC und SQL_NULL_HSTMT alle mit dem Umgebungshandle zusammenhngenden Fehler zurck. Jeder Aufruf von SQLGetDiagRec kann entweder ein Umgebungs-, Verbindungs- oder Anweisungshandle bergeben. Der erste Aufruf benutzt SQL_HANDLE_DBC, um den mit einer Verbindung zusammenhngenden Fehler zurckzugeben. Der zweite Aufruf benutzt SQL_HANDLE_STMT, um den mit der soeben ausgefhrten Anweisung zusammenhngenden Fehler zurckzugeben. SQLError und SQLGetDiagRec geben SQL_SUCCESS zurck, falls ein Fehler zu melden ist (nicht SQL_ERROR), und SQL_NO_DATA_FOUND, falls keine weiteren Fehler zu melden sind. Beispiel 1 Das folgende Programmfragment benutzt SQLError und gibt Rckgabecodes zurck:

307

Umgang mit Fehlern


/* Erforderliche Variable deklarieren */ SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN retcode; UCHAR errmsg[100]; /* Hier wurde Code ausgelassen */ retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt ); if( retcode == SQL_ERROR ){ SQLError( env, dbc, SQL_NULL_HSTMT, NULL, NULL, errmsg, sizeof(errmsg), NULL ); /* Annahme: print_error ist definiert. print_error( "Failed SQLAllocStmt", errmsg ); return; } /* Artikel fr Auftrag 2015 lschen */ retcode = SQLExecDirect( stmt, "delete from sales_order_items where id=2015", SQL_NTS ); if( retcode == SQL_ERROR ) { SQLError( env, dbc, stmt, NULL, NULL, errmsg, sizeof(errmsg), NULL ); /* Annahme: print_error ist definiert. print_error( "Elemente konnten nicht gelscht werden", errmsg ); return;

Die Beispiele bergeben den Null-Zeiger fr einige der Parameter von SQLError. Die ODBC-Dokumentation enthlt eine vollstndige Beschreibung von SQLError und all seinen Parametern. Beispiel 2 Der folgende Auszug aus einem Beispielcode benutzt SQLGetDiagRec und Rckgabecodes:
/* Erforderliche Variablen deklarieren */ SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN retcode; SQLSMALLINT errmsglen; SQLINTEGER errnative; UCHAR errmsg[255]; UCHAR errstate[5]; /* Hier wurde Code weggelassen */ retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt ); if( retcode == SQL_ERROR ){ SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, errstate, &errnative, errmsg, sizeof(errmsg), &errmsglen); /* Annahme: print_error ist definiert */ print_error( "Allocation failed", errstate, errnative, errmsg ); return;

308

Kapitel 7 ODBC-Programmierung
} /* Artikel fr Auftrag 2015 lschen */ retcode = SQLExecDirect( stmt, "delete from sales_order_items where id=2015", SQL_NTS ); if( retcode == SQL_ERROR ) { SQLGetDiagRec(SQL_HANDLE_STMT, stmt, recnum, errstate, &errnative, errmsg, sizeof(errmsg), &errmsglen); /* Annahme: print_error ist definiert*/ print_error("Failed to delete items", errstate, errnative, errmsg ); return; }

309

Umgang mit Fehlern

310

K A P I T E L

Die DBTools-Schnittstelle

ber dieses Kapitel

In diesem Kapitel wird beschrieben, wie die DBTools-Bibliothek benutzt wird, die zum Lieferumfang von Adaptive Server Anywhere gehrt und Coder C++-Anwendungen zustzlich mit Funktionen der Datenbankverwaltung ausstattet.
Thema Einfhrung in die DBTools-Schnittstelle DBTools-Schnittstelle verwenden DBTools-Funktionen DBTools-Strukturen DBTools-Aufzhlungstypen Seite 312 314 323 335 367

Inhalt

311

Einfhrung in die DBTools-Schnittstelle

Einfhrung in die DBTools-Schnittstelle


Mit dem Sybase Adaptive Server Anywhere wird Sybase Central und eine Serie von Dienstprogrammen mitgeliefert, die fr die Verwaltung von Datenbanken verwendet werden knnen. Diese Dienstprogramme fr die Datenbankverwaltung bernehmen bestimmte Aufgaben, wie etwa das Sichern und Erstellen von Datenbanken, die bersetzung von Transaktionslogs in SQL, usw. Untersttzte Plattformen Alle Dienstprogramme fr die Datenbankverwaltung benutzen eine gemeinsame Bibliothek, die DBTools-Bibliothek. Sie wird fr die Betriebssysteme Windows Windows 95/98 und Windows NT mitgeliefert. Der Name der Bibliothek lautet dbtool8.dll. Sie knnen Ihre eigenen Dienstprogramme fr die Datenbankverwaltung entwickeln oder Funktionen der Datenbankverwaltung in Ihre Anwendungen einbauen, indem Sie die DBTools-Bibliothek aufrufen. In diesem Kapitel wird die Schnittstelle zur DBTools-Bibliothek beschrieben. Wenn Sie dieses Kapitel lesen, sollten Sie mit der Methode vertraut sein, mit der die von Ihnen benutzte Entwicklungsumgebung DLLs aufruft. Die DBTools-Bibliothek hat Funktionen oder Eintrittspunkte fr jedes einzelne Dienstprogramm zur Datenbankverwaltung. Auerdem mssen Funktionen vor dem Aufruf anderer DBTools-Funktionen, sowie im Anschluss an die Verwendung anderer DBTools-Funktionen aufgerufen werden. Windows CE Die Bibliothek dbtool8.dll wird fr Windows CE geliefert, enthlt aber nur Programmeinstiegspunkte fr DBToolsInit, DBToolsFini, DBRemoteSQL und DBSynchronizeLog. Andere Tools werden fr Windows CE nicht bereitgestellt. Die DBTools-Header-Datei, die mit dem Adaptive Server Anywhere mitgeliefert wird, enthlt eine Liste der Eintrittspunkte zur DBToolsBibliothek und liefert die Strukturen, die benutzt werden, um Daten an die Bibliothek zu bergeben und von ihr zu beziehen. Die Datei dbtools.h wird im Unterverzeichnis h im Installationsverzeichnis eingerichtet. In der Datei dbtools.h finden Sie die neuesten Informationen ber die Eintrittspunkte und die Strukturbestandteile. Die Header-Datei dbtools.H enthlt zwei andere Dateien:
sqlca.h Diese Datei ist fr die Auflsung diverser Makros, nicht fr SQLCA selbst, vorgesehen. dllapi.h Diese Datei definiert Prprozessor-Makros fr betriebssystemabhngige und sprachenabhngige Makros.

Die dbtools.hHeader-Datei

312

Kapitel 8 Die DBTools-Schnittstelle


Die Header-Datei sqldef.h enthlt auerdem Fehler-Rckgabewerte.

313

DBTools-Schnittstelle verwenden

DBTools-Schnittstelle verwenden
Dieser Abschnitt enthlt einen berblick ber die Entwicklung von Anwendungen, die die DBTools-Schnittstelle fr die Verwaltung der Datenbanken verwenden.

Importbibliotheken verwenden
Damit die DBTools-Funktionen verwendet werden knnen, mssen Sie Ihre Anwendung mit einer DBTools Importbibliothek verknpfen, die die erforderlichen Funktionsdefinitionen enthlt. Untersttzte Plattformen Importbibliotheken sind Compiler-spezifisch und werden fr WindowsBetriebssysteme mit Ausnahme von Windows CE geliefert. Importbibliotheken fr die DBTools-Schnittstelle werden mit dem Adaptive Server Anywhere mitgeliefert und knnen im Unterverzeichnis lib des jeweiligen Betriebssystemverzeichnisses im Installationsverzeichnis gefunden werden. Folgende DBTools-Importbibliotheken werden geliefert:
Compiler Watcom Microsoft Borland Bibliothek

win32\dbtlstw.lib win32\dbtlstM.lib win32\dbtlstB.lib

DBTools-Bibliothek starten und beenden


Bevor Sie andere DBTools-Funktionen verwenden, mssen Sie DBToolsInit aufrufen. Wenn Sie die DBTools DLL nicht mehr verwenden, mssen Sie DBToolsFini aufrufen. Die Funktionen DBToolsInit und DBToolsFini bezwecken hauptschlich, der DBTools-DLL das Laden der Adaptive Server Anywhere Sprachen-DLL zu ermglichen. Die Sprachen-DLL enthlt lokalisierte Versionen aller Fehlermeldungen und Bedieneraufforderungen, die DBTools intern verwendet. Wenn DBToolsFini nicht aufgerufen wird, kann die Referenznummer der Sprachen-DLL nicht heruntergezhlt werden, sodass diese DLL nicht entladen wird. Achten Sie daher immer darauf, dass zu jedem Aufruf von DBToolsInit als Gegenstck DBToolsFini aufgerufen wird.

314

Kapitel 8 Die DBTools-Schnittstelle


Im folgenden Programmcodebeispiel wird gezeigt, wie DBTools aufgerufen und wieder bereinigt werden:
// Deklarationen a_dbtools_info info; short ret; //Initialisierung der a_dbtools_info-Struktur memset( &info, 0, sizeof( a_dbtools_info) ); info.errorrtn = (MSG_CALLBACK)MyErrorRtn; // Initialisierung von DBTools ret = DBToolsInit( &info ); if( ret != EXIT_OKAY ) { // DLL-Initialisierung fehlgeschlagen } // einige DBTools-Routinen aufrufen. . . // DBTools dll bereinigen DBToolsFini( &info );

DBTools-Funktionen aufrufen
Alle Tools werden aufgerufen, indem erst eine Struktur ausgefllt und dann eine Funktion (oder ein Eintrittspunkt) in der DBTools-DLL aufgerufen wird. Jeder Eintrittspunkt nimmt einen Zeiger zu einer bestimmten Struktur als Argument. Im folgenden Beispiel wird gezeigt, wie die DBBackup-Funktion unter einem Windows-Betriebssystem verwendet wird.
// Initialisierung der Struktur a_backup_db backup_info; memset( &backup_info, 0, sizeof( backup_info ) ); // Struktur ausfllen backup_info.version = DB_TOOLS_VERSION_NUMBER; backup_info.output_dir = "C:\BACKUP"; backup_info.connectparms ="uid=DBA;pwd=SQL;dbf=asademo.db"; backup_info.startline = "dbeng8.EXE"; backup_info.confirmrtn = (MSG_CALLBACK) ConfirmRtn ; backup_info.errorrtn = (MSG_CALLBACK) ErrorRtn ; backup_info.msgrtn = (MSG_CALLBACK) MessageRtn ; backup_info.statusrtn = (MSG_CALLBACK) StatusRtn ; backup_info.backup_database = TRUE; // Sicherung starten DBBackup( &backup_info );

315

DBTools-Schnittstelle verwenden

$ Hinweise zu den Bestandteilen der DBTools-Strukturen finden Sie


unter "DBTools-Strukturen" auf Seite 335.

Rckgabecodes der Softwarekomponenten


Alle Datenbanktools werden als Eintrittspunkt in einer DLL geliefert. Diese Eintrittspunkte verwenden die folgenden Rckgabecodes:
Program mcode 0 1 2 3 4 5 6 7 8 9 10 11 254 255 Erklrung Erfolg Allgemeiner Ausfall Ungltiges Dateiformat Datei nicht gefunden, kann nicht geffnet werden Kein Speicher mehr Beendet vom Benutzer Fehlgeschlagene Kommunikationen Erforderlicher Datenbankname fehlt Falsches Client/Server-Protokoll Keine Verbindung mit dem Datenbankserver mglich Datenbankserver luft nicht Datenbankserver nicht gefunden Stoppzeit erreicht Ungltige Parameter in der Befehlszeile

Callback-Funktionen verwenden
Einige Elemente in der DBTools-Struktur sind vom Typ MSG_CALLBACK. Es handelt sich dabei um Zeiger auf CallbackFunktionen. Nutzung der CallbackFunktionen Mit Callback-Funktionen knnen DBTools-Funktionen die Kontrolle der Verarbeitung an die aufrufende Anwendung des Benutzers zurckgeben. Die DBTools-Bibliothek benutzt Callback-Funktionen zur Verarbeitung von Nachrichten, die von den DBTools-Funktionen an den Benutzer gesandt werden, fr vier Zwecke:

316

Kapitel 8 Die DBTools-Schnittstelle

Besttigung Wird aufgerufen, wenn eine Aktion vom Benutzer besttigt

werden muss. Falls zum Beispiel das Sicherungsverzeichnis nicht vorhanden ist, fragt die Tools-DLL, ob es erzeugt werden soll.
Fehlermeldung Wird aufgerufen, um eine Nachricht zu bearbeiten,

wenn ein Fehler auftritt, zum Beispiel, wenn ein Vorgang nicht gengend Speicherplatz hat
Informationsnachricht Wird aufgerufen, um den Benutzer zu

informieren, wie zum Beispiel eine Nachricht mit den Namen der Tabelle, die gerade gesichert wird
Statusinformation Wird aufgerufen, um den Status eines Vorgangs anzuzeigen, wie zum Beispiel, wie viel Prozent einer Tabelle entladen sind

Callback-Funktion einer Struktur zuordnen

Sie knnen der Struktur direkt eine Callback-Routine zuordnen. Die folgende Anweisung ist ein Beispiel fr die Verwendung einer Sicherungsstruktur:
backup_info.errorrtn = (MSG_CALLBACK) MyFunction

MSG_CALLBACK ist in der Header-Datei dllapi.h definiert, die im Adaptive Server Anywhere enthalten ist. Tools-Routinen knnen Nachrichten in die aufrufende Anwendung bergeben, die dann in der passenden Benutzeroberflche dargestellt werden sollten; das kann eine Fensterumgebung sein, die Standardausgabe eines zeichenbasierten Systems oder andere Benutzeroberflchen. Beispiel fr eine Callback-Funktion mit Besttigung Im folgenden Beispiel fragt eine Routine den Benutzer nach einer Besttigung mit YES oder NO und gibt die Antwort des Benutzers zurck:
extern short _callback ConfirmRtn( char far * question ) { int ret; if( question != NULL ) { ret = MessageBox( HwndParent, question, "Confirm", MB_ICONEXCLAMTION|MB_YESNO ); } return( 0 ); }

Beispiel fr eine Callback-Funktion mit Fehlermeldung

Im folgenden Beispiel zeigt eine Routine zur Behandlung einer Fehlermeldung die Fehlermeldung in einer Meldungsbox an.
extern short _callback ErrorRtn( char far * errorstr ) { if( errorstr != NULL ) { ret = MessageBox( HwndParent, errorstr, "Backup Error", MB_ICONSTOP|MB_OK ); }

317

DBTools-Schnittstelle verwenden
return( 0 ); }

Beispiel fr eine Callback-Funktion mit Nachricht

Eine typische Implementierung einer Callback-Funktion, die eine Nachricht am Bildschirm ausgibt:
extern short _callback MessageRtn( char far * errorstr ) { if( messagestr != NULL ) { OutputMessageToWindow( messagestr ); } return( 0 ); }

Beispiel fr eine Callback-Funktion mit Statusmeldung

Eine Status-Callback-Routine wird aufgerufen, wenn die Tools den Status eines Vorgangs anzeigen mssen (zum Beispiel wie viel Prozent einer Tabelle entladen sind). 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; } OutputMessageToWindow( statustr ); return TRUE; }

Versionsnummern und Kompatibilitt


Jede Struktur enthlt ein Element, das die Versionsnummer angibt. Sie sollten dieses Versionselement benutzen, um die Version der DBToolsBibliothek zu speichern, fr die Ihre Anwendung entwickelt wurde. Die aktuelle Version der DBTools-Bibliothek ist als Konstante in der HeaderDatei dbtools.h enthalten.
v Um einer Struktur die aktuelle Versionsnummer zuzuordnen, gehen Sie wie folgt vor:

Ordnen Sie die Versionskonstante dem Versionselement der Struktur zu, bevor Sie die DBTools-Funktion aufrufen. Die folgende Zeile ordnet die aktuelle Version einer Sicherungsstruktur zu:
backup_info.version = DB_TOOLS_VERSION_NUMBER;

318

Kapitel 8 Die DBTools-Schnittstelle

Kompatibilitt

Die Versionsnummer ermglicht es der Anwendung, auch in Zukunft mit neueren Versionen der DBTools-Bibliothek weiterzuarbeiten. Die DBToolsFunktionen sorgen mit Hilfe der Versionsnummern, die von Ihrer Anwendung zur Verfgung gestellt werden, dafr, dass Ihre Anwendung auch dann weiterarbeiten kann, wenn neue Elemente zur DBTools-Struktur hinzugefgt wurden. Anwendungen arbeiten nicht mit lteren Versionen der DBTools-Bibliothek zusammen.

Bit-Felder benutzen
Viele DBTools-Strukturen benutzen Bit-Felder, um Boolesche Informationen kompakt zu speichern. 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; quiet : 1; rename_log : 1; truncate_log : 1; rename_local_log: 1; 1; 1;

1;

Jedes Bit-Feld ist ein Bit lang, angezeigt durch eine 1 rechts neben dem Doppelpunkt in der Strukturdeklaration. Der hier verwendete Datentyp hngt vom Wert ab, der am Anfang von dbtools.h a_bit_field zugeordnet wurde, und ist abhngig vom Betriebssystem. Sie ordnen dem Bit-Feld einen Wert von 0 (Null) oder 1 zu, um einen Booleschen Wert an die Struktur zu bergeben.

Ein Beispiel fr DBTools


Dieses Beispiel sowie Hinweise zum Kompilieren finden Sie im Unterverzeichnis Samples\ASA\DBTools Ihres SQL AnywhereVerzeichnisses. Das Beispielprogramm selbst ist Samples\ASA\DBTools\main.c. Das Beispiel veranschaulicht, wie die DBTools-Bibliothek zum Sichern der Datenbank eingesetzt werden kann.
# define WINNT

319

DBTools-Schnittstelle verwenden

#include #include #include #include

<stdio.h> "windows.h" "string.h" "dbtools.h"

extern short _callback ConfirmCallBack(char far * str){ if( MessageBox( NULL, str, "Backup", MB_YESNO|MB_ICONQUESTION ) == IDYES ) { return 1; } return 0; } extern short _callback MessageCallBack( char far * str){ if( str != NULL ) { fprintf( stdout, "%s", str ); fprintf( stdout, "\n" ); fflush( stdout ); } return 0; } extern short _callback StatusCallBack( char far * str ){ if( str != NULL ) { fprintf( stdout, "%s", str ); fprintf( stdout, "\n" ); fflush( stdout ); } return 0; } extern short _callback ErrorCallBack( char far * str ){ if( str != NULL ) { fprintf( stdout, "%s", str ); fprintf( stdout, "\n" ); fflush( stdout ); } return 0; } // Haupteintrittspunkt in das Programm. int main( int argc, char * argv[] ){ a_backup_db backup_info; a_dbtools_info dbtinfo; char dir_name[ _MAX_PATH + 1]; char connect[ 256 ]; HINSTANCE hinst; FARPROC dbbackup; FARPROC dbtoolsinit; FARPROC dbtoolsfini;

320

Kapitel 8 Die DBTools-Schnittstelle


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

321

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

322

Kapitel 8 Die DBTools-Schnittstelle

DBTools-Funktionen
Dieser Abschnitt beschreibt die Funktionen in der DBTools-Bibliothek. Die Funktionen sind alphabetisch aufgelistet.

DBBackup-Funktion
Funktion Prototyp Parameter

Datenbanksicherungs-Funktion. Diese Funktion wird von dem BefehlszeilenDienstprogramm dbbackup benutzt.


short DBBackup ( const a_backup_db * Sicherungsdatenbank ); Parameter Sicherungsdatenbank Beschreibung Zeiger auf eine "a_backup_db-Struktur" auf Seite 335

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Die Funktion DBBackup verwaltet alle Datenbanksicherungs-Aufgaben.

$ Die Beschreibung dieser Aufgaben finden Sie unter "Das


Sicherungsdienstprogramm" auf Seite 484 der Dokumentation ASA Datenbankadministration.
Siehe auch

"a_backup_db-Struktur" auf Seite 335

DBChangeLogName-Funktion
Funktion Prototyp Parameter

ndert den Namen der Transaktionslogdatei. Diese Funktion wird von dem Befehlszeilen-Dienstprogramm dblog benutzt.
short DBChangeLogName ( const a_change_log * nderungslog ); Parameter nderungslog Beschreibung Zeiger auf eine "a_change_log-Struktur" auf Seite 337

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Die Option -t des Dienstprogramms dblog ndert den Namen des Transaktionslogs. DBChangeLogName liefert eine Programmierschnittstelle zu dieser Funktion. 323

DBTools-Funktionen

$ Eine Beschreibung des Dienstprogramms dblog finden Sie unter "Das Transaktionslog-Dienstprogramm" auf Seite 564 der Dokumentation ASA Datenbankadministration.
Siehe auch

"a_change_log-Struktur" auf Seite 337

DBChangeWriteFile-Funktion
Funktion

ndert eine Write-Datei, sodass sie auf eine andere Datenbankdatei zugreift. Diese Funktion wird von dem Dienstprogramm dbwrite benutzt, wenn die Option -d angewendet wird.
short DBChangeWriteFile ( const a_writefile * Write-Datei ); Parameter Write-Datei Beschreibung Zeiger auf eine "a_writefile-Struktur" auf Seite 364

Prototyp Parameter

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes 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.

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.


short DBCollate ( const a_db_collation * DB-Kollatierung ); Parameter DB-Kollatierung Beschreibung Zeiger auf eine "a_db_collation-Struktur" auf Seite 344

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Kollatierungs-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Kollatierungs-Dienstprogramm" auf Seite 489 der Dokumentation ASA Datenbankadministration

324

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 dbshrink benutzt.
short DBCompress ( const a_compress_db * Komprimierte_DB ); Parameter Komprimierte_DB Beschreibung Zeiger auf eine "a_compress_db-Struktur" auf Seite 339

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Komprimierungs-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Komprimierungs-Dienstprogramm" auf Seite 495 der Dokumentation ASA Datenbankadministration.

Siehe auch

"a_compress_db-Struktur" auf Seite 339

DBCreate-Funktion
Funktion Prototyp Parameter

Erstellt eine Datenbank. Diese Funktion wird von dem Dienstprogramm dbinit benutzt.
short DBCreate ( const a_create_db * Erstellte_DB ); Parameter Erstellte_DB Beschreibung Zeiger auf eine "a_create_db-Struktur" auf Seite 341

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Initialisierungsdienstprogramm finden Sie unter


"Das Initialisierungs-Dienstprogramm" auf Seite 515 der Dokumentation ASA Datenbankadministration.

Siehe auch

"a_create_db-Struktur" auf Seite 341

325

DBTools-Funktionen

DBCreateWriteFile-Funktion
Funktion Prototyp Parameter

Erstellt eine Write-Datei. Diese Funktion wird von dem Dienstprogramm dbwrite benutzt, wenn die Option -c angewendet wird.
short DBCreateWriteFile ( const a_writefile * Write-Datei ); Parameter Write-Datei Beschreibung Zeiger auf eine "a_writefile-Struktur" auf Seite 364

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes 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.

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 Verschlsseln einer Datenbankdatei. Diese Funktion wird von dem Dienstprogramm dbinit benutzt, wenn die Option -e angewendet wird.
short DBCrypt ( const a_crypt_db * Verschlsselte_DB ); Parameter Verschlsselte_DB Beschreibung Zeiger auf eine "a_crypt_db-Struktur" auf Seite 343

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Weitere Hinweise zum Verschlsseln von Datenbanken finden Sie


unter "Datenbank mit dem Befehlszeilenprogramm ""dbinit"" erstellen" auf Seite 516 der Dokumentation ASA Datenbankadministration.

Siehe auch

"a_crypt_db-Struktur" auf Seite 343

326

Kapitel 8 Die DBTools-Schnittstelle

DBErase-Funktion
Funktion Prototyp Parameter

Lscht eine Datenbankdatei und/oder ein Transaktionslog. Diese Funktion wird von dem Dienstprogramm dberase benutzt.
short DBErase ( const an_erase_db * Zu_lschende_DB ); Parameter Zu_lschende_DB Beschreibung Zeiger auf eine "an_erase_db-Struktur" auf Seite 349

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Lsch-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Dienstprogramm zum Lschen der Datenbank" auf Seite 508 der Dokumentation ASA Datenbankadministration.

Siehe auch

"an_erase_db-Struktur" auf Seite 349

DBExpand-Funktion
Funktion Prototyp Parameter

Dekomprimiert eine Datenbankdatei. Diese Funktion wird von dem Dienstprogramm dbexpand benutzt.
short DBExpand ( const an_expand_db * Zu_expandierende_DB ); Parameter Zu_expandierende_DB Beschreibung Zeiger auf eine "an_expand_db-Struktur" auf Seite 350

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Dekomprimierungs-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Dekomprimierungs-Dienstprogramm" auf Seite 569 der Dokumentation ASA Datenbankadministration.

Siehe auch

"an_expand_db-Struktur" auf Seite 350

DBInfo-Funktion
Funktion

Gibt Informationen ber eine Datenbankdatei zurck. Diese Funktion wird von dem Dienstprogramm dbinfo benutzt. 327

DBTools-Funktionen

Prototyp Parameter

short DBInfo ( const a_db_info * DB-Info ); Parameter DB-Info Beschreibung Zeiger auf eine "a_db_info-Struktur" auf Seite 345

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Informations-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration.

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 zurck. Diese Funktion wird von dem Dienstprogramm dbinfo benutzt, wenn die Option -u angewendet wird.
short DBInfoDump ( const a_db_info * DB-Info ); Parameter DB-Info Beschreibung Zeiger auf eine "a_db_info-Struktur" auf Seite 345

Prototyp Parameter

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Informations-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration.

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, um nach dem Aufruf der Funktion DBInfoDump Ressourcen freizugeben.
short DBInfoFree ( const a_db_info * DB-Info );

328

Kapitel 8 Die DBTools-Schnittstelle

Parameter

Parameter DB-Info

Beschreibung Zeiger auf eine "a_db_info-Struktur" auf Seite 345

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Informations-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration.

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, um die Lizenzdaten des Datenbankservers zu ndern oder mitzuteilen.


short DBLicense ( const a_db_lic_info * DB-Liz.-Info ); Parameter DB-Liz.-Info Beschreibung Zeiger auf eine "a_dblic_info-Struktur" auf Seite 348

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Informations-Dienstprogramm und seine


Eigenschaften finden Sie unter "Das Informations-Dienstprogramm" auf Seite 513 der Dokumentation ASA Datenbankadministration.

Siehe auch

"a_dblic_info-Struktur" auf Seite 348

DBStatusWriteFile-Funktion
Funktion Prototyp Parameter

Ruft den Status einer Write-Datei ab. Diese Funktion wird von dem Dienstprogramm dbwrite benutzt, wenn die Option -s angewendet wird.
short DBStatusWriteFile ( const a_writefile * Write-Datei ); Parameter Write-Datei Beschreibung Zeiger auf eine "a_writefile-Struktur" auf Seite 364

329

DBTools-Funktionen

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes 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.

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.


short DBSynchronizeLog( const a _sync_db * Synchronisierte_DB ); Parameter Synchronisierte_DB Beschreibung Zeiger auf eine "a_sync_db-Struktur" auf Seite 352

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Weitere Informationen ber diese Features finden Sie unter


"Synchronisation einleiten" auf Seite 149 der Dokumentation MobiLink Benutzerhandbuch.

DBToolsFini-Funktion
Funktion Prototyp Parameter

Vermindert den Zhler und gibt Ressourcen frei, nachdem eine Anwendung die DBTools-Bibliothek nicht mehr bentigt.
short DBToolsFini ( const a_dbtools_info * DBTools-Info ); Parameter DBTools-Info Beschreibung Zeiger auf eine "a_dbtools_info-Struktur" auf Seite 349

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Die Funktion DBToolsFini muss am Ende jeder Anwendung aufgerufen werden, die die DBTools-Schnittstelle benutzt. Falls diese Funktion nicht aufgerufen wird, kann das zum Verlust von Speicherressourcen fhren.

330

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 fr die Benutzung vor.


short DBToolsInit t( const a_dbtools_info * DBTools-Info ); Parameter DBTools-Info Beschreibung Zeiger auf eine "a_dbtools_info-Struktur" auf Seite 349

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Der hauptschliche Zweck der Funktion DBToolsInit ist es, die Sprach-DLL von Adaptive Server Anywhere zu laden. Die Sprach-DLL enthlt lokale Versionen der Fehlermeldungen und Bedieneraufforderungen, die DBTools intern verwendet. Die Funktion DBToolsInit muss zu Beginn jeder Anwendung aufgerufen werden, die die DBTools-Schnittstelle benutzt, bevor irgend eine andere DBTools-Funktion benutzt wird.

Beispiel

Das folgende Code-Beispiel zeigt, wie man DBTools initialisiert und ordnungsgem beendet:
a_dbtools_info info; short ret; memset( &info, 0, sizeof( a_dbtools_info) ); info.errorrtn = (MSG_CALLBACK)MakeProcInstance( (FARPROC)MyErrorRtn, hInst ); // Initialisierung von DBTools ret = DBToolsInit( &info ); if( ret != EXIT_OKAY ) { // DLL-Initialisierung fehlgeschlagen } // einige DBTools-Routinen aufrufen. . . // DBTools dll bereinigen DBToolsFini( &info );

Siehe auch

"DBToolsFini-Funktion" auf Seite 330 "a_dbtools_info-Struktur" auf Seite 349 331

DBTools-Funktionen

DBToolsVersion-Funktion
Funktion Prototyp Rckgabewert Anwendung

Gibt die Versionsnummer der DBTools-Bibliothek zurck.


short DBToolsVersion ( void );

Eine Ganzzahl (short integer), die die Versionsnummer der DBToolsBibliothek angibt Verwenden Sie die Funktion DBToolsVersion, um zu berprfen, dass die DBTools-Bibliothek nicht lter ist als diejenige, mit der Ihre Anwendung entwickelt wurde. Anwendungen knnen mit neueren Versionen von DBTools laufen, nicht aber mit lteren Versionen. "Versionsnummern und Kompatibilitt" auf Seite 318

Siehe auch

DBTranslateLog-Funktion
Funktion Prototyp Parameter

bersetzt eine Transaktionslogdatei in SQL. Diese Funktion wird von dem Dienstprogramm dbtran benutzt.
short DBTranslateLog ( const a_translate_log * Zu_bersetzendes_Log ); Parameter Zu_bersetzendes_Log Beschreibung Zeiger auf eine "a_translate_log-Struktur" auf Seite 357

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Logkonvertierungs-Dienstprogramm finden Sie


unter "Das Logkonvertierungs-Dienstprogramm" auf Seite 543 der Dokumentation ASA Datenbankadministration.

Siehe auch

"a_translate_log-Struktur" auf Seite 357

DBTruncateLog-Funktion
Funktion Prototyp Parameter

Krzt eine Transaktionslogdatei. Diese Funktion wird von dem Dienstprogramm dbbackup benutzt.
short DBTruncateLog ( const a_truncate_log * Zu_krzendes_Log ); Parameter Zu_krzendes_Log Beschreibung Zeiger auf eine "a_truncate_log-Struktur" auf Seite 358

332

Kapitel 8 Die DBTools-Schnittstelle

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes 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

Entldt eine Datenbank. Diese Funktion wird von dem Dienstprogramm dbunload wie auch von dem Dienstprogramm dbxtract fr SQL Remote benutzt.
short DBUnload ( const an_unload_db * Zu_entladende_DB ); Parameter Zu_entladende_DB Beschreibung Zeiger auf eine "an_unload_db-Struktur" auf Seite 359

Prototyp Parameter

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.

$ Informationen ber das Entladungs-Dienstprogramm finden Sie unter


"Das Dienstprogramm UNLOAD zum Entladen der Datenbank" auf Seite 572 der Dokumentation ASA Datenbankadministration.

Siehe auch

"an_unload_db-Struktur" auf Seite 359

DBUpgrade-Funktion
Funktion Prototyp Parameter

Installiert ein Upgrade fr eine Datenbankdatei. Diese Funktion wird von dem Dienstprogramm dbupgrade benutzt.
short DBUpgrade ( const an_upgrade_db * DB_fr_Upgrade ); Parameter DB_fr_Upgrade Beschreibung Zeiger auf eine "an_upgrade_db-Struktur" auf Seite 361

Rckgabewert

Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. 333

DBTools-Funktionen

Anwendung

$ Informationen ber das Upgrade-Dienstprogramm finden Sie unter


"Das Upgrade-Dienstprogramm" auf Seite 582 der Dokumentation ASA Datenbankadministration.

Siehe auch

"an_upgrade_db-Struktur" auf Seite 361

DBValidate-Funktion
Funktion Prototyp Parameter

Validiert eine Datenbank oder Teile einer Datenbank. Diese Funktion wird von dem Dienstprogramm dbvalid benutzt.
short DBValidate ( const a_validate_db * Zu_validierende_DB ); Parameter Zu_validierende_DB Beschreibung Zeiger auf eine "a_validate_db-Struktur" auf Seite 363

Rckgabewert Anwendung

Ein Rckgabecode wie in "Rckgabecodes 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

Kapitel 8 Die DBTools-Schnittstelle

DBTools-Strukturen
In diesem Abschnitt sind die Strukturen aufgefhrt, mit deren Hilfe Informationen mit der DBTools-Bibliothek ausgetauscht werden. Die Strukturen sind alphabetisch aufgefhrt. Viele der Strukturelemente entsprechen Befehlszeilenoptionen des entsprechenden Dienstprogramms. Einige Strukturen zum Beispiel haben ein Element namens "quiet", das mit den Werten 0 oder 1 belegt sein kann. Dieses Element entspricht der Befehlszeilenoption (-q) des Vorgangs "quiet", der von vielen Dienstprogrammen benutzt wird.

a_backup_db-Struktur
Funktion Syntax

Enthlt die Informationen, die gebraucht werden, um Sicherungsaufgaben mit der DBTools-Bibliothek auszufhren.
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; version; output_dir; connectparms; startline; confirmrtn; errorrtn; msgrtn; statusrtn; backup_database: 1; backup_logfile : 1; backup_writefile : 1; no_confirm : 1; quiet : 1; rename_log : 1; truncate_log : 1; rename_local_log: 1; hotlog_filename; backup_interrupted;

335

DBTools-Strukturen

Parameter

Mitglied Version output_dir connectparms

Beschreibung DBTools-Versionsnummer Suchpfad des Ausgabeverzeichnisses. Zum Beispiel:


"c:\backup"

Parameter fr die Verbindung zur Datenbank. Sie haben die Form von Zeichenfolgen, zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\asa\asademo.db"

$ Alle Zeichenfolgen fr die Verbindung finden Sie


unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. Das folgende Beispiel zeigt eine Startzeile:
"c:\asa\win32\dbeng8.exe"

Die standardmige Startzeile wird benutzt, wenn dieses Element NULL ist. 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 fr die Besttigung einer Aktion Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Callback-Routine fr die Behandlung einer Statusmeldung Datenbankdatei sichern (1) oder nicht (0) Transaktionslogdatei sichern (1) oder nicht (0) Datenbank-Write-Datei sichern (1) oder nicht (0), falls eine Datenbank-Write-Datei benutzt wird Mit (0) oder ohne (1) Besttigung arbeiten Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Transaktionslog umbenennen Transaktionslog lschen Lokale Sicherung des Transaktionslogs umbenennen Dateiname fr die gerade benutzte Sicherungsdatei Gibt an, dass der Vorgang unterbrochen wurde

"DBBackup-Funktion" auf Seite 323 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

336

Kapitel 8 Die DBTools-Schnittstelle

a_change_log-Struktur
Funktion Syntax

Enthlt die Informationen, die gebraucht werden, um dblog-Aufgaben mit der DBTools-Bibliothek auszufhren.
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; Mitglied version dbname logname errorrtn msgrtn query_only quiet mirrorname_present change_mirrorname change_logname version; dbname; logname; errorrtn; msgrtn; query_only : 1; quiet : 1; mirrorname_present change_mirrorname change_logname ignore_ltm_trunc : 1; ignore_remote_trunc set_generation_number ignore_dbsync_trunc : 1; mirrorname; generation_number; key_file; zap_current_offset; sap_starting_offset; encryption_key;

: 1; : 1; : 1; : 1; : 1;

Parameter

Beschreibung DBTools-Versionsnummer Datenbankdateiname Name der Transaktionslogdatei. Wenn dieser Wert gleich NULL gesetzt wird, gibt es kein Log Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Name des Transaktionslogs anzeigen. 0: nderung des Lognamens erlauben Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Auf 1 setzen; zeigt an, dass die DBTools-Version neu genug ist, um das Feld mirrorname zu untersttzen nderung des Namens der Logspiegeldatei erlauben nderung des Transaktionslognamens erlauben.

337

DBTools-Strukturen
Mitglied ignore_ltm_trunc Beschreibung Wird der Log Transfer Manager verwandt, wird die gleiche Funktion wie mit Funktion dbcc settrunc( ltm, 'gen_id', n ) des Replication Server ausgefhrt:

$ Weitere Informationen finden Sie in der


Dokumentation zum Replication Server. ignore_remote_trunc Fr SQL Remote. Setzt den Ausgangspunkt fr die Option DELETE_OLD_LOGS zurck, der es erlaubt, ein Transaktionslog zu lschen, wenn es nicht lnger gebraucht wird. Wird - falls der Log Transfer Manager benutzt wird nach der Wiederherstellung einer Sicherung verwendet, um die Generierungsnummer zu setzen. Wenn dbmlsync verwendet wird, wird hiermit der Ausgangspunkt fr die Option DELETE_OLD_LOGS zurckgesetzt, mit dem ein Transaktionslog gelscht werden kann, wenn es nicht mehr gebraucht wird. Der neue Name des Transaktionslogspiegels Die neue Generationsnummer. Wird zusammen mit set_generation_number benutzt. Eine Datei mit dem Chiffrierschlssel Aktuellen Ausgangspunkt auf den angegebenen Wert ndern. Dies ist nur fr das Zurcksetzen eines Transaktionslogs nach Entladen und Aktualisieren zur Abstimmung mit den Einstellungen fr dbremote oder dbmlsync vorgesehen. Ausgangspunkt auf den angegebenen Wert ndern. Dies ist nur fr das Zurcksetzen eines Transaktionslogs nach Entladen und Aktualisieren zur Abstimmung mit den Einstellungen fr dbremote oder dbmlsync vorgesehen. Der Chiffrierschlssel fr die Datenbankdatei.

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.

338

Kapitel 8 Die DBTools-Schnittstelle

a_compress_db-Struktur
Funktion

Enthlt die Informationen, die gebraucht werden, um Datenbank-Komprimierungsaufgaben mit der DBTools-Bibliothek auszufhren.
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; Mitglied version dbname compress_name errorrtn msgrtn statusrtn display_free_pages quiet version; dbname; compress_name; errorrtn; msgrtn; statusrtn; display_free_pages quiet record_unchanged stats; confirmrtn; noconfirm encryption_key

Syntax

: 1; : 1; : 1;

: 1;

Parameter

Beschreibung DBTools-Versionsnummer Name der zu komprimierenden Datenbank Dateiname der komprimierten Datenbank Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Callback-Routine fr die Behandlung einer Statusmeldung Informationen ber freie Seiten anzeigen Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0)

339

DBTools-Strukturen
Mitglied record_unchanged Beschreibung Auf 1 gesetzt. Zeigt an, dass die Struktur a_compress_stats neu genug ist, um das Element unchanged zu haben Zeiger auf eine Struktur vom Typ a_compress_stats. Wird belegt, wenn das Element nicht NULL ist und wenn display_free_pages nicht 0 (Null) ist Callback-Routine fr die Besttigung einer Aktion Mit (0) oder ohne (1) Besttigung arbeiten Der Chiffrierschlssel fr die Datenbankdatei.

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_compress_stats-Struktur
Funktion Syntax

Enthlt statistische Informationen ber komprimierte Datenbankdateien.


typedef struct a_compress_stats { a_stats_line tables; a_stats_line indices; a_stats_line other; a_stats_line free; a_stats_line total; a_sql_int32 free_pages; a_sql_int32 unchanged; } a_compress_stats; Mitglied tables Indices Other Free Total free_pages Unchanged Beschreibung Enthlt Information zur Komprimierung von Tabellen Enthlt Information zur Komprimierung von Indizes Enthlt weitere Information zur Komprimierung Enthlt Informationen ber freien Speicherplatz Enthlt allgemeine Information zur Komprimierung Enthlt Informationen ber freie Seiten Anzahl der Seiten, die der Komprimierungsalgorithmus nicht schrumpfen konnte

Parameter

340

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

Enthlt die Informationen, die gebraucht werden, um eine Datenbank mit der DBTools-Bibliothek zu erstellen.
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; version; dbname; logname; startline; page_size; default_collation; errorrtn; msgrtn; database_version; verbose; blank_pad respect_case encrypt debug dbo_avail mirrorname_present avoid_view_collisions collation_id; dbo_username; mirrorname; encryption_dllname; java_classes : 1; jconnect : 1; data_store_type encryption_key; encryption_algorithm; jdK_version;

: 2; : 1; : 1; : 1; : 1; : 1; : 1;

341

DBTools-Strukturen

Parameter

Mitglied version dbname logname startline

Beschreibung DBTools-Versionsnummer Datenbankdateiname Neuer Transaktionslogname Befehlszeile zum Starten der Datenbank-Engine. Das folgende Beispiel zeigt eine Startzeile:
"c:\asa\win32\dbeng8.exe"

Die standardmige Startzeile wird benutzt, wenn dieses Element NULL ist. page_size default_collation errorrtn msgrtn database_version verbose blank_pad respect_case Die Seitengre der Datenbank Die Kollatierung fr die Datenbank Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Die Versionsnummer der Datenbank Im ausfhrlichen Darstellungsmodus ausfhren Leerzeichen in Zeichenfolgevergleichen beachten und entsprechende Indexinformationen speichern Gro/Kleinschreibung in Zeichenfolgevergleichen beachten und entsprechende Indexinformationen speichern Datenbank verschlsseln Reserviert Auf 1 gesetzt. Der Benutzer dbo ist in dieser Datenbank verfgbar. Auf 1 setzen; zeigt an, dass die DBTools-Version neu genug ist, um das Feld mirrorname zu untersttzen Die Erzeugung der Watcom SQL-KompatibilittsAnsichten SYS.SYSCOLUMNS und SYS.SYSINDEXES vermeiden Kollatierungsname (identifier) Nicht mehr benutzt: auf NULL gesetzt Name des Transaktionslogspiegels Die zum Verschlsseln der Datenbank verwendete DLL. Fr Java aktivierte Datenbank erstellen

encrypt debug dbo_avail mirrorname_present avoid_view_collisions

collation_id dbo_username mirrorname encryption_dllname java_classes

342

Kapitel 8 Die DBTools-Schnittstelle


Mitglied jconnect data_store_type encryption_key encryption_algorithm jdk_version Siehe auch Beschreibung Fr jConnect erforderliche Systemprozeduren einbeziehen Reserviert NULL benutzen Der Chiffrierschlssel fr die Datenbankdatei. AESoder MDSR eingeben. Einer der Werte fr die Option dbinit -jdk.

"DBCreate-Funktion" auf Seite 325 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316 .

a_crypt_db-Struktur
Funktion Syntax

Enthlt die Informationen, die zum Verschlsseln einer Datenbankdatei verwendet werden, die auch das dbinit-Dienstprogramm benutzt.
typedef struct a_crypt_db { const char _fd_ * dbname; const char _fd_ * dllname; MSG_CALLBACK errorrtn; MSG_CALLBACK msgrtn; MSG_CALLBACK statusrtn; char verbose; a_bit_field quiet : 1; a_bit_field debug : 1; } a_crypt_db; Mitglied dbname dllname errorrtn msgrtn statusrtn verbose quiet debug Beschreibung Datenbankdateiname Der Name der DLL, die fr die Ausfhrung der Verschlsselung verwendet wird Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Callback-Routine fr die Behandlung einer Statusmeldung Im ausfhrlichen Darstellungsmodus ausfhren Ohne Nachrichten arbeiten Reserviert

Parameter

343

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

Enthlt die Informationen, die gebraucht werden, um mit der DBToolsBibliothek eine Kollatierungssequenz aus der Datenbank zu extrahieren.
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; Mitglied version connectparms version; connectparms; startline; collation_label; filename; confirmrtn; errorrtn; msgrtn; include_empty hex_for_extended replace quiet input_filename; mapping_filename;

: 1; : 1; : 1; : 1;

Parameter

Beschreibung DBTools-Versionsnummer Parameter fr die Verbindung zur Datenbank. Sie haben die Form von Zeichenfolgen, zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\asa\asademo.db"

$ Alle Zeichenfolgen fr die Verbindung finden Sie


unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. Das folgende Beispiel zeigt eine Startzeile:
"c:\asa\win32\dbeng8.exe"

Die standardmige Startzeile wird benutzt, wenn dieses Element NULL ist. confirmrtn errorrtn msgrtn Callback-Routine fr die Besttigung einer Aktion Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht

344

Kapitel 8 Die DBTools-Schnittstelle


Mitglied include_empty hex_for_extended replace quiet input_filename mapping_filename Siehe auch Beschreibung Leere Zuordnungen fr Lcken in der Kollatierungssequenz schreiben Zweiziffrige Hexadezimalzahlen benutzen, um high-valueZeichen zu reprsentieren Ohne Besttigungsaktionen 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.

a_db_info-Struktur
Funktion

Enthlt die Informationen, die gebraucht werden, um dbinfo-Informationen mit der DBTools-Bibliothek zurckzugeben.

345

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; Mitglied version errortrn dbname dbbufsize dbnamebuffer logbufsize lognamebuffer wrtbufsize wrtnamebuffer

version; errorrtn; dbname; dbbufsize; dbnamebuffer; logbufsize; lognamebuffer; wrtbufsize; wrtnamebuffer; quiet : 1; mirrorname_present : 1; sysinfo; free_pages; compressed : 1; connectparms; startline; msgrtn; statusrtn; page_usage : 1; totals; file_size; unused_pages; other_pages; mirrorbufsize; mirrornamebuffer; unused_field; collationnamebuffer; collationnamebufsize; classesversionbuffer; classesversionbufsize;

Parameter

Beschreibung DBTools-Versionsnummer Callback-Routine fr die Behandlung einer Fehlermeldung Datenbankdateiname Lnge des Elements dbnamebuffer Datenbankdateiname Lnge des Elements lognamebuffer Transaktionslog-Dateiname Lnge des Elements wrtnamebuffer Name der Write-Datei

346

Kapitel 8 Die DBTools-Schnittstelle


Mitglied quiet mirrorname_present sysinfo free_pages compressed connectparms Beschreibung Ohne Besttigungsnachrichten arbeiten Auf 1 setzen; zeigt an, dass die DBTools-Version neu genug ist, um das Feld mirrorname zu untersttzen Zeiger auf eine a_sysinfo-Struktur Anzahl der freien Seiten 1 falls komprimiert, sonst 0 Parameter fr die Verbindung zur Datenbank. Sie haben die Form von Zeichenfolgen, zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\Programme \Sybase\SQL Anywhere 8\asademo.db"

$ Alle Zeichenfolgen fr die Verbindung finden Sie


unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. Das folgende Beispiel zeigt eine Startzeile:
"c:\asa\win32\dbeng8.exe"

Die standardmige Startzeile wird benutzt, wenn dieses Element NULL ist. msgrtn statusrtn page_usage totals file_size unused_pages other_pages mirrorbufsize mirrornamebuffer Callback-Routine fr die Behandlung einer Informationsnachricht Callback-Routine fr die Behandlung einer Statusmeldung 1, um Auskunft zu geben ber Seitennutzungs-Statistiken, sonst 0 Zeiger auf eine a_table_info-Struktur Gre der Datenbankdatei Anzahl der nicht genutzten Seiten Anzahl der Seiten, die weder Tabellen- noch Indexseiten sind Lnge des Elements mirrornamebuffer Name des Transaktionslogspiegels

347

DBTools-Strukturen
Mitglied collationnamebuffer collationnamebufsize key_file classesversionbuffer Beschreibung Name und Bezeichnung der Datenbankkollatierung (Maximum ist 128+1) Lnge des Elements collationnamebuffer Eine Datei mit dem Chiffrierschlssel Die JDK-Version der installierten Java-Klassen, wie z.B. 1.1.3, 1.1.8, 1.3 oder eine leere Zeichenfolge, falls JavaKlassen nicht in der Datenbank installiert sind (die maximale Gre betrgt 10+1) Lnge des Elements classesversionbuffer

classesversionbufsize Siehe auch

"DBInfo-Funktion" auf Seite 327 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

a_dblic_info-Struktur
Funktion Syntax

Enthlt Angaben zu den Lizenzdaten. Sie drfen diese Informationen nur gem Ihrem Lizenzvertrag benutzen.
typedef struct a_dblic_info { unsigned short version; char * exename; char * username; char * compname; char * platform_str; a_sql_int32 nodecount; a_sql_int32 conncount; a_license_type type; MSG_CALLBACK errorrtn; MSG_CALLBACK msgrtn; a_bit_field quiet : 1; a_bit_field query_only : 1; } a_dblic_info; Mitglied version exename username compname platform_str nodecount Beschreibung DBTools-Versionsnummer Name der ausfhrbaren Datei Benutzername fr die Lizenz Name des Unternehmens fr die Lizenz Betriebssystem: WinNT oder NLM oder UNIX Anzahl der Knotenlizenzen.

Parameter

348

Kapitel 8 Die DBTools-Schnittstelle


Mitglied conncount type errorrtn msgrtn quiet query_only Beschreibung Muss 1000000L sein Werte finden Sie unter lictype.h Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Wenn 1, nur die Lizenzinformationen anzeigen. Wenn 0, nderung der Informationen zulassen.

a_dbtools_info-Struktur
Funktion Syntax

Enthlt die Informationen, die gebraucht werden, um die Arbeit mit der DBTools-Bibliothek zu beginnen und zu beenden.
typedef struct a_dbtools_info { MSG_CALLBACK errorrtn; } a_dbtools_info; Mitglied errorrtn Beschreibung Callback-Routine fr 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.

an_erase_db-Struktur
Funktion

Enthlt die Informationen, die gebraucht werden, um eine Datenbank mit der DBTools-Bibliothek zu lschen.

349

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; Mitglied version dbname confirmrtn errorrtn msgrtn quiet erase encryption_key Beschreibung

version; dbname; confirmrtn; errorrtn; msgrtn; quiet : 1; erase : 1; encryption_key;

Parameter

DBTools-Versionsnummer Name der zu lschenden Datenbankdatei Callback-Routine fr die Besttigung einer Aktion Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Ohne Besttigung lschen (1) oder mit Besttigung (0) Der Chiffrierschlssel fr die Datenbankdatei.

Siehe auch

"DBErase-Funktion" auf Seite 327 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

an_expand_db-Struktur
Funktion

Enthlt Informationen, die fr die Datenbankdekomprimierung mit der DBTools-Bibliothek gebraucht werden.

350

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; Mitglied version compress_name dbname errorrtn msgrtn statusrtn quiet confirmrtn noconfirm key_file encryption_key Beschreibung

version; compress_name; dbname; errorrtn; msgrtn; statusrtn; quiet : 1; confirmrtn; noconfirm : 1; key_file; encryption_key;

Parameter

DBTools-Versionsnummer Name der komprimierten Datenbankdatei Datenbankdateiname Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Callback-Routine fr die Behandlung einer Statusmeldung Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Callback-Routine fr die Besttigung einer Aktion Mit (0) oder ohne (1) Besttigung arbeiten Eine Datei mit dem Chiffrierschlssel Der Chiffrierschlssel fr die Datenbankdatei.

Siehe auch

"DBExpand-Funktion" auf Seite 327 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

a_name-Struktur
Funktion

Enthlt eine verkettete Liste von Namen. Wird von anderen Strukturen benutzt, die Namenslisten erfordern.

351

DBTools-Strukturen

Syntax

typedef struct a_name { struct a_name * next; char name[1]; } a_name, * p_name; 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

Enthlt Informationen, welche fr die Komprimierung und Dekomprimierung der Datenbank mit der DBTools-Bibliothek gebraucht werden.
typedef struct a_stats_line { long pages; long bytes; long compressed_bytes; } a_stats_line; Mitglied Pages Bytes Compressed_bytes Beschreibung Anzahl der Seiten Anzahl der Bytes fr die nicht komprimierte Datenbank Anzahl der Bytes fr die komprimierte Datenbank

Syntax

Parameter

Siehe auch

"a_compress_stats-Struktur" auf Seite 340

a_sync_db-Struktur
Funktion

Enthlt Informationen, die fr den Gebrauch des Dienstprogramms dbmlsync mit der DBTools-Bibliothek bentigt werden.

352

Kapitel 8 Die DBTools-Schnittstelle

Syntax

typedef struct a_sync_db { unsigned short version; char _fd_ * connectparms; char _fd_ * publication; const char _fd_ * offline_dir; char _fd_ * extended_options; char _fd_ * script_full_path; const char _fd_ * include_scan_range; const char _fd_ * raw_file; MSG_CALLBACK confirmrtn; MSG_CALLBACK errorrtn; MSG_CALLBACK msgrtn; MSG_CALLBACK logrtn;

353

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

354

Kapitel 8 Die DBTools-Schnittstelle


char _fd_ * a_syncpub _fd_ * char _fd_ * char _fd_ * } a_sync_db; Parameter encryption_key; upload_defs; log_file_name; user_name;

Die Parameter entsprechen Funktionen, die ber das Dienstprogramm dbmlsync zugnglich sind. In der Header-Datei dbtools.h finden Sie weitere Kommentare.

$ 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; Parameter Mitglied a_syncpub pub_name next; pub_name; ext_opt; alloced_by_dbsync: 1;

Enthlt Informationen, die fr das Dienstprogramm dbmlsync bentigt werden.

Beschreibung Zeiger auf den nchsten Knoten in der Liste, NULL fr den letzten Knoten Fr diesen n-Parameter angegebene Publikationsnamen. Dies ist die exakte Zeichenfolge nach -n in der Befehlszeile. Erweiterte Optionen, die mit dem Parameter -eu angegeben werden 1 falls die Datenbank verschlsselt ist, 0 (Null) falls nicht FALSE, mit Ausnahme der von dbtool8.dll erstellten Knoten

ext_opt encryption alloced_by_dbsync

355

DBTools-Strukturen

a_sysinfo-Struktur
Funktion

Enthlt Informationen, die fr den Gebrauch der Dienstprogramme dbinfo und dbunload mit der DBTools-Bibliothek bentigt werden.
typedef struct a_sysinfo { a_bit_field a_bit_field a_bit_field a_bit_field char unsigned short } a_sysinfo; valid_data : 1; blank_padding : 1; case_sensitivity : 1; encryption : 1; default_collation[11]; page_size;

Parameter

Mitglied valid_date blank_padding case_sensitivity encryption default_collation page_size

Beschreibung Bit-Feld, das angibt, ob die folgenden Werte gesetzt sind 1 falls Auffllen mit Leerzeichen in der Datenbank benutzt wird, 0 (Null) falls nicht 1 falls die Datenbank Gro/Kleinschreibung beachtet, 0 (Null) falls nicht 1 falls die Datenbank verschlsselt ist, 0 (Null) falls nicht Die Kollatierungssequenz fr die Datenbank Die Seitengre fr die Datenbank

Siehe auch

"a_db_info-Struktur" auf Seite 345

a_table_info-Struktur
Funktion Syntax

Enthlt Informationen ber eine Tabelle, die als Teil der a_db_info-Struktur gebraucht wird.
typedef struct a_table_info { struct a_table_info * next; unsigned short table_id; unsigned long table_pages; unsigned long index_pages; unsigned long table_used; unsigned long index_used; char * table_name; a_sql_uint32 table_used_pct; a_sql_uint32 index_used_pct; } a_table_info;

356

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 Nchste Tabelle in der Liste ID-Nummer fr 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

Enthlt Informationen, die fr die Konvertierung des Transaktionslogs mit der DBTools-Bibliothek gebraucht werden.
typedef struct a_translate_log { unsigned short version; const char * logname; const char * sqlname; p_name userlist; MSG_CALLBACK confirmrtn; MSG_CALLBACK errorrtn; MSG_CALLBACK msgrtn; char userlisttype; a_bit_field remove_rollback : 1; a_bit_field ansi_SQL : 1; a_bit_field since_checkpoint: 1; a_bit_field omit_comments : 1; a_bit_field replace : 1; a_bit_field debug : 1; a_bit_field include_trigger_trans : 1; a_bit_field comment_trigger_trans : 1; unsigned long since_time; const char _fd_ * reserved_1;

357

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; Parameter reserved_2; debug_dump_size; debug_sql_remote : 1; debug_dump_hex : 1; debug_dump_char : 1; debug_page_offsets : 1; reserved_3 : 1; use_hex_offsets : 1; use_relative_offsets : 1; include_audit : 1; chronological_order : 1; force_recovery : 1; include_subsets : 1; force_chaining : 1; recovery_ops; recovery_bytes; include_source_sets; include_destination_sets; include_scan_range; repserver_users; include_tables; include_publications; queueparms; generate_reciprocals :1; match_mode :1; match_pos; statusrtn; encryption_key; show_undo :1; logs_dir;

Die Parameter entsprechen Funktionen, die ber das Dienstprogramm dbtran zugnglich sind. In der Header-Datei dbtools.h finden Sie weitere Kommentare.

Siehe auch

"DBTranslateLog-Funktion" auf Seite 332 "a_name-Struktur" auf Seite 351 "dbtran_userlist_type-Aufzhlungstyp" auf Seite 368 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

a_truncate_log-Struktur
Funktion

Enthlt Informationen, die fr das Krzen des Transaktionslogs mit der DBTools-Bibliothek gebraucht werden.

358

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; Mitglied version connectparms

version; connectparms; startline; errorrtn; msgrtn; quiet : 1; truncate_interrupted;

Parameter

Beschreibung DBTools-Versionsnummer Parameter fr die Verbindung zur Datenbank. Sie haben die Form von Zeichenfolgen, zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\asa\asademo.db"

$ Alle Zeichenfolgen fr die Verbindung finden Sie


unter "Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. Das folgende Beispiel zeigt eine Startzeile:
"c:\asa\win32\dbeng8.exe"

Die standardmige Startzeile wird benutzt, wenn dieses Element NULL ist. errorrtn msgrtn quiet truncate_interrupted Siehe auch Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Gibt an, dass der Vorgang unterbrochen wurde

"DBTruncateLog-Funktion" auf Seite 332 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

an_unload_db-Struktur
Funktion

Enthlt die Informationen, die gebraucht werden, um eine Datenbank mit der DBTools-Bibliothek zu entladen oder um eine entfernte Datenbank fr SQL Remote zu extrahieren. Die Felder, die vom SQL RemoteExtraktionsdienstprogramm dbxtract benutzt werden, sind gekennzeichnet.

359

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; connectparms; startline; temp_dir; reload_filename; errorrtn; msgrtn; statusrtn; confirmrtn; unload_type; verbose; unordered : 1; no_confirm : 1; use_internal_unload : 1; dbo_avail : 1; extract : 1; table_list_provided : 1; exclude_tables : 1; more_flag_bits_present : 1; sysinfo; remote_dir; dbo_username; subscriber_username; publisher_address_type; publisher_address; isolation_level; start_subscriptions : 1; exclude_foreign_keys : 1; exclude_procedures : 1; exclude_triggers : 1; exclude_views : 1; isolation_set : 1; include_where_subscribe : 1; debug : 1; table_list; escape_char_present : 1; view_iterations_present : 1; view_iterations;

360

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; reload_connectparms; reload_db_filename; output_connections:1; unload_interrupted; replace_db:1; locale; site_name; template_name; preserve_ids:1; exclude_hooks:1; reload_db_logname; encryption_key; encryption_algorithm; syntax_version_7:1; remove_java:1;

Die Parameter entsprechen Funktionen, die ber die Dienstprogramme dbunload und dbxtract und mlxtract zugnglich sind. In der Header-Datei dbtools.h finden Sie weitere Kommentare.

Siehe auch

"DBUnload-Funktion" auf Seite 333 "a_name-Struktur" auf Seite 351 "dbunload-Aufzhlungstyp" auf Seite 368 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

an_upgrade_db-Struktur
Funktion

Enthlt die Informationen, die gebraucht werden, um eine Datenbank mit der DBTools-Bibliothek zu aktualisieren.

361

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; Mitglied version connectparms Beschreibung

version; connectparms; startline; errorrtn; msgrtn; statusrtn; quiet : 1; dbo_avail : 1; dbo_username; java_classes : 1; jconnect : 1; remove_java : 1; java_switch_specified : 1; jdk_version;

Parameter

DBTools-Versionsnummer Parameter fr die Verbindung zur Datenbank. Sie haben die Form von Zeichenfolgen, zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\asa\asademo.db"

$ Alle Zeichenfolgen fr die Verbindung finden Sie unter


"Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. Das folgende Beispiel zeigt eine Startzeile:
"c:\asa\win32\dbeng8.exe"

Die standardmige Startzeile wird benutzt, wenn dieses Element NULL ist. errorrtn msgrtn statusrtn quiet dbo_avail Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Callback-Routine fr die Behandlung einer Statusmeldung Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Auf 1 gesetzt. Zeigt an, dass die DBTools-Version neu genug ist, um das Feld dbo_mirrorname zu untersttzen

362

Kapitel 8 Die DBTools-Schnittstelle


Mitglied dbo_username java_classes jconnect remove_java jdk_version Siehe auch Beschreibung Der fr den dbo zu benutzende Name Datenbank umstellen, sodass sie Java enthlt Datenbank umstellen, sodass sie jConnect-Prozeduren akzeptiert Datenbank umstellen, sodass die Java-Funktionen entfernt werden Einer der Werte fr die Option dbinit -jdk

"DBUpgrade-Funktion" auf Seite 333 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.

a_validate_db-Struktur
Funktion Syntax

Enthlt Informationen, die fr Datenbankvalidierung mit der DBToolsBibliothek gebraucht werden.


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; connectparms; startline; tables; errorrtn; msgrtn; statusrtn; quiet : 1; index : 1; type;

363

DBTools-Strukturen

Parameter

Mitglied version connectparms

Beschreibung DBTools-Versionsnummer Parameter fr die Verbindung zur Datenbank. Sie haben die Form von Zeichenfolgen, zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\asa\asademo.db"

$ Alle Zeichenfolgen fr die Verbindung finden Sie unter


"Verbindungsparameter" auf Seite 78 der Dokumentation ASA Datenbankadministration startline Befehlszeile zum Starten der Datenbank-Engine. Das folgende Beispiel zeigt eine Startzeile:
"c:\Programme\Sybase\SA\win32\dbeng8.exe"

Die standardmige Startzeile wird benutzt, wenn dieses Element NULL ist. tables errorrtn msgrtn statusrtn quiet index type Zeiger auf eine verknpfte Liste mit Tabellennamen Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Callback-Routine fr die Behandlung einer Statusmeldung Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Indizes validieren Weitere Hinweise unter "a_validate_type-Aufzhlungstyp" 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.

a_writefile-Struktur
Funktion

Enthlt Informationen, die fr die Verwaltung der Datenbank-Write-Datei mit der DBTools-Bibliothek gebraucht werden.

364

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; Mitglied version writename wlogname dbname forcename confirmrtn errorrtn msgrtn action quiet erase

version; writename; wlogname; dbname; forcename; confirmrtn; errorrtn; msgrtn; action; quiet : 1; erase : 1; force : 1; mirrorname_present : 1; wlogmirrorname; make_log_and_mirror_names: 1; encryption_key;

Parameter

Beschreibung DBTools-Versionsnummer Name der Write-Datei Wird nur fr die Erstellung von Write-Dateien benutzt Wird zum ndern und Erstellen von Write-Dateien benutzt Erzwungene Referenz auf einen Dateinamen Callback-Routine fr die Besttigung einer Aktion. Wird nur fr die Erstellung einer Write-Datei benutzt Callback-Routine fr die Behandlung einer Fehlermeldung Callback-Routine fr die Behandlung einer Informationsnachricht Reserviert fr Sybase Ohne die Ausgabe von Nachrichten arbeiten (1) oder Nachrichten ausgeben (0) Wird nur fr die Erstellung von Write-Dateien benutzt. Ohne Besttigung lschen (1) oder mit Besttigung (0)

365

DBTools-Strukturen
Mitglied force mirrorname_present Beschreibung Falls 1, Write-Datei zwingend auf die angegebene Datei zeigen lassen Wird nur fr die Erstellung von Write-Dateien benutzt. Auf 1 setzen; zeigt an, dass die DBTools-Version neu genug ist, um das Feld mirrorname zu untersttzen Name des Transaktionslogspiegels Wenn auf TRUE, verwenden Sie die Werte in wlogname und wlogmirrorname benutzt zum Festlegen der Dateinamen. Der Chiffrierschlssel fr die Datenbankdatei.

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.

366

Kapitel 8 Die DBTools-Schnittstelle

DBTools-Aufzhlungstypen
Dieser Abschnitt fhrt die Aufzhlungstypen auf, die von der DBToolsBibliothek benutzt werden. Die Aufzhlungstypen sind alphabetisch aufgefhrt.

Verbosity (Ausfhrlichkeit)
Funktion Syntax

Gibt die Ausfhrlichkeit der Ausgabe an.


enum { VB_QUIET, VB_NORMAL, VB_VERBOSE }; Wert VB_QUIET VB_NORMAL VB_VERBOSE Beschreibung Keine Ausgabe Normale Ausgabemenge Ausgabe ausfhrlich darstellen, ntzlich fr die Fehlersuche

Parameter

Siehe auch

"a_create_db-Struktur" auf Seite 341 "an_unload_db-Struktur" auf Seite 359

Auffllen mit Leerzeichen


Funktion Syntax

Wird in der Struktur "a_create_db" (siehe "a_create_db-Struktur" auf Seite 341) benutzt, um den Wert von blank_pad anzugeben.
enum { NO_BLANK_PADDING, BLANK_PADDING }; Wert NO_BLANK_PADDING BLANK_PADDING Beschreibung Benutzt kein Auffllen mit Leerzeichen Benutzt Auffllen mit Leerzeichen

Parameter

Siehe auch

"a_create_db-Struktur" auf Seite 341 367

DBTools-Aufzhlungstypen

dbtran_userlist_type-Aufzhlungstyp
Funktion Syntax

Typ einer Benutzerliste, wie er unter "a_translate_log-Struktur" auf Seite 357 beschrieben ist.
typedef enum dbtran_userlist_type { DBTRAN_INCLUDE_ALL, DBTRAN_INCLUDE_SOME, DBTRAN_EXCLUDE_SOME } dbtran_userlist_type; Wert DBTRAN_INCLUDE_ALL DBTRAN_INCLUDE_SOME DBTRAN_EXCLUDE_SOME Beschreibung Alle Benutzervorgnge einschliessen Nur Vorgnge der in der Benutzerliste aufgefhrten Benutzer einschliessen Vorgnge der in der Benutzerliste aufgefhrten Benutzer ausschliessen

Parameter

Siehe auch

"a_translate_log-Struktur" auf Seite 357

dbunload-Aufzhlungstyp
Funktion Syntax

Der Entladungstyp, der von der Struktur "an_unload-db" (siehe "an_unload_db-Struktur" auf Seite 359) benutzt wird.
enum { UNLOAD_ALL, UNLOAD_DATA_ONLY, UNLOAD_NO_DATA }; Wert UNLOAD_ALL UNLOAD_DATA_ONLY UNLOAD_NO_DATA Beschreibung Sowohl Daten wie auch Schema entladen Daten entladen Schema nicht entladen. Nur Schema entladen

Parameter

Siehe auch

"an_unload_db-Struktur" auf Seite 359

368

Kapitel 8 Die DBTools-Schnittstelle

a_validate_type-Aufzhlungstyp
Funktion Syntax

Der ausgefhrte Validierungstyp gem "a_validate_db-Struktur" auf Seite 363.


typedef enum { VALIDATE_NORMAL = 0, VALIDATE_DATA, VALIDATE_INDEX, VALIDATE_EXPRESS, VALIDATE_FULL } a_validate_type; Wert VALIDATE_NORMAL VALIDATE_DATA VALIDATE_INDEX VALIDATE_EXPRESS VALIDATE_FULL Beschreibung Nur mit der Standardprfung validieren Zustzlich zur Standardprfung mit der Datenprfung validieren Zustzlich zur Standardprfung mit der Indexprfung validieren Zustzlich zur Standard- und Datenprfung mit der Expressprfung validieren Zustzlich zur Standardprfung mit der Daten- und Indexprfung 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

DBTools-Aufzhlungstypen

370

K A P I T E L

Die OLE DB- und ADOProgrammierschnittstellen

ber dieses Kapitel

In diesem Kapitel wird beschrieben, wie Sie die OLE DB-Schnittstelle zu Adaptive Server Anywhere verwenden. Viele Anwendungen, welche die OLE DB-Schnittstelle verwenden, tun dies nicht direkt, sondern ber das Microsoft ActiveX-Datenobjekt (ADO)Programmierungsmodell. In diesem Kapitel wird auch die ADOProgrammierung mit Adaptive Server Anywhere beschrieben.

Inhalt
Thema Einfhrung zu OLE DB ADO-Programmierung mit Adaptive Server Anywhere Untersttzte OLE DB-Schnittstellen Seite 372 374 382

371

Einfhrung zu OLE DB

Einfhrung zu OLE DB
OLE DB ist ein Datenzugriffsmodell von Microsoft. Es verwendet Component Object Model (COM)-Schnittstellen und, anders als bei ODBC, wird hier nicht vorausgesetzt, dass die Datenquelle einen SQLAbfrageprozessor verwendet. Adaptive Server Anywhere enthlt einen OLE DB-Provider namens ASAProv. Dieser Provider steht fr aktuelle Windows- sowie fr Windows CE-Plattformen zur Verfgung. Sie knnen auf Adaptive Server Anywhere auch ber den Microsoft OLE DB Provider fr ODBC (MSDASQL) zusammen mit dem ODBC-Treiber von Adaptive Server Anywhere zugreifen. Die Verwendung des OLE DB-Providers von Adaptive Server Anywhere bietet mehrere Vorteile: Einige Funktionen, wie z.B. die Aktualisierung ber einen Cursor, sind bei Verwendung der OLE DB/ODBC Brcke nicht verfgbar. Wenn Sie Adaptive Server Anywhere OLE DB-Provider verwenden, ist ODBC fr Ihre Entwicklung nicht erforderlich. Mit MSDASQL knnen OLE DB-Clients mit jedem ODBC-Treiber arbeiten, wobei jedoch nicht garantiert wird, dass Sie smtliche Funktionen jedes ODBC-Treibers nutzen knnen. Wenn Sie Adaptive Server Anywhere-Provider verwenden, haben Sie Zugriff auf smtliche Adaptive Server Anywhere-Funktionen aus OLE DBProgrammierumgebungen.

Untersttzte Plattformen
Der Adaptive Server Anywhere OLE DB-Provider wurde so entwickelt, dass er mit OLE DB 2.5 und hher arbeitet. Fr Windows CE und Nachfolger wurde der OLE DB-Provider fr ADOCE 3.0 und hher entwickelt. ADOCE ist der Microsoft ADO fr Windows CE SDK und bietet Datenbankfunktionen fr Anwendungen, die mit den Windows CE Toolkits fr Visual Basic 5.0 und Visual Basic 6.0 entwickelt wurden.

$ Eine Liste der untersttzten Plattformen finden Sie unter


"Betriebssystemversionen" auf Seite 150 der Dokumentation SQL Anywhere Studio Erste Orientierung.

372

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen

Verteilte Transaktionen
Der OLE DB-Treiber kann in einer Umgebung mit verteilten Transaktionen als Ressourcen-Manager eingesetzt werden.

$ Weitere Hinweise finden Sie unter "Dreischichtige Datenverarbeitung


und verteilte Transaktionen" auf Seite 399.

373

ADO-Programmierung mit Adaptive Server Anywhere

ADO-Programmierung mit Adaptive Server Anywhere


Bei ADO (ActiveX-Datenobjekte) handelt es sich um ein Datenzugriffsmodell, das ber eine Automationsschnittstelle zugnglich wird, die es Clientanwendungen ermglicht, die Methoden und Eigenschaften von Objekten in Laufzeit zu erfassen, ohne das Objekt vorher zu kennen. Mit Hilfe von Automation knnen Skriptsprachen wie Visual Basic ein Standardmodell fr Datenzugriffsobjekte verwenden. ADO verwendet OLE DB, um den Datenzugriff bereitzustellen. Wenn Sie den Adaptive Server Anywhere OLE DB-Provider verwenden, haben Sie aus einer ADO-Programmierungsumgebung Zugriff auf smtliche Adaptive Server Anywhere-Funktionen. In diesem Abschnitt wird beschrieben, wie grundlegende Aufgaben whrend der Verwendung von ADO aus Visual Basic ausgefhrt werden. Er stellt keine vollstndige Anleitung zur Programmierung mit ADO dar. Codebeispiele aus diesem Abschnitt finden Sie in den folgenden Dateien:
Entwicklungs-Tool Microsoft Visual Basic 6.0 Microsoft eMbedded Visual Basic 3.0 Beispiel

Samples\ASA\VBSampler\vbsampler.vbp Samples\ASA\ADOCE\OLEDB_PocketPC.ebp

$ Weitere Hinweise zur Programmierung in ADO finden Sie im


Handbuch Ihres Entwicklungstools.

$ Detaillierte Erluterungen zur Verwendung von ADO und Visual


Basic, um auf Daten in einer Adaptive Server Anywhere-Datenbank zuzugreifen, finden Sie im Whitepaper "Accessing Data in Adaptive Server Anywhere Using ADO and Visual Basic" unter http://www.sybase.com/detail?id=1017429.

Eine Datenbank mit einem Verbindungsobjekt verbinden


In diesem Abschnitt wird eine einfache Visual Basic-Routine beschrieben, die eine Verbindung zu einer Datenbank herstellt.

374

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen

Beispielcode

Sie knnen diese Routine ausprobieren, indem Sie eine Befehlsschaltflche namens Command1 in einer Maske platzieren und die Routine in ihr ClickEreignis einfgen. Fhren Sie das Programm aus und klicken Sie auf die Schaltflche, um eine Verbindung herzustellen und trennen Sie die Verbindung dann.
Private Sub cmdTestConnection_Click() Variable deklarieren Dim myConn As New ADODB.Connection Dim myCommand As New ADODB.Command Dim cAffected As Long On Error GoTo HandleError Verbindung herstellen myConn.Provider = "ASAProv" myConn.ConnectionString = _ "Data Source=ASA 8.0 Sample" myConn.Open MsgBox "Verbindung erfolgreich" myConn.Close Exit Sub HandleError: MsgBox "Verbindung nicht erfolgreich" Exit Sub End Sub

Hinweise

Das Beispiel fhrt die folgenden Aufgaben aus: Es deklariert die Variablen, die in der Routine verwendet werden. Es stellt mit Hilfe des OLE DB-Providers von Adaptive Server Anywhere eine Verbindung zur Beispieldatenbank her. Es verwendet ein Befehlsobjekt zur Ausfhrung einer einfachen Anweisung, die eine Meldung im Fenster des Datenbankservers anzeigt. Es beendet die Verbindung.

Wenn der ASAProv-Provider installiert ist, registriert er sich selbst. Der Registriervorgang umfasst auch die Registriereintrge in dem Abschnitt COM der Registry, sodass ADO die Position der DLL ermitteln kann, wenn der ASAProv-Provider aufgerufen wird. Wenn Sie den Speicherort Ihrer DLL ndern, mssen Sie sie neu registrieren.
v So registrieren Sie den OLE DB-Provider:

ffnen Sie eine Befehlszeile.

375

ADO-Programmierung mit Adaptive Server Anywhere


2 3 Wechseln Sie zu dem Verzeichnis, in dem der OLE DB-Provider installiert ist. Geben Sie den folgenden Befehl ein, um den Provider zu registrieren:
regsvr32 dboledb8.dll

$ Weitere Hinweise, wie Sie mit OLE DB eine Verbindung zu einer


Datenbank herstellen, finden Sie unter "Verbinden mit einer Datenbank ber OLE DB" auf Seite 75 der Dokumentation ASA Datenbankadministration.

Anweisungen mit dem Befehlsobjekt ausfhren


In diesem Abschnitt wird eine einfache Routine beschrieben, die eine einfache SQL-Anweisung an die Datenbank sendet. Beispielcode Sie knnen diese Routine ausprobieren, indem Sie eine Befehlsschaltflche namens Command2 in einer Maske platzieren und die Routine in ihr ClickEreignis einfgen. Fhren Sie das Programm aus und klicken Sie auf die Schaltflche, um eine Verbindung herzustellen, eine Meldung im Fenster des Datenbankservers anzuzeigen, und trennen Sie die Verbindung dann.
Private Sub cmdUpdate_Click() Variable deklarieren Dim myConn As New ADODB.Connection Dim myCommand As New ADODB.Command Dim cAffected As Long Verbindung herstellen myConn.Provider = "ASAProv" myConn.ConnectionString = _ "Data Source=ASA 8.0 Sample" myConn.Open 'Befehl ausfhren myCommand.CommandText = _ "update customer set fname='Liz' where id=102" Set myCommand.ActiveConnection = myConn myCommand.Execute cAffected MsgBox CStr(cAffected) + " rows affected.", vbInformation myConn.Close End Sub

Hinweise

Nachdem eine Verbindung hergestellt wurde, erstellt der Beispielcode ein Befehlsobjekt und stellt die Eigenschaft CommandText auf eine UpdateAnweisung und die Eigenschaft ActiveConnection auf die aktuelle Verbindung ein. Dann fhrt er die Update-Anweisung aus und zeigt die Anzahl der von der Aktualisierung betroffenen Zeilen in einem Meldungsfeld an.

376

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen


In diesem Beispiel wird die Aktualisierung an die Datenbank gesendet und festgeschrieben, sobald sie ausgefhrt wurde.

$ Weitere Hinweise zur Verwendung von Transaktionen in ADO finden


Sie unter "Transaktionen verwenden" auf Seite 381. Sie knnen Aktualisierungen auch ber einen Cursor ausfhren.

$ Weitere Hinweise finden Sie unter "Daten mit einem Cursor


aktualisieren" auf Seite 379.

Datenbank mit dem Recordset-Objekt abfragen


Das ADO-Recordset-Objekt stellt die Ergebnismenge einer Abfrage dar. Sie knnen es benutzen, um Daten aus einer Datenbank anzuzeigen. Beispielcode Sie knnen diese Routine ausprobieren, indem Sie eine Befehlsschaltflche mit dem Namen cmdQuery in ein Formular einfgen und die Routine in ihr Click-Ereignis einfgen. Fhren Sie das Programm aus und klicken Sie auf die Schaltflche, um eine Verbindung herzustellen, eine Meldung im Fenster des Datenbankservers anzuzeigen, eine Abfrage auszufhren und die ersten Zeilen in Meldungsfeldern anzuzeigen. Danach trennen Sie die Verbindung.

377

ADO-Programmierung mit Adaptive Server Anywhere


Private Sub cmdQuery_Click() Variable deklarieren Dim myConn As New ADODB.Connection Dim myCommand As New ADODB.Command Dim myRS As New ADODB.Recordset On Error GoTo ErrorHandler: Verbindung herstellen myConn.Provider = "ASAProv" myConn.ConnectionString = _ "Data Source=ASA 8.0 Sample" myConn.CursorLocation = adUseServer myConn.Mode = adModeReadWrite myConn.IsolationLevel = adXactCursorStability myConn.Open 'Eine Abfrage ausfhren Set myRS = New Recordset myRS.CacheSize = 50 myRS.Source = "Select * from customer" myRS.ActiveConnection = myConn myRS.CursorType = adOpenKeyset myRS.LockType = adLockOptimistic myRS.Open 'Durch die ersten Ergebnisse blttern myRS.MoveFirst For i = 1 To 5 MsgBox myRS.Fields("company_name"), vbInformation myRS.MoveNext Next myRS.Close myConn.Close Exit Sub ErrorHandler: MsgBox Error(Err) Exit Sub End Sub

Hinweise

Das Recordset-Objekt in diesem Beispiel enthlt die Ergebnisse aus einer Abfrage der Tabelle Kunden. Die Schleife For blttert durch die ersten Zeilen und zeigt den Wert company_name fr jede Zeile an. Hierbei handelt es sich um ein einfaches Beispiel fr die Verwendung eines Cursors aus ADO.

$ Weiterfhrende Beispiele fr die Verwendung eines Cursors aus ADO


finden Sie unter "Mit dem Recordset-Objekt arbeiten" auf Seite 379.

378

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen

Mit dem Recordset-Objekt arbeiten


Bei der Arbeit mit Adaptive Server Anywhere stellt die ADO Recordset einen Cursor dar. Sie knnen den Cursortyp auswhlen, indem Sie eine CursorType-Eigenschaft des Recordset-Objekts deklarieren, bevor Sie das Recordset ffnen. Die Auswahl des Cursortyps beeinflusst die Aktionen, die Sie am Recordset vornehmen knnen und hat Auswirkungen auf die Performance. Cursortypen Die von Adaptive Server Anywhere untersttzten Cursortypen werden in "Cursoreigenschaften" auf Seite 26 beschrieben. ADO hat seine eigene Namenskonvention fr Cursortypen. Die verfgbaren Cursortypen, die entsprechenden Cursortypenkonstanten und die Adaptive Server Anywhere-Typen, denen sie entsprechen, sind hier aufgelistet:
ADO-Cursortyp Dynamischer Cursor SchlsselgruppenCursor Statischer Cursor Vorwrts-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 fr Ihre Anwendung geeigneten


Cursortyps finden Sie unter "Cursortypen auswhlen" auf Seite 26. Beispielcode Der folgende Code legt den Cursortyp fr ein ADO Recordset-Objekt fest:
Dim myRS As New ADODB.Recordset myRS.CursorType = adOpenDynamic

Daten mit einem Cursor aktualisieren


Mit dem Adaptive Server Anywhere OLE DB-Provider knnen Sie eine Ergebnismenge ber einen Cursor aktualisieren. Diese Funktion ist ber den MSDASQL-Provider nicht verfgbar. Recordsets aktualisieren Sie knnen die Datenbank ber einen Recordset aktualisieren.
Private Dim Dim Dim Sub Command6_Click() myConn As New ADODB.Connection myRS As New ADODB.Recordset SQLString As String

379

ADO-Programmierung mit Adaptive Server Anywhere


Verbindung herstellen myConn.Provider = "ASAProv" myConn.ConnectionString = _ "Data Source=ASA 8.0 Sample" myConn.Open myConn.BeginTrans SQLString = "Select * from customer" myRS.Open SQLString, _ myConn, adOpenDynamic, adLockBatchOptimistic If myRS.BOF And myRS.EOF Then MsgBox "Recordset ist leer!", _ 16, "Leeres Recordset" Else MsgBox "Cursor-Typ: " + _ CStr(myRS.CursorType), vbInformation myRS.MoveFirst For i = 1 To 3 MsgBox "Zeile: " + CStr(myRS.Fields("id")), _ vbInformation If i = 2 Then myRS.Update "City", "Toronto" myRS.UpdateBatch End If myRS.MoveNext Next i myRS.MovePrevious myRS.Close End If myConn.CommitTrans myConn.Close End Sub

Hinweise

Wenn Sie die Einstellung adLockBatchOptimistic fr das Recordset verwenden, werden bei der myRS.Update-Methode keine nderungen an der Datenbank selbst vorgenommen. Statt dessen wird eine lokale Kopie des Recordsets aktualisiert. Die myRS.UpdateBatch-Methode nimmt die Aktualisierung am Datenbankserver vor, schreibt sie jedoch nicht fest, da sie sich innerhalb einer Transaktion befindet. Wenn eine UpdateBatch-Methode von auerhalb einer Transaktion aufgerufen wurde, werden die nderungen festgeschrieben. Die Methode myConn.CommitTrans schreibt die nderungen fest. Das Recordset-Objekt wurde zwischenzeitlich geschlossen, sodass das Problem, ob die lokale Kopie der Daten gendert wurde oder nicht, nicht mehr besteht.

380

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen

Transaktionen verwenden
Standardmig werden smtliche nderungen, die Sie mit ADO an der Datenbank vornehmen, festgeschrieben, sobald sie ausgefhrt werden. Hierzu gehren auch explizite Aktualisierungen und die UpdateBatchMethode fr einen Recordset. Im vorherigen Abschnitt wurde jedoch gezeigt, dass Sie die Methoden BeginTrans und RollbackTrans oder CommitTrans auf das Connection-Objekt anwenden knnen, um Transaktionen zu benutzen. Die Transaktions-Isolationsstufe wird als eine Eigenschaft des Verbindungsobjekts festgelegt. Die Eigenschaft IsolationLevel kann einen der folgenden Werte annehmen:
ADO-Isolationsstufe Unbekannt (Unspecified) Chaos Durchsuchen (Browse) Nicht festgeschriebene Lesevorgnge (Read uncommitted) Cursorstabilitt (Cursor stability) Festgeschriebene Lesevorgnge (Read committed) Wiederholbare Lesevorgnge (reatable read) Isoliert (Isolated) Serialisierbar (Serializable) Konstante adXactUnspecified adXactChaos adXactBrowse adXactReadUncommitted ASA-Stufe Nicht anwendbar. Auf 0 setzen Nicht untersttzt. Auf 0 setzen 0 0

adXactCursorStability adXactReadCommitted

1 1

adXactRepeatableRead

adXactIsolated adXactSerializable

3 3

$ Weitere Hinweise zu Isolationsstufen finden Sie unter "Isolationsstufen


und Konsistenz" auf Seite 105 der Dokumentation ASA SQLBenutzerhandbuch.

381

Untersttzte OLE DB-Schnittstellen

Untersttzte OLE DB-Schnittstellen


Die OLE DB API besteht aus einer Reihe von Schnittstellen. In der folgenden Tabelle wird die Untersttzung fr jede Schnittstelle im OLE DBTreiber von Adaptive Server Anywhere beschrieben.
Schnittstelle IAccessor Verwendung Bindungen zwischen Clientspeicher- und Datenspeicherwerten definieren Einschrnkungen DBACCESSOR_PA SSBYREF nicht untersttzt DBACCESSOR_OP TIMIZED nicht untersttzt Nicht untersttzt

IAlterIndex IAlterTable IChapteredRowset

Tabellen, 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 ausfhren

Nicht untersttzt Adaptive Server Anywhere unterstzt segmentierte Zeilengruppen nicht. Nicht fr CE

IColumnsInfo

IColumnsRowset

Nicht fr CE

ICommand

Untersttzt keinen Aufruf ICommandPropertie s GetProperties mit DBPROPSET_PRO PERTIESINERROR um Eigenschaften zu finden, die nicht gesetzt werden konnten.

382

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen


Schnittstelle ICommandPersist Verwendung Zustand eines Befehlsobjekts (jedoch nicht jede aktive Zeilengruppe) aufrechterhalten. Diese bestndigen Befehlsobjekte knnen nachfolgend mit der Zeilengruppe PROCEDURES oder VIEWS nummeriert werden. Befehle vorbereiten. Zeilengruppeneigenschaften fr von einem Befehl erstellte Zeilengruppen festlegen. Hufig verwendet, um die Schnittstellen anzugeben, welche die Zeilengruppe untersttzen sollen SQL-Befehlstext fr Icommand festlegen Einschrnkungen Nicht fr CE

ICommandPrepare ICommandProperties

Nicht fr CE Untersttzt

ICommandText

Nur der SQLDialekt DBGUID_DEFAUL T wird untersttzt Nicht fr Parameter untersttzt, die als Vektoren skalarer Werte gespeichert werden Keine Untersttzung fr BLOBParameter Nicht fr CE

IcommandWithParameters

Parameterinformationen fr einen Befehl festlegen und beziehen

IConvertType

Untersttzt Fr CE eingeschrnkte Untersttzung

383

Untersttzte OLE DB-Schnittstellen


Schnittstelle IDBAsynchNotify IDBAsyncStatus Verwendung Asynchrone Verarbeitung Client ber Ereignisse in der asynchronen Verarbeitung bei der Initialisierung von Datenquellen, dem Anfllen von Zeilengruppen, usw. informieren Befehle aus einer Sitzung erstellen Eine Sitzung aus einem Datenquellenobjekt erstellen. Datenquellenobjekte, bei denen es sich um COMObjekte handelt, die von Clients untersttzt werden, erstellen/zerstren/ndern. Diese Schnittstelle wird nicht fr die Verwaltung von Datenspeichern (Datenbanken) verwendet. Informationen ber Schlsselwrter suchen, die fr diesen Provider eindeutig sind (d.h. Schlsselwrter die nicht dem Standard-SQL entsprechen) Auerdem Informationen zu Literalen, d.h. Sonderzeichen, die in textlich bereinstimmenden Abfragen verwendet werden, und andere LiteralInformationen suchen IDBInitialize IDBProperties Datenquellenobjekte und Aufzhler initialisieren. Eigenschaften fr ein Datenquellenobjekt oder einen Aufzhler verwalten Nicht fr CE Nicht fr CE Untersttzt Untersttzt Einschrnkungen Nicht untersttzt

IDBCreateCommand IDBCreateSession

IDBDataSourceAdmin

Nicht untersttzt

IDBInfo

Nicht fr CE

384

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen


Schnittstelle IDBSchemaRowset Verwendung Informationen zu Systemtabellen in einer Standardmaske (einer Zeilengruppe) beziehen. Untersttzung von ActiveX-Fehler-Objekten Einschrnkungen Nicht fr CE

IErrorInfo IErrorLookup IErrorRecords IGetDataSource

Nicht fr CE

Gibt einen Schnittstellenzeiger auf das Datenquellenobjekt einer Sitzung zurck Indizes im Datenspeicher erstellen oder lschen Mehrere Ergebnisse (Zeilengruppen oder Zeilenzhlungen) aus einem Befehl abrufen Auf eine Datenbanktabelle mit ihrem Namen, nicht mit SQL zugreifen

Untersttzt

IIndexDefinition IMultipleResults

Nicht untersttzt Untersttzt

IOpenRowset

Untersttzt ffnen einer Tabelle mit ihrem Namen, nicht ber einen GUID, wird untersttzt Nicht untersttzt

IParentRowset

Auf segmentierte/hierarchische Zeilengruppen zugreifen Auf Zeilengruppen zugreifen nderungen an Zeilengruppendaten zulassen, die im Datenspeicher reflektiert werden InsertRow/SetData fr Blobs nocht nicht implementiert

IRowset IRowsetChange

Untersttzt Nicht fr CE

IRowsetChapterMember

Auf segmentierte/hierarchische Zeilengruppen zugreifen Index fr eine Zeilengruppe dynamisch ndern

Nicht untersttzt

IRowsetCurrentIndex

Nicht untersttzt

385

Untersttzte OLE DB-Schnittstellen


Schnittstelle IRowsetFind Verwendung Eine Zeile innerhalb einer Zeilengruppe, die mit einem spezifischen Wert bereinstimmt, finden Zeilen-Handles vergleichen Auf Datenbankindizes zugreifen Informationen zu einer Zeilengruppeneigenschaft suchen oder das Objekt suchen, das die Zeilengruppe erstellt hat Position in Zeilen einer Zeilengruppe, unter Verwendung von Bookmarks Bietet eine COM-CallbackSchnittstelle fr Zeilengruppen-Ereignisse Den neuesten Wert fr Daten beziehen, der fr eine Transaktion sichtbar ist Alte OLEDB 1.xSchnittstelle, von IRowsetRefresh abgelst Durch Zeilengruppe blttern, um Zeilendaten abzurufen nderungen an Zeilengruppendaten verzgern, bis Update aufgerufen wurde Ansichten fr eine vorhandene Zeilengruppe verwenden Eine Blob-Spalte abrufen Einschrnkungen Nicht untersttzt

IRowsetIdentity IRowsetIndex IRowsetInfo

Nicht untersttzt Nicht untersttzt Nicht fr CE

IRowsetLocate

Nicht fr CE

IRowsetNotify

Untersttzt

IRowsetRefresh

Nicht untersttzt

IRowsetResynch

Nicht untersttzt

IRowsetScroll

Nicht untersttzt

IRowsetUpdate

Untersttzt Nicht fr CE

IRowsetView

Nicht untersttzt

ISequentialStream

Nur fr Lesen untersttzt Keine Untersttzung von SetData mit dieser Schnittstelle Nicht fr CE

386

Kapitel 9 Die OLE DB- und ADO-Programmierschnittstellen


Schnittstelle ISessionProperties Verwendung Informationen zu Sitzungseigenschaften beziehen Eine Zeilengruppe von Datenquellenobjekten und Aufzhlern beziehen Untersttzung von ActiveX-Fehler-Objekten Einschrnkungen Untersttzt

ISourcesRowset

Nicht fr CE

ISQLErrorInfo ISupportErrorInfo

Optional fr CE

ITableDefinition ItableDefinitionWithConstraints ITransaction

Tabellen mit Integrittsregeln erstellen, lschen und ndern Transaktionen festschreiben oder abbrechen

Nicht fr CE

Nicht alle Kennzeichnungen werden untersttzt Nicht fr CE

ITransactionJoin

Verteilte Transaktionen werden untersttzt

Nicht alle Kennzeichnungen werden untersttzt Nicht fr CE

ITransactionLocal

Transaktionen fr eine Sitzung werden abgewickelt Nicht alle Kennzeichnungen werden untersttzt

Nicht fr CE

387

Untersttzte OLE DB-Schnittstellen


Schnittstelle ITransactionOptions Verwendung Optionen fr eine Transaktion beziehen oder einstellen Mit Ansichten fr eine vorhandene Zeilengruppe arbeiten, insbesondere um Nachbearbeitungsfilter/sortierungen auf Zeilen anzuwenden Inhalte einer Zeilengruppe werden auf Zeilen, welche eine Reihe von Bedinungen erfllen, beschrnkt Inhalte einer Zeilengruppe werden beim ffnen einer Zeilengruppe auf Zeilen, welche eine Reihe von Bedinungen erfllen, beschrnkt Sortierreihenfolge auf eine Ansicht anwenden Einschrnkungen Nicht fr CE

IviewChapter

Nicht untersttzt

IviewFilter

Nicht untersttzt

IviewRowset

Nicht untersttzt

IviewSort

Nicht untersttzt.

388

K A P I T E L

1 0

Die Open Client-Schnittstelle

ber dieses Kapitel

Dieses Kapitel beschreibt die Open Client-Programmierschnittstelle fr Adaptive Server Anywhere. Die primre Quelle fr Informationen zur Open ClientAnwendungsentwicklung ist die Sybase Open Client-Dokumentation. Dieses Kapitel beschreibt spezifische Funktionen fr Adaptive Server Anywhere; es ist jedoch keine umfassende Anleitung fr die Anwendungsentwicklung mit Open Client.

Inhalt

Thema Was Sie fr die Entwicklung von Open Client-Anwendungen brauchen Datentyp-Zuordnungen SQL in Open Client-Anwendungen verwenden Bekannte Open Client-Einschrnkungen von Adaptive Server Anywhere

Seite 390 391 394 398

389

Was Sie fr die Entwicklung von Open Client-Anwendungen brauchen

Was Sie fr die Entwicklung von Open ClientAnwendungen brauchen


Um Open Client-Anwendungen auszufhren, mssen Sie Open ClientKomponenten auf dem Rechner installieren und konfigurieren, auf dem die Anwendung laufen soll. Diese Komponenten sind eventuell bereits als Teil Ihrer Installation anderer Sybase Produkte vorhanden; andernfalls knnen Sie diese Bibliotheken wahlweise mit Adaptive Server Anywhere entsprechend den Bedingungen Ihres Lizenzvertrags installieren. Open Client-Anwendungen bentigen keine Open Client-Komponenten auf dem Rechner, auf dem der Datenbankserver luft. Um Open Client-Anwendungen zu erstellen, bentigen Sie die Entwicklungsversion von Open Client. Diese ist bei Sybase erhltlich. Standardmig werden Adaptive Server Anywhere-Datenbanken ohne Bercksichtigung von Gro-/Kleinschreibung erstellt, whrend Adaptive Server Enterprise-Datenbanken unter Bercksichtigung von Gro/Kleinschreibung erstellt werden.

$ Weitere Hinweise zur Ausfhrung von Open Client-Anwendungen mit


Adaptive Server Anywhere finden Sie unter "Adaptive Server Anywhere als Open Server" auf Seite 117 der Dokumentation ASA Datenbankadministration.

390

Kapitel 10 Die Open Client-Schnittstelle

Datentyp-Zuordnungen
Open Client hat seine eigenen internen Datentypen, die in einigen Details von den Datentypen abweichen, die in Adaptive Server Anywhere zur Verfgung stehen. Aus diesem Grunde ordnet Adaptive Server Anywhere intern einige Datentypen von Open Client-Anwendungen den in Adaptive Server Anywhere zur Verfgung stehenden Datentypen zu. Um Open Client Anwendungen zu erstellen, bentigen Sie die Entwicklungsversion von Open Client. Um Open Client-Anwendungen zu verwenden, mssen die Open Client Laufzeitprogramme auf dem Computer installiert und konfiguriert sein, auf dem die Anwendung laufen soll. Der Adaptive Server Anywhere Server bentigt zur Untersttzung von Open Client-Anwendungen keine externe Kommunikations-Laufzeit. Jeder Open Client-Datentyp wird dem entsprechenden Adaptive Server Anywhere-Datentyp zugeordnet. Es werden alle Open Client-Datentypen untersttzt. Adaptive Server AnywhereDatentypen ohne direkte Entsprechung in Open Client Die folgende Tabelle zeigt die Zuordnung von Datentypen, die in Adaptive Server Anywhere untersttzt werden, und die keine direkte Entsprechung in Open Client haben.
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

Datentyp-Zuordnungen

Wertebereichseinschrnkungen bei der Zuordnung von Datentypen


Einige Datentypen haben in Adaptive Server Anywhere andere Wertebereiche als in Open Client. In solchen Fllen kann es zu berlauffehlern whrend der Abfrage oder des Einfgens von Daten kommen. Die folgende Tabelle zeigt Open Client-Anwendungsdatentypen, die zwar Adaptive Server Anywhere-Datentypen zugeordnet werden knnen, aber nur mit einigen Einschrnkungen im Wertebereich mglicher Werte. In den meisten Fllen wird der Open Client-Datentyp einem Adaptive Server Anywhere-Datentyp zugeordnet, der einen greren Bereich mglicher Werte hat. Deshalb ist es mglich, einen Wert an Adaptive Server Anywhere zu bergeben, der zwar akzeptiert und in einer Datenbank gespeichert wird, der aber zu gro ist, um von einer Open Client-Anwendung abgerufen zu werden.
Datentyp MONEY SMALLMONEY DATETIME SMALLDATETIME Untere Open Client-Grenze 922 377 203 685 477.5808 214 748.3648 1. Januar 1753 1. Januar 1900 Obere Open Client-Grenze 922 377 203 685 477.5807 214 748.3647 31. Dezember 9999 Juni 2079 Untere ASAGrenze 1e15 + 0.0001 214 748.3648 1. Januar 0001 1. Mrz 1600 Obere ASAGrenze 1e15 0.0001 214 748.3647 31. Dez. 9999 31. Dez. 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. Daher kann in einer Spalte in Adaptive Server Anywhere ein Wert enthalten sein, der die Grenzwerte des Open Client Datentyps MONEY berschreitet. Ruft der Client einen solchen unzulssigen Wert mit Adaptive Server Anywhere ab, wird eine Fehlermeldung erzeugt. Die Implementierung des Open Client-Datentyps TIMESTAMP in Adaptive Server Anywhere unterscheidet sich von der Implementierung in Adaptive Server Enterprise. In Adaptive Server Anywhere wird der Wert auf dem Adaptive Server Anywhere-Datentyp DATETIME zugeordnet. Der voreingestellte Wert ist NULL in Adaptive Server Anywhere, der Wert kann also uneindeutig sein. Im Gegensatz dazu stellt Adaptive Server Enterprise sicher, dass der Wert gleichfrmig steigt und somit immer eindeutig ist.

Zeitstempel

392

Kapitel 10 Die Open Client-Schnittstelle


Der Adaptive Server Anywhere Datentyp TIMESTAMP umfasst Jahr, Monat, Tag, Stunde, Minute, Sekunde und Sekundenbruchteile. Auerdem hat der Datentyp DATETIME einen greren Wertebereich als die Open Client-Datentypen, die von Adaptive Server Anywhere zugeordnet werden.

393

SQL in Open Client-Anwendungen verwenden

SQL in Open Client-Anwendungen verwenden


Dieser Abschnitt bietet eine kurze Einfhrung in die Verwendung von SQL in Open Client-Anwendungen, mit einem Schwerpunkt auf Themen, die fr Adaptive Server Anywhere spezifisch sind.

$ Eine Einfhrung in die Konzepte finden Sie unter "SQL in


Anwendungen verwenden" auf Seite 9. Eine vollstndige Beschreibung finden Sie in Ihrer Open Client-Dokumentation.

SQL Anweisungen ausfhren


Sie senden SQL Anweisungen an eine Datenbank, indem Sie sie in die Client Library Funktionsaufrufe einschlieen. Die folgenden beiden Aufrufe fhren zum Beispiel eine DELETE-Anweisung aus:
ret = ct_command(cmd, CS_LANG_CMD, "DELETE FROM employee WHERE emp_id=105" CS_NULLTERM, CS_UNUSED); ret = ct_send(cmd);

Die Funktion ct_command wird fr viele verschiedene Zwecke eingesetzt.

Vorbereitete Anweisungen verwenden


Die Funktion ct_dynamic wird fr die Verwaltung von vorbereiteten Anweisungen benutzt. Diese Funktion bernimmt den type-Parameter, der die Aktion beschreibt, die Sie ausfhren.
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. Setzen Sie die Anweisungsparameter mit ct_param. Fhren Sie die Anweisung mit ct_dynamic mit CS_EXECUTE als type-Parameter aus. Geben Sie die mit der Anweisung verbundenen Ressourcen frei, indem Sie ct_dynamic mit einem CS_DEALLOC-type-Parameter verwenden.

394

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 verwenden
Die Funktion ct_cursor wird fr die Verwaltung von Cursorn verwendet. Diese Funktion bernimmt den type-Parameter, der die Aktion beschreibt, die Sie ausfhren. Untersttzte Cursortypen Einige der Cursortypen, die Adaptive Server Anywhere untersttzt, stehen in der Open Client Schnittstelle nicht zur Verfgung. Sie knnen ber Open Client weder Scroll-Cursor, noch dynamische Scroll-Cursor, noch unempfindliche Cursor benutzen. Eindeutigkeit und Aktualisierbarkeit sind zwei Eigenschaften von Cursorn. Cursor knnen eindeutig sein (unabhngig davon, ob sie von der Anwendung benutzt wird oder nicht, hat jede Zeile einen Primrschlssel oder eine Eindeutigkeitsinformation) oder nicht eindeutig sein. Cursor knnen schreibgeschtzt oder aktualisierbar sein. Ist ein Cursor aktualisierbar und nicht eindeutig, kann die Performance leiden, da in diesem Fall keine Zeilen vorab abgerufen werden knnen. Dies ist unabhngig von der CS_CURSOR_ROWS-Belegung (siehe unten). 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. Embedded SQL bereitet zuerst eine Anweisung vor, dann wird der Cursor mit Hilfe des Statement-Handles deklariert.
v Cursor in Open Client verwenden:

1 2

Um einen Cursor in Open Client zu deklarieren, verwenden Sie ct_cursor mit CS_CURSOR_DECLARE als type-Parameter. Nachdem Sie einen Cursor deklariert haben, knnen Sie steuern, wie viele Zeilen vorab vom Client abgerufen werden, und zwar jedesmal wenn eine Zeile mit ct_cursor mit CS_CURSOR_ROWS als typeParameter vom Server abgerufen wird. Vorab abgerufene Zeilen clientseitig zu speichern, reduziert die Anzahl der Serveraufrufe. Dies verbessert sowohl den Gesamtdurchsatz als auch die Fertigstellungszeit. Vorab abgerufene Zeilen werden nicht sofort an die Anwendung bergeben, sondern werden verwendungsbereit in einem clientseitigen Puffer zwischengespeichert.

395

SQL in Open Client-Anwendungen verwenden


Die Einstellung der Datenbankoption PREFETCH steuert den PrefetchVorgang fr andere Schnittstellen. Sie wird von Open Client Verbindungen nicht beachtet. Die Einstellung CS_CURSOR_ROWS wird bei nicht eindeutigen, aktualisierbaren Cursorn nicht beachtet. 3 4 5 6 Um einen Cursor in Open Client zu ffnen, verwenden Sie ct_cursor mit CS_CURSOR_OPEN als type-Parameter. Um eine Zeile in der Anwendung abzurufen, verwenden Sie jeweils ct_fetch. Um einen Cursor zu schlieen, verwenden Sie ct_cursor mit CS_CURSOR_CLOSE. In Open Client mssen Sie auerdem die Ressourcen freigeben, die an den Cursor gebunden waren. Verwenden Sie dafr ct_cursor mit CS_CURSOR_DEALLOC. Sie knnen auch CS_CURSOR_CLOSE mit dem zustzlichen Parameter CS_DEALLOC benutzen, um diese Vorgnge in einem Schritt auszufhren.

Zeilen mit einen Cursor ndern


Mit Open Client knnen Sie Zeilen in einem Cursor lschen oder aktualisieren, sofern der Cursor fr eine einzelne Tabelle gilt. Der Benutzer muss die Berechtigung zur Aktualisierung der Tabelle haben und der Cursor muss fr Aktualisierung markiert sein.
v Zeilen durch einen Cursor verndern:

Statt einen Abruf durchzufhren, knnen Sie die aktuelle Zeile im Cursor mit ct_cursor und CS_CURSOR_DELETE lschen oder mit ct_cursor und CS_CURSOR_UPDATE aktualisieren.

Sie knnen in Open Client-Anwendungen mit einem Cursor keine Zeilen einfgen.

Abfrageergebnisse in Open Client beschreiben


Open Client geht mit Ergebnismengen anders um als andere Adaptive Server Anywhere-Schnittstellen. In Embedded SQL und ODBC beschreiben Sie eine Abfrage oder eine gespeicherte Prozedur, um die richtige Anzahl und Typen der Variablen zu setzen, die die Ergebnisse aufnehmen sollen. Die Beschreibung wird in der Anweisung selbst gegeben.

396

Kapitel 10 Die Open Client-Schnittstelle


In Open Client brauchen Sie eine Anweisung nicht zu beschreiben. Statt dessen kann jede Zeile, die vom Server zurckgegeben wird, eine Beschreibung Ihrer Inhalte enthalten. Falls Sie ct_command und ct_send verwenden, um Anweisungen auszufhren, knnen Sie die Funktion ct_results benutzen, um mit allen Aspekten der zurckgegebenen Zeilen umzugehen. Falls Sie nicht nach dieser Zeile-fr-Zeile-Methode vorgehen wollen, knnen Sie ct_dynamic verwenden, um eine SQL Anweisung vorzubereiten und ct_describe, um die Ergebnismenge zu beschreiben. Dies entspricht mehr dem Beschreiben von SQL Anweisungen bei anderen Schnittstellen.

397

Bekannte Open Client-Einschrnkungen von Adaptive Server Anywhere

Bekannte Open Client-Einschrnkungen von Adaptive Server Anywhere


Mit der Open Client-Schnittstelle knnen Sie eine Adaptive Server Anywhere-Datenbank weitgehend wie eine Adaptive Server EnterpriseDatenbank verwenden. Es gibt allerdings einige Einschrnkungen, unter anderem folgende:
Commit Service Adaptive Server Anywhere untersttzt Adaptive Server Enterprise Commit Service nicht. Funktionen Die Funktionen einer Client/Server-Verbindung bestimmen,

welche Clientanforderungen und Serverantworten fr diese Verbindung zulssig sind. Folgende Funktionen werden nicht untersttzt: 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, wie SSL und verschlsselte Kennwrter, werden nicht untersttzt. Open Client-Anwendungen knnen ber TCP/IP oder, wenn verfgbar, ber das Named Pipes-Protokoll des lokalen Systems eine Verbindung zu Adaptive Server Anywhere herstellen.

$ Weitere Hinweise zu Funktionen finden Sie in der Dokumentation


Open Server Server-Library C Reference Manual (in englischer Sprache).

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 knnen 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 fr 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 Untersttzung fr verteilte Transaktionen, die vom DTC-Service kontrolliert werden, sodass Sie Adaptive Server Anywhere mit einem dieser Anwendungsserver oder einem anderen DTC-basierten Produkt verwenden knnen. Wenn Sie Adaptive Server Anywhere in eine dreischichtige Umgebung integrieren, muss der Groteil der Arbeit vom Anwendungsserver erledigt werden. Dieses Kapitel ist eine Einfhrung 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 fr 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 Verfgung. 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 auerhalb der Datenbank selbst keine Transaktionslogik bentigt. 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 Vorgngen in kleinsten Einheiten ausgefhrt werden. Viele Transaktionsserver, einschlielich Sybase EAServer, verwenden den Microsoft Distributed Transaction Coordinator (DTC), um den Clientanwendungen Transaktionsdienste anzubieten. DTC verwendet OLETransaktionen, die ihrerseits das Protokoll Zwei-Phasen-Commit fr die Koordinierung von Transaktionen mit mehreren Ressourcen-Managern verwenden. Um die in diesem Kapitel beschriebenen Funktionen verwenden zu knnen, mssen 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 knnen. Auerdem knnen 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, knnen Anwendungskomponenten mit Ressourcen-Verteilern kommunizieren, die ihrerseits Verbindungen oder Verbindungs-Pools zu den RessourcenManagern verwalten. Adaptive Server Anywhere untersttzt 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 fhren 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 knnen, wird die gesamte Arbeit der Transaktion ber alle RessourcenManager zurckgesetzt.

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 Verfgung 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 Vorgnge mit den Daten, fr 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 bentigt, 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 ausgefhrt werden kann, und um DTC ggf. auf seinen Transaktionsstatus hinzuweisen. Auf jedem System muss ein DTC-Dienst laufen, damit die verteilten Transaktionen ausgefhrt werden knnen. DTC-Dienste knnen vom Symbol "Dienste" in der Windows-Systemsteuerung aus kontrolliert werden. Der DTC-Dienst heit 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 gewhrleistet, dass keine implizite Transaktionsverwaltung ausgefhrt 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 whrend der verteilten Transaktionen deaktiviert. Ein explizites COMMIT oder ROLLBACK von der Anwendung direkt an Adaptive Server Anywhere anstatt ber den Transaktionskoordinator fhrt 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 Vorgnge geben.

DTC-Isolationsstufen
DTC weist eine Reihe von Isolationsstufen auf, die der Anwendungsserver angibt. Diese Isolationsstufen entsprechen folgendermaen 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, whrend nicht festgeschriebene Vorgnge auf Ausfhrung warten, mssen diese Vorgnge beim Neustart entweder zurckgesetzt oder festgeschrieben werden, damit die atomare Natur der Transaktion geschtzt wird. Wenn whrend der Wiederherstellung nicht festgeschriebene Vorgnge einer verteilten Transaktion gefunden werden, versucht der Datenbankserver eine Verbindung mit DTC herzustellen und fordert, wieder in die auf Ausfhrung wartenden bzw. in die zweifelhaften Transaktionen einbezogen zu werden. Wenn die Wiedereinbeziehung abgeschlossen ist, weist DTC den Datenbankserver an, die ausstehenden Vorgnge zurckzusetzen oder festzuschreiben. Wenn der Wiedereinbeziehungsvorgang fehlschlgt, kann Adaptive Server Anywhere nicht wissen, ob die zweifelhaften Vorgnge festgeschrieben oder zurckgesetzt werden sollten, und die Wiederherstellung schlgt fehl. Wenn Sie wollen, dass die Datenbank wieder in solch einem Status hergestellt wird, unabhngig vom unsicheren Status der Daten, knnen Sie die Wiederherstellung mit den folgenden Datenbankserveroptionen erzwingen:
-tmf Wenn DTC nicht geladen werden kann, werden die ausstehenden

Vorgnge zurckgesetzt 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 Vorgnge zurckgesetzt 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 spter fr die Arbeit mit Adaptive Server Anywhere zu ergreifenden Manahmen. 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 spter bieten eine Auswahl von Transaktionskoordinatoren. Sie mssen DTC als Transaktionskoordinator verwenden, wenn Sie Adaptive Server Anywhere in die Transaktionen einbeziehen. In diesem Abschnitt wird beschrieben, wie EAServer 3.0 fr die Benutzung von DTC als Transaktionskoordinator konfiguriert wird. Der Komponentenserver in EAServer trgt den Namen Jaguar.
v So wird ein EAServer fr die Verwendung des Microsoft DTC Transaktionsmodells konfiguriert:

Vergewissern Sie sich, dass Ihr Jaguar-Server luft. Unter Windows luft der Jaguar-Server normalerweise als Dienst. Wenn der mit EAServer 3.0 installierte Jaguar-Server manuell gestartet werden soll, whlen Sie StartProgrammeSybaseEAServerEAServer.

Starten Sie den Jaguar Manager. Whlen Sie vom Windows Desktop StartProgrammeSybaseEAServerJaguar Manager.

Stellen Sie vom Jaguar Manager aus eine Verbindung mit dem JaguarServer her. Whlen Sie im Sybase Central-Men ExtrasVerbindenJaguar 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.

Legen Sie das Transaktionsmodell fr 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 whlen Sie "Servereigenschaften" aus dem Men. ffnen Sie das Register "Transaktionen" und whlen Sie Microsoft DTC als Transaktionsmodell. Klicken Sie auf OK, damit der Vorgang abgeschlossen wird.

Komponenten-Transaktionsattribut festlegen
Im EAServer knnen Sie eine Komponente implementieren, die Vorgnge mit mehr als einer Datenbank ausfhrt. Sie weisen dieser Komponente ein Transaktionsattribut zu, das festlegt, wie sie an Transaktionen teilnimmt. Das Transaktionsattribut kann die folgenden Werte annehmen:
Nicht untersttzt Die Methoden der Komponente werden nie als Teil einer Transaktion ausgefhrt. Wird die Komponente von einer anderen Komponente aktiviert, die innerhalb einer Transaktion ausgefhrt wird, dann wird die Arbeit der neuen Instanz auerhalb der vorhandenen Transaktion ausgefhrt. Dies ist die Standardeinstellung. Untersttzt Transaktion Die Komponente kann im Kontext einer

Transaktion ausgefhrt werden, eine Verbindung ist jedoch nicht erforderlich, um die Methoden der Komponente auszufhren. 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 ausgefhrt wird, fhrt das System die Komponente A in derselben Transaktion aus.
Erfordert Transaktion Die Komponente wird immer in einer

Transaktion ausgefhrt. 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 ausgefhrt wird, fhrt das System A innerhalb derselben Transaktion aus, wenn B nicht in einer Transaktion ausgefhrt wird, fhrt 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 ausgefhrt wird, beginnt A einen neue Transaktion, die unabhngig ist vom Ergebnis der Transaktion B, wenn B nicht in einer Transaktion ausgefhrt wird, fhrt das System A in einer neuen Transaktion aus.

408

Kapitel 11 Dreischichtige Datenverarbeitung und verteilte Transaktionen


In der Beispielanwendung Sybase Virtual University, die mit EAServer als SVU-Paket geliefert wird, fhrt die Methode enroll() der Komponente SVUEnrollment zwei separate Vorgnge aus (reserviert einen Platz in einem Kurs, fakturiert den Studenten fr den Kurs). Diese beiden Vorgnge mssen als Einzel-Transaktionen behandelt werden. Microsoft Transaction Server bietet dieselbe Gruppe von Attributwerten.
v So wird das Transaktionsattribut einer Komponente festgelegt:

Ermitteln Sie die Position der Komponente im Jaguar Manager. Wenn Sie die Komponente SVUEnrollment in der JaguarBeispielanwendung suchen wollen, stellen Sie eine Verbindung mit dem Jaguar-Server her, ffnen Sie den Ordner "Pakete" und ffnen Sie das SVU-Paket. Die Komponenten im Paket werden im rechten Fensterausschnitt aufgefhrt.

Legen Sie das Transaktionsattribut fr die gewnschte Komponente fest. Rechtsklicken Sie auf die Komponente und klicken Sie auf "Komponenten-Eigenschaften" im Einblendmen. ffnen Sie das Register "Transaktion" und whlen Sie den Wert fr das Transaktionsattribut aus der Liste. Klicken Sie auf OK, damit der Vorgang abgeschlossen wird. Die Komponente SVUEnrollment ist bereits als "Erfordert Transaktion" markiert.

Wenn das Komponenten-Transaktionsattribut festgelegt ist, knnen Sie Adaptive Server Anywhere-Vorgnge von der Komponente aus ausfhren und sicher sein, dass die Transaktion auf der Ebene ausgefhrt wird, die Sie angegeben haben.

409

EAServer mit Adaptive Server Anywhere verwenden

410

K A P I T E L

1 2

Deployment: Datenbanken und Anwendungen im System bereitstellen

ber dieses Kapitel

In diesem Kapitel wird beschrieben, wie Komponenten von Adaptive Server Anywhere fr die allgemeine Nutzung im System bereitgestellt werden knnen. Beschrieben werden die erforderlichen Dateien fr die Bereitstellung sowie Fragen im Zusammenhang mit der Adressierung und der Einstellung von Verbindungsparametern.
Prfen Sie Ihre Lizenzvereinbarung

Die Weitergabe von Dateien wird durch die Lizenzvereinbarung geregelt. In diesem Kapitel enthaltene Ausfhrungen knnen die Bestimmungen Ihrer Lizenzvereinbarung weder aufheben noch ndern. Bevor Sie daher Anwendungen im System bereitstellen, prfen Sie bitte Ihre Lizenzvereinbarung. Inhalt
Thema Systemeinfhrung - berblick Installationsverzeichnisse und Dateinamen InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden Dialogfreie Installation fr die Systemeinfhrung 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

Systemeinfhrung - berblick

Systemeinfhrung - berblick
Wenn Sie eine Datenbankanwendung fertig gestellt haben, mssen Sie die Anwendung fr Ihre Endbenutzer bereitstellen. Je nach der Art, wie Ihre Anwendung Adaptive Server Anywhere verwendet (als eingebettete Datenbank, im Client-/Servermodus usw.), mssen Sie Komponenten von Adaptive Server Anywhere zusammen mit Ihrer Anwendung bereitstellen. Es kann auerdem erforderlich sein, Konfigurationsdaten bereitzustellen, wie etwa Datenquellennamen, damit die Anwendung mit Adaptive Server Anywhere kommunizieren kann.
Prfen Sie Ihre Lizenzvereinbarung

Die Weitergabe von Dateien wird durch die Lizenzvereinbarung mit Sybase geregelt. In diesem Kapitel enthaltene Ausfhrungen knnen die Bestimmungen Ihrer Lizenzvereinbarung weder aufheben noch ndern. Bevor Sie daher Anwendungen im System bereitstellen, prfen Sie bitte Ihre Lizenzvereinbarung. Folgende Bereiche der Systemeinfhrung werden in diesem Kapitel besprochen: Ermittlung der erforderlichen Dateien je nach Anwendungsplattform und Plattformarchitektur Konfiguration der Clientanwendungen

Eine groer Teil des Kapitels befasst sich mit einzelnen Dateien und wo sie platziert werden mssen. Es wird jedoch empfohlen, Adaptive Server Anywhere-Komponenten unter Verwendung der Installshield-Objekte oder dialogfrei zu installieren. Hinweise finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420 und "Dialogfreie Installation fr die Systemeinfhrung" auf Seite 422.

Modelle fr die Systemeinfhrung


Welche Dateien Sie bei der Systemeinfhrung bereitstellen mssen, hngt vom gewhlten Modell ab. Nachstehend werden einige denkbare Modelle beschrieben:
Clientbereitstellung Sie knnen nur die Clientkomponenten von Adaptive Server Anywhere fr die Endbenutzer bereitstellen, sodass diese sich mit einem zentral untergebrachten Netzwerk-Datenbankserver verbinden knnen.

412

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Netzwerkserver bereitstellen Sie knnen Netzwerkserver in Zweigstellen einrichten und dann Clients fr alle Benutzer in diesen Bros bereitstellen. Eingebettete Datenbanken bereitstellen Sie knnen eine Datenbank bereitstellen, die mit einem Personal Datenbankserver luft. In diesem Fall mssen der Client und der Personal Server auf dem Rechner des Endbenutzers installiert werden. Bereitstellung ber SQL Remote Die Bereitstellung einer SQL Remote-Anwendung ist eine Erweiterung des Modells der Bereitstellung einer eingebetteten Datenbank. DBTools-Bereitstellung Sie knnen Interactive SQL, Sybase Central und andere Tools zur Verwaltung bereitstellen.

Mglichkeiten zur Weitergabe von Dateien


Es gibt zwei Mglichkeiten, Adaptive Server Anywhere fr den allgemeinen Gebrauch verfgbar zu machen:
Sie benutzen das Installationsprogramm von Adaptive Server Anywhere Sie knnen das Setup-Programm den Endbenutzern zur

Verfgung stellen. Wenn der Endbenutzer die richtigen Installationsoptionen whlt, verfgt er garantiert ber alle erforderlichen Dateien. Dies ist die einfachste Lsung fr viele Flle der Systemeinfhrung. In diesem Fall mssen Sie den Endbenutzern nur noch eine Methode zur Verbindungsaufnahme mit dem Datenbankserver bergeben (z.B. eine ODBC-Datenquelle).

$ Weitere Hinweise finden Sie unter "Dialogfreie Installation fr die


Systemeinfhrung" auf Seite 422.
Entwicklung Ihrer eigenen Installation Es kann Grnde dafr geben,

dass Sie ein eigenes Installationsprogramm entwickeln wollen, das Dateien von Adaptive Server Anywhere enthlt. Diese Option ist viel komplizierter, und daher richtet sich der grte Teil dieses Kapitels an jene, die eigene Installationen entwickeln mssen. Wenn Adaptive Server Anywhere bereits passend fr den Servertyp und das Betriebssystem der Clientanwendung installiert wurde, stehen die erforderlichen Dateien in dem entsprechend benannten Unterverzeichnis bereit, das im Installationsverzeichnis von Adaptive Server Anywhere angelegt wurde.

413

Systemeinfhrung - berblick
Wenn beispielsweise das Standard-Installationsverzeichnis gewhlt wurde, enthlt das Unterverzeichnis win32 im Installationsverzeichnis die Dateien, die bentigt werden, um den Server unter WindowsBetriebssystemen zu betreiben. Ebenso knnen Anwender von InstallShield Professional 5.5 und hher die InstallShield-Vorlagenprojekte fr SQL Anywhere Studio verwenden, um ihre eigenen Anwendungen bereitzustellen. Mit dieser Funktion erstellen Sie das Installationsprogramm fr Ihre Anwendung, indem Sie das gesamte Vorlagenprojekt oder nur die fr Ihre Installation relevanten Teile verwenden. Gleichgltig welche Option Sie whlen: Sie mssen sich dabei immer an die Bestimmungen Ihrer Lizenz halten.

414

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Installationsverzeichnisse und Dateinamen


Damit eine im System bereitgestellte Anwendung richtig funktioniert, mssen die Clientbibliotheken ermitteln knnen, wo die erforderlichen Dateien untergebracht sind. Die bereitgestellten Dateien mssen in derselben Struktur gespeichert werden wie in der Installation von Adaptive Server Anywhere. In der Praxis bedeutet das, dass auf einem PC die meisten Dateien in ein einziges Verzeichnis gehren. Unter Windows z.B. werden Dateien fr den Datenbankserver und fr den Client in nur einem Verzeichnis installiert, nmlich dem Unterverzeichnis win32 des Installationsverzeichnisses von Adaptive Server Anywhere.

$ Eine vollstndige Beschreibung der Standorte, an denen die Software


nach Dateien sucht, finden Sie unter "Ermittlung des Dateienstandorts durch Adaptive Server Anywhere" auf Seite 228 der Dokumentation ASA Datenbankadministration.

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 standardmige Stammverzeichnis /usr/lpp/sybase/SYBSsa8 an Stelle von /opt/sybase/SYBSsa8.
Dateierweiterungen In den Tabellen dieses Kapitels werden die gemeinsamen Objekte mit der Erweiterung .so angefhrt. Unter HP-UX lautet diese Erweiterung .sl.

Im Betriebssystem AIX haben gemeinsam genutzte Dateien, mit denen sich Anwendungen verknpfen mssen, die Erweiterung .a.

415

Installationsverzeichnisse und Dateinamen

Symbolische Verknpfungen Jedes gemeinsam genutzte Objekt ist als symbolische Verknpfung zu einer Datei gleichen Namens mit der zustzlichen Erweiterung .1 (eins) installiert. Beispiel: Die Datei libdblib8.so ist eine symbolische Verknpfung zur Datei libdblib8.so.1 in demselben Verzeichnis.

Wenn Korrekturprogramme fr die Installation von Adaptive Server Anywhere erforderlich sind, werden sie mit der Erweiterung .2 geliefert und die symbolische Verknpfung muss umgeleitet werden.
Anwendungen mit und ohne Threads Die meisten gemeinsam

genutzten Objekte werden in zwei Formen geliefert, von denen eine mit den zustzlichen Zeichen _r vor der Dateierweiterung versehen ist. Beispiel: Zustzlich zu libdblib8.so gibt es eine Datei mit der Bezeichnung libdblib8_r.so. In diesem Fall mssen Anwendungen mit Thread mit dem gemeinsam genutzten Objekt _r verknpft werden, Anwendungen ohne Thread hingegen mit dem gemeinsam genutzten Objekt ohne den Zusatz _r.
Zeichensatzkonvertierung Wenn Sie die Zeichensatzkonvertierung des Datenbankservers (Serveroption -ct) benutzen mchten, mssen die folgenden Dateien hinzugefgt werden:

libunic.so Verzeichnisstruktur charsets/ asa.cvf

$ Eine Beschreibung der Standorte, an denen die Software nach Dateien


sucht, finden Sie unter "Ermittlung des Dateienstandorts durch Adaptive Server Anywhere" auf Seite 228 der Dokumentation ASA Datenbankadministration.

Namenskonventionen fr Dateien
Adaptive Server Anywhere benutzt einheitliche Konventionen, damit Sie die Systemkomponenten leichter erkennen und zu Gruppen zusammenfassen knnen. Diese Konventionen sind wie folgt aufgebaut:
Versionsnummer Die Versionsnummer von Adaptive Server Anywhere wird im Dateinamen der Haupt-Serverkomponenten (.exe and .dll Dateien) dargestellt.

Beispiel: Die Datei dbeng8.exe ist eine Programmdatei fr Version 7.

416

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Sprache Die in einer Sprachen-Ressourcebibliothek verwendete

Sprache wird durch einen Sprachcode im Dateinamen angezeigt. Die zwei Zeichen vor der Versionsnummer weisen auf die in der Bibliothek verwendete Sprache hin. Zum Beispiel ist dblgen8.dll die SprachenRessourcebibliothek fr Englisch. Diese Codes aus zwei Buchstaben sind im ISO-Standard 639 festgelegt.

$ Weitere Hinweise zur Sprachenkennzeichnung finden Sie unter


"Nheres zur Sprache der Sprachumgebung" auf Seite 288 der Dokumentation ASA Datenbankadministration. Sie knnen das International Resources Deployment Kit, das DLLs fr die Bereitstellung von Sprachressourcen enthlt, gratis von der Sybase-Website herunterladen.
v So laden Sie das International Resources Deployment Kit von der Sybase-Website herunter:

ffnen Sie im Webbrowser den folgenden URL:


http://www.sybase.com/products/mobilewireless/anywhe re/

2 3 4

Klicken Sie unterhalb der berschrift "SQL Anywhere Studio" links auf der Seite auf "Downloads". Klicken Sie unterhalb der berschrift "Emergency Bug Fix/Updates" auf "Emergency Bug Fixes and Updates for SQL Anywhere Studio". Melden Sie sich bei Ihrem Sybase-Netzkonto an. Klicken Sie auf "Create a New Account", um ein Sybase-Netzkonto zu erstellen, falls Sie noch keines haben.

Aus der Liste der verfgbaren Downloads whlen Sie das International Resources Deployment Kit aus, das der verwendeten Plattform und Version von Adaptive Server Anywhere entspricht.

$ Eine Liste der in Adaptive Server Anywhere verfgbaren Sprachen


finden Sie unter "Mitgelieferte Kollatierungen" auf Seite 295 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, wo immer mglich, die StandardDateierweiterungen verwendet.

417

Installationsverzeichnisse und Dateinamen

Dateierweiterung

Plattform Novell Netware Windows NT

Dateityp Mit NetWare ladbares Modul Datei des Hilfesystems

.nlm .cnt, .ftg, .fts, .gid, .hlp, .chm, .chw .lib

ndert sich je nach Entwicklungstool

Statische Laufzeitbibliotheken fr die Erstellung von Embedded SQL Programmdateien Komponenten von Sybase Adaptive Server Enterprise Befehlsdateien Sprachen-Ressourcedatei fr Umgebungen auer Windows Dynamische Verknpfungsbibliothek (Dynamic Link Library) Gemeinsam genutztes Objekt (Sun Solaris und IBM AIX) oder gemeinsam genutzte Bibliothek (HPUX). Dies ist das Gegenstck zu einer DLL auf PC-Plattformen.

.cfg, .cpr, .dat, .loc, .spr, .srt, .xlt .cmd .bat .res

Windows

Windows NetWare, UNIX

.dll

Windows

.so .sl .a

UNIX

Datenbankdateinamen

Die Adaptive Server Anywhere Datenbanken bestehen aus zwei Elementen:


Datenbankdatei Sie wird verwendet, um Informationen in organisierter Form zu speichern. Dieser Datei ist die Dateierweiterung .db

zugeordnet.
Transaktionslogdatei Sie wird benutzt, um alle nderungen aufzuzeichnen, die an den Daten in der Datenbankdatei vorgenommen werden. Fr diese Datei wird die Dateierweiterung .log verwendet. Sie wird vom Adaptive Server Anywhere erzeugt, wenn keine solche Datei vorhanden ist und die Verwendung einer Logdatei definiert wurde. Ein gespiegeltes Transaktionslog hat die standardmige Erweiterung .mlg. Write-Datei Wenn Ihre Anwendung eine Write-Datei verwendet, verfgt sie in der Regel ber die Dateierweiterung .wrt.

418

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Komprimierte Datenbankdatei Wenn Sie eine schreibgeschtzte komprimierte Datenbankdatei verwenden, hat sie normalerweise die Dateierweiterung .cdb.

Diese Dateien werden vom Datenbank-Managementsystem von Adaptive Server Anywhere aktualisiert, gepflegt und verwaltet.

419

InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden

InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden


Wenn Sie InstallShield 6 oder hher verwenden, knnen Sie SQL Anywhere Studio InstallShield-Objekte in Ihr Installationsprogramm einbeziehen. Die Objekte zur Bereitstellung von Clients, Personal Datenbankservern, Netzwerkservern und Verwaltungstools finden Sie im Verzeichnis deployment\Objects in Ihrem SQL Anywhere-Verzeichnis. Anwender von InstallShield Professional 5.5 und hher knnen InstallShieldVorlagenprojekte fr SQL Anywhere Studio verwenden, um sich die Arbeit fr die Bereitstellung ihrer eigenen Anwendungen zu erleichtern. Vorlagen zum Bereitstellen eines Netzwerkservers, eines Personal Servers, ClientSchnittstellen und Verwaltungstools finden Sie im Verzeichnis SQL Anywhere 8\deployment\Templates. Wenn Sie InstallShield 6 oder hher haben, sind die Objekte den Vorlagen vorzuziehen, weil sie einfacher zusammen mit anderen Komponenten in die Installation zu integrieren sind.
v So fgen Sie ein Vorlagenprojekt zu Ihrer InstallShield-IDE hinzu:

1 2 3

Starten Sie die InstallShield-IDE. Whlen Sie Dateiffnen. Wechseln Sie zu Ihrer SQL Anywhere 7-Installation und ins Bereitstellungsverzeichnis. Wechseln Sie zum Beispiel zu folgendem Verzeichnis:
C:\Programme\Sybase\SQL Anywhere 8\deployment.

ffnen Sie die Vorlage, die dem Typ des Objekts entspricht, das Sie bereitstellen wollen. Sie knnen zwischen NetworkServer, PersonalServer, Client und JavaTools whlen.

Whlen Sie die Datei mit der Erweiterung .ipr. Das Projekt wird in der InstallShield-IDE geffnet. Im Projektbereich wird ein Symbol fr die Vorlage angezeigt. Die Vorlagen werden whrend der Installation gendert, sodass die Suchpfade der einzelnen Dateien, die in allen .fgl-Dateien aufgelistet sind, auf die aktuelle Installation von ASA zeigen. Laden Sie einfach die Vorlage in die InstallShield-IDE, generieren Sie die Medien und die Vorlage wird unmittelbar ausgefhrt.

420

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Hinweise:

Wenn Sie die Medien generieren, sehen Sie Warnmeldungen ber leere Dateigruppen. Diese Warnungen werden durch leere Dateigruppen verursacht, die als Platzhalter fr die Dateien Ihrer Anwendung in die Vorlage eingefgt wurden. Um diese Warnungen zu entfernen, knnen Sie entweder die Dateien Ihrer Anwendung in die Dateigruppen einfgen oder die Dateigruppen lschen oder umbenennen.

421

Dialogfreie Installation fr die Systemeinfhrung

Dialogfreie Installation fr die Systemeinfhrung


Dialogfreie Installationen laufen ohne Eingriff von Seiten des Benutzers und ohne dass der Benutzer erfhrt, dass eine Installation ausgefhrt wird. Bei Windows-Betriebssystemen knnen Sie das InstallShield-Setup-Programm von Adaptive Server Anywhere so aufrufen, dass die Adaptive Server Anywhere Installation dialogfrei verluft. Dialogfreie Installationen werden ebenfalls vom Microsoft Systems Management Server verwendet (siehe "SMS-Installation" auf Seite 424). Sie knnen eine dialogfreie Installation fr alle Systemeinfhrungsmodelle verwenden, die in "Modelle fr die Systemeinfhrung" auf Seite 412 beschrieben wurden. Sie knnen zur Bereitstellung von MobiLinkSynchronisationsservern auch eine dialogfreie Installation verwenden.

So wird eine dialogfreie Installation eingerichtet


Die bei einer dialogfreien Installation verwendeten Installationsoptionen stammen aus einer Antwortdatei. Die Antwortdatei wird erstellt, indem das Setup-Programm von Adaptive Server Anywhere mit der Option r ausgefhrt wird. Eine dialogfreie Installation wird durch Ausfhren von Setup mit der Option s ausgefhrt.
Verwenden Sie keine Durchsuchungsfunktionen

Wenn Sie eine dialogfreie Installation erstellen, drfen Sie die Schaltflchen "Durchsuchen" nicht verwenden. Die Ergebnisse von Durchsuchungsfunktionen knnen fehlerhaft sein.
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.exe, setup.ins usw. enthalten). Installieren Sie die Software im Modus "Record" (Aufzeichnen). Geben Sie folgenden Befehl ein:
setup r

422

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen


Mit diesem Befehl wird das Setup-Programm von Adaptive Server Anywhere ausgefhrt und aus Ihrer Auswahl bei den Optionen eine Antwortdatei erstellt. Die Antwortdatei erhlt den Namen setup.iss und befindet sich im Windows-Verzeichnis. Diese Datei enthlt die Antworten, die Sie whrend der Installation in den Dialogfeldern gegeben haben. Wenn das Programm im Modus "Record" (Aufzeichnen) ausgefhrt wird, schlgt es nicht vor, das Betriebssystem neu zu starten, auch wenn ein Neustart erforderlich ist. 4 Installieren Sie Adaptive Server Anywhere mit den Optionen und Einstellungen, die beim Bereitstellen von Adaptive Server Anywhere auf dem Computer des Endbenutzers fr die Benutzung mit Ihrer Anwendung eingerichtet werden sollen. Whrend der dialogfreien Installation knnen Pfade aufgehoben werden.

Dialogfreie Installation ausfhren


Ihr eigenes Installationsprogramm muss die dialogfreie Installation von Adaptive Server Anywhere mit der Option s aufrufen. In diesem Abschnitt wird beschrieben, wie eine dialogfreie Installation verwendet wird.
v So wird eine dialogfreie Installation verwendet:

Fgen Sie den entsprechenden Befehl in Ihre Installationsprozedur ein, damit die dialogfreie Installation von Adaptive Server Anywhere ausgefhrt wird. Wenn die Antwortdatei sich im Installations-Verzeichnis befindet, knnen Sie die dialogfreie Installation ausfhren, indem Sie im Verzeichnis mit dem Installationsabbilds folgenden Befehl ausfhren:
setup s

Wenn sich die Antwortdatei anderswo befindet, mssen Sie den Pfad mit der Option f1 angeben. In der folgenden Befehlszeile darf es keine Leerstelle zwischen f1 und dem Anfhrungszeichen geben.
setup s f1"c:\winnt\setup.iss"

Wenn die Installation von einem anderen InstallShield-Skript ausgefhrt werden soll, knnen Sie folgenden Befehl benutzen:
DoInstall( "Pfad_des_ASA_Installationsabbilds\SETUP.INS", "-s", WAIT );

423

Dialogfreie Installation fr die Systemeinfhrung


Zum Aufheben der Pfade fr das Adaptive Server AnywhereVerzeichnis und fr das gemeinsam genutzte Verzeichnis knnen Sie Optionen benutzen:
setup TARGET_DIR=Verzeichnisname SHARED_DIR=Gem_Verzeichnis s

Die Argumente TARGET_DIR und SHARED_DIR mssen allen anderen Optionen vorangestellt werden. 2 Prfen Sie, ob der Zielcomputer neu gestartet werden muss. Setup erstellt eine Datei namens silent.log im Zielverzeichnis. Diese Datei enthlt nur einen Abschnitt mit der Bezeichnung ResponseResult und der folgenden Zeile:
Reboot=Wert

Diese Zeile gibt an, ob der Zielcomputer neu gestartet werden muss, damit die Installation abgeschlossen wird. Mgliche Werte sind 0 bzw. 1, mit folgender Bedeutung:
Reboot=0 Neustart nicht erforderlich. Reboot=1 Die Option BATCH_INSTALL war whrend der

Installation aktiviert und der Zielcomputer muss neu gestartet werden. Die Installationsprozedur, die die dialogfreie Installation aufgerufen hat, ist verantwortlich fr die Prfung des Eintrags "Reboot" und ggf. fr den Neustart des Zielcomputers. 3 Prfen Sie, ob das Setup ordnungsgem abgeschlossen wurde. Setup erstellt eine Datei namens setup.log im Verzeichnis mit der Antwortdatei. Die Logdatei enthlt einen Bericht ber die dialogfreie Installation. Der letzte Abschnitt dieser Datei heit ResponseResult und enthlt die folgende Zeile:
ResultCode=Wert

Diese Zeile gibt an, ob die Installation erforderlich war. Ein Nicht-NullResultCode gibt an, dass whrend der Installation ein Fehler aufgetreten ist. Eine Beschreibung der Fehlercodes finden Sie in der Dokumentation zu InstallShield.

SMS-Installation
Microsoft System Management Server (SMS) erfordert eine dialogfreie Installation, die den Zielcomputer nicht neu startet. Die dialogfreie Installation von Adaptive Server Anywhere startet den Computer nicht neu.

424

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen


Ihr SMS-Distributionspaket msste eine Antwortdatei, das Installationsabbild und die Paket-Definitionsdatei asa8.pdf enthalten (auf der Adaptive Server Anywhere-CD-ROM im Ordner \Extras). Die SetupBefehlszeile in der PDF-Datei enthlt die folgenden Optionen: Die Option s fr eine dialogfreie Installation Die Option SMS zur Angabe, dass die Installation von SMS ausgelst wird Die Option m, damit eine MIF-Datei erzeugt wird. Die MIF-Datei wird von SMS verwendet um festzustellen, ob die Installation erfolgreich war.

425

Clientanwendungen im System bereitstellen

Clientanwendungen im System bereitstellen


Um eine Clientanwendung im System bereitzustellen, die mit einem Netzwerk-Datenbankserver betrieben wird, mssen Sie jedem Endbenutzer folgende Elemente zur Verfgung stellen:
Clientanwendung Die Anwendungssoftware selbst ist von der Datenbanksoftware unabhngig und wird hier nicht beschrieben. Datenbank-Interface-Dateien Die Clientanwendung bentigt die Dateien fr die Datenbank-Schnittstelle, die sie benutzt (ODBC, JDBC, Embedded SQL oder Open Client). Verbindungsinformationen Jede Clientanwendung bentigt

Verbindungsinformationen fr die Datenbank. Die erforderlichen Interface-Dateien und Verbindungsinformationen richten sich nach der Schnittstelle, die von Ihrer Anwendung benutzt wird. Jede Schnittstelle wird in den folgenden Abschnitten im Einzelnen beschrieben. Die einfachste Methode zur Bereitstellung von Clients ist es, die mitgelieferten InstallShield-Objekte zu verwenden. Weitere Hinweise finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420.

OLE DB- und ADO-Clients bereitstellen


Die einfachste Art, OLE DB-Clientbibliotheken bereitzustellen, ist es, die InstallShield-Objekte und Vorlagen zu verwenden. Hinweise dazu finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. Dieser Abschnitt beschreibt die Dateien, die Sie den Endbenutzern bereitstellen mssen, wenn Sie vorhaben, Ihre eigene Installation zu erstellen. Jeder OLE DB-Clientrechner muss folgende Elemente aufweisen:
Eine funktionierende OLE DB-Installation OLE DB-Dateien und

Anweisungen fr ihre Verteilung knnen bei der Microsoft Corporation bezogen werden. Sie werden hier nicht im Einzelnen beschrieben.
Der Adaptive Server Anywhere OLE DB-Provider Die folgende

Tabelle enthlt die Dateien, die fr den Adaptive Server Anywhere OLE DB-Provider erforderlich sind. 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).

426

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Beschreibung OLE DB-Treiberdatei OLE DB-Treiberdatei SprachenRessourcebibliothek Dialogfeld "Verbinden"

Windows

Windows CE

dboledb8.dll dboledba8.dll dblgen8.dll dbcon8.dll

dboledb8.dll dboledba8.dll dblgen8.dll Nicht zutreffend

OLE DB-Provider bentigen viele Registrierungseintrge. Sie knnen diese erstellen, indem Sie die DLLs mit dem Dienstprogramm regsvr32 unter Windows oder dem Dienstprogramm regsvrce unter Windows CE selbst registrieren.

$ Weitere Hinweise finden Sie unter "Datenbanken fr Windows CE


erstellen" auf Seite 300 der Dokumentation ASA Datenbankadministration und "ODBC-Anwendungen unter Windows CE verknpfen" auf Seite 281.

ODBC-Clients im System bereitstellen


Die einfachste Art, ODBC-Clients bereitzustellen, ist es, die InstallShieldObjekte und Vorlagen zu verwenden. Hinweise dazu finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. Jeder ODBC-Clientrechner muss folgende Elemente aufweisen:
Eine funktionierende ODBC-Installation ODBC-Dateien und

Anweisungen fr ihre Verteilung knnen bei der Microsoft Corporation bezogen werden. Sie werden hier nicht im Einzelnen beschrieben. Microsoft liefert den ODBC-Treibermanager fr WindowsBetriebssysteme. SQL Anywhere Studio enthlt einen ODBC Driver Manager fr UNIX. Es gibt keinen ODBC-Treibermanager fr Windows CE. ODBC-Anwendungen knnen ohne den Treibermanager laufen. Auf Plattformen, fr die ein ODBC-Treibermanager verfgbar ist, ist das nicht zu empfehlen.

427

Clientanwendungen im System bereitstellen

Falls erforderlich ODBC aktualisieren

Das SQL Anywhere Setup-Programm aktualisiert alte Installationen der Microsoft Data Access-Komponenten, einschlielich ODBC. Wenn Sie Ihre eigene Anwendung bereitstellen, mssen Sie sichergehen, dass die ODBC-Installation den Anforderungen Ihrer Anwendung entspricht.
Der ODBC-Treiber fr Adaptive Server Anywhere Dies ist die Datei dbodbc8.dll mit ihren Zusatzdateien.

$ Weitere Hinweise finden Sie unter "Erforderliche Dateien fr den


ODBC-Treiber" auf Seite 428.
Verbindungsinformation Die Clientanwendung muss Zugriff auf die

Daten haben, aus denen sie die Informationen fr die Verbindung mit dem Server bezieht. Diese Informationen sind normalerweise in der ODBC-Datenquelle enthalten.

Erforderliche Dateien fr den ODBC-Treiber


Die folgende Tabelle zeigt die Dateien, die fr einen funktionierenden ODBC-Treiber von Adaptive Server Anywhere erforderlich sind. Diese Dateien sollten in nur einem Verzeichnis abgelegt werden. Die Adaptive Server Anywhere-Installation platziert sie alle in das BetriebssystemUnterverzeichnis des SQL Anywhere-Installationsverzeichnisses (zum Beispiel: win32).
Beschreibung ODBC-Treiber Windows Windows CE UNIX

dbodbc8.dll

dbodbc8.dll dblgen8.dll Nicht zutreffend

libdbodbc8.so libdbtasks8.so dblgen8.res Nicht zutreffend

Sprachendblgen8.dll Ressourcebibliothek Dialogfeld "Verbinden"

dbcon8.dll

Hinweise

Der Endbenutzer muss ber eine funktionierende ODBC-Installation mit einem Treibermanager verfgen. Anweisungen fr die Bereitstellung von ODBC finden Sie im Microsoft ODBC SDK. Das Dialogfeld "Verbinden" ist erforderlich, wenn die Endbenutzer eigene Datenquellen erstellen sollen, bei der Verbindungsaufnahme Benutzer-IDs und Kennwrter eingeben mssen oder wenn Das Dialogfeld aus anderen Grnden angezeigt werden muss.

428

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen


Der ODBC-bersetzer ist nur erforderlich, wenn Ihre Anwendung eine Umwandlung von OEM in ANSI durchfhrt.

$ Weitere Hinweise finden Sie unter "Datenbanken fr Windows CE


erstellen" auf Seite 300 der Dokumentation ASA Datenbankadministration, und "ODBC-Anwendungen unter Windows CE verknpfen" auf Seite 281. Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie
libdbodbc8_r.so und libdbtasks8_r.so.

ODBC-Treiber konfigurieren
Das Setup-Programm muss nicht nur die Dateien des ODBC-Treibers auf die Festplatte kopieren, sondern auch eine Reihe von Eintrgen in der Registrierung vornehmen, damit der ODBC-Treiber richtig installiert wird. Windows Das Setup-Programm von Adaptive Server Anywhere fhrt nderungen in der Systemregistrierung durch, um den ODBC-Treiber anzumelden und zu konfigurieren. Wenn Sie ein Setup-Programm fr die Endbenutzer erstellen, mssen Sie dieselben Einstellungen vornehmen. Sie knnen das Dienstprogramm regedit verwenden, um die Registrierungseintrge anzuzeigen. Der ODBC-Treiber von Adaptive Server Anywhere wird im System durch eine Gruppe von Registrierungseintrgen im folgenden Registrierungsschlssel angemeldet:
HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBCINST.INI\ Adaptive Server Anywhere 8.0

Folgende Werte werden gesetzt:


Name des Wertes Driver Setup Typ des Wertes Zeichenfolge Zeichenfolge Daten des Wertes

Pfad\dbodbc8.dll Pfad\dbodbc8.dll

Es gibt auch einen Registrierungseintrag im folgenden Schlssel:


HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBCINST.INI\ ODBC Drivers

429

Clientanwendungen im System bereitstellen


Der Wert ist wie folgt:
Name des Wertes Adaptive Server Anywhere 8.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, finden Sie in der Dokumentation dieses ODBC-Treibers Hinweise dazu, wie der ODBC-Treiber zu konfigurieren ist.

Verbindungsinformationen bereitstellen
Die Verbindungsinformationen fr den ODBC-Client werden im Allgemeinen in Form einer ODBC-Datenquelle im System bereitgestellt. Die Bereitstellung einer ODBC-Datenquelle erfolgt auf folgende Weise:
Programmgesteuert Fgen Sie die Beschreibung fr eine Datenquelle

in die Registrierung des Endbenutzers oder in die ODBCInitialisierungsdateien ein.


Manuell bergeben Sie den Endbenutzern Anweisungen, damit sie auf ihrem Rechner eine geeignete Datenquelle einrichten knnen.

Sie knnen eine Datenquelle manuell mit dem ODBC Administrator erstellen, indem Sie das Register Benutzer-DSN oder System-DSN verwenden. Der ODBC-Treiber von Adaptive Server Anywhere zeigt den Konfigurationsdialog fr die Eingabe der Einstellungen an. Einstellungen fr die Datenquelle enthalten den Standort der Datenbankdatei, den Namen des Datenbankservers sowie Startparameter und andere Optionen. In diesem Abschnitt finden Sie die Informationen, die Sie fr beide Anstze bentigen. Arten von Datenquellen Es gibt drei Arten von Datenquellen: Benutzerdatenquellen, Systemdatenquellen und Dateidatenquellen. Die Definitionen der Benutzerdatenquellen werden in der Registrierung im Abschnitt fr den aktuell im System angemeldeten Benutzer gespeichert. Systemdatenquellen hingegen stehen allen Benutzern und Diensten von Windows zur Verfgung, wobei die Dienste auch aktiv sind, wenn kein Benutzer angemeldet ist. Bei einer richtig konfigurierten Systemdatenquelle "MeineAnwendung" kann jeder Benutzer diese ODBC-Verbindung verwenden, indem er "DSN=MeineAnwendung" in der ODBCVerbindungszeichenfolge eingibt.

430

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen


Dateidatenquellen werden nicht in der Registrierung gespeichert, sondern in einem speziellen Verzeichnis. Eine Verbindungszeichenfolge muss einen FileDSN-Verbindungsparameter liefern, um eine Dateidatenquelle benutzen zu knnen. Registrierungseintrge fr die Datenquelle Jede Benutzerdatenquelle ist im System ber Registrierungseintrge angemeldet. Sie mssen eine Gruppe von Registrierungswerten in einem bestimmten Registrierungsschlssel angeben. Fr Benutzerdatenquellen ist der Schlssel wie folgt:
HKEY_CURRENT_USER\ SOFTWARE\ ODBC\ ODBC.INI\ Benutzerdatenquellenname

Fr Systemdatenquellen ist der Schlssel wie folgt:


HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBC.INI\ Systemdatenquellenname

Der Schlssel enthlt eine Gruppe von Registrierungswerten, die jeweils einem Verbindungsparameter entsprechen. Zum Beispiel enthlt der Schlssel "ASA 8.0 Sample", der der Datenquelle der Beispieldatenbank von ASA 8.0 entspricht, 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.db Adaptive Server Anywhere Beispieldatenbank Pfad\win32\dbodbc8.dll sql Pfad\win32\dbeng8.exe -c 8m dba

In diesen Eintrgen steht Pfad fr das Installationsverzeichnis von Adaptive Server Anywhere. Auerdem mssen Sie die Datenquelle der Liste von Datenquellen in der Registrierung hinzufgen. Fr Benutzerdatenquellen benutzen Sie folgenden Schlssel: 431

Clientanwendungen im System bereitstellen


HKEY_CURRENT_USER\ SOFTWARE\ ODBC\ ODBC.INI\ ODBC Data Sources

Fr Systemdatenquellen benutzen Sie folgenden Schlssel:


HKEY_LOCAL_MACHINE\ SOFTWARE\ ODBC\ ODBC.INI\ ODBC Data Sources

Der Wert verknpft jede Datenquelle mit einem ODBC-Treiber. Der Name des Wertes ist der Datenquellenname, und die Daten des Wertes sind der Name des ODBC-Treibers. Beispiel: Die Benutzerdatenquelle, die von Adaptive Server Anywhere installiert wird, heit "ASA 8.0 Sample" und hat folgenden Wert:
Name des Wertes ASA 8.0 Sample Typ des Wertes Zeichenfolge Daten des Wertes Adaptive Server Anywhere 8.0

Vorsicht: ODBC-Einstellungen knnen leicht angezeigt werden Die Konfiguration von Benutzerdatenquellen kann vertrauliche Datenbankeinstellungen enthalten, wie z.B. Benutzerkennungen und Kennwrter. Diese Einstellungen werden in der Registrierung in reiner Textform gespeichert und knnen mit Registrierungseditoren von Windows regedit.exe oder regedt32.exe angezeigt werden. Diese Editoren sind in jedem Windows-System automatisch installiert. Sie knnen Kennwrter verschlsseln oder von Benutzern verlangen, sie bei der Aufnahme der Verbindung einzugeben.

Erforderliche und fakultative Verbindungsparameter

Sie knnen den Datenquellennamen in einem ODBC-Konfigurationseintrag in folgender Weise definieren:


DSN=Benutzerdatenquellenname

Wenn ein DSN-Parameter in der Verbindungszeichenfolge geliefert wird, werden erst die aktuellen Definitionen von Benutzerdatenquellen in der Registrierung durchsucht, dann die Systemdatenquellen. Dateidatenquellen werden nur durchsucht, wenn "FileDSN" in der Zeichenfolge fr die ODBCVerbindung geliefert wird. Die folgende Tabelle zeigt die Auswirkungen auf Benutzer und Entwickler, wenn eine Datenquelle vorhanden ist und in die Verbindungszeichenfolge der Anwendung als Parameter DSN oder FileDSN einbezogen ist. 432

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Datenquelle

Eingabe in der Verbindungszeichenfolge Keine zustzlichen Informationen

Eingabe durch den Benutzer Keine zustzlichen Informationen

Enthlt den ODBCTreibernamen und Speicherort, den Namen der Datenbankdatei, des Datenbankservers, die Startparameter sowie Benutzer-ID und Kennwort Enthlt nur Namen und Speicherort des ODBCTreibers

Name der Datenbankdatei oder des Datenbankservers; fakultativ die Benutzerkennung und das Kennwort Der Name des zu verwendenden ODBCTreibers in folgendem Format:
Driver={ODBC Treibername}

Benutzer-ID und Kennwort, wenn nicht im DSN oder in der Zeichenfolge fr die ODBC-Verbindung angegeben. Benutzerkennung und Kennwort, wenn nicht in der Zeichenfolge fr die ODBC-Verbindung geliefert

Nicht vorhanden

Ebenfalls: Name der Datenbank, Datenbankdatei oder Datenbankserver; 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. Open Database Connectivity (ODBC) SDK von Microsoft

Bereitstellen von Embedded SQL-Clients


Die einfachste Art, Embedded SQL-Clients bereitzustellen, ist es, die InstallShield-Objekte und Vorlagen zu verwenden. Hinweise dazu finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. 433

Clientanwendungen im System bereitstellen


Die Bereitstellung von Embedded SQL-Clients im System umfasst folgende Aufgaben:
Installierte Dateien Jeder Clientrechner muss die erforderlichen Dateien fr eine Adaptive Server Anywhere Embedded SQL-Clientanwendung enthalten. Verbindungsinformation Die Clientanwendung muss Zugriff auf die

Daten haben, aus denen sie die Informationen fr die Verbindung mit dem Server bezieht. Diese Informationen knnen in die ODBCDatenquelle aufgenommen werden.

Dateien fr Embedded SQL-Clients installieren


Die folgende Tabelle zeigt, welche Dateien fr Embedded SQL Clients bentigt werden.
Beschreibung Schnittstellenbibliothek SprachenRessourcebibliothek Windows UNIX

dblib8.dll dblgen8.dll

libdblib8.so, libdbtasks8.so dblgen8.res Nicht zutreffend Nicht zutreffend

IPX dbipx8.dll Netzwerkkommunikation Dialogfeld "Verbinden"

dbcon8.dll

Hinweise

Die Netzwerkport-DLL ist nicht erforderlich, wenn der Client nur mit dem Personal Datenbankserver arbeitet. Wenn die Clientanwendung eine ODBC-Datenquelle benutzt, um die Verbindungsparameter zu speichern, muss der Endbenutzer ber eine funktionierende ODBC-Installation verfgen. Anweisungen fr die Bereitstellung von ODBC finden Sie im Microsoft ODBC SDK.

$ Weitere Hinweise zur Bereitstellung von ODBC-Informationen im


System finden Sie unter "ODBC-Clients im System bereitstellen" auf Seite 427. Das Dialogfeld "Verbindung" ist erforderlich, wenn die Endbenutzer eigene Datenquellen erstellen, bei der Verbindungsaufnahme BenutzerIDs und Kennwrter eingeben mssen oder wenn das Dialogfeld aus anderen Grnden angezeigt werden muss. Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie
libdbodbc8_r.so und libdbtasks8_r.so.

434

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, damit sie auf ihrem Rechner eine geeignete Datenquelle einrichten knnen. Datei bergeben Sie den Endbenutzern eine Datei, die Verbindungsinformationen in einem Format enthlt, das Ihre Anwendung lesen kann. ODBC-Datenquelle Sie knnen die ODBC-Datenquelle verwenden, um darin die Verbindungsinformationen zu speichern. In diesem Fall bentigen Sie eine Teilgruppe der ODBC-Dateien von Microsoft. Hinweise finden Sie unter "ODBC-Clients im System bereitstellen" auf Seite 427. Hartcodiert Sie knnen Verbindungsinformationen in der Anwendung

programmieren. Dies ist eine unflexible Methode, die beispielsweise bei einem Upgrade von Datenbanken umfassende Neuprogrammierungen erforderlich macht.

JDBC-Clients im System bereitstellen


Zustzlich zur Java-Laufzeitumgebung (Java Runtime Environment) muss jeder JDBC-Client auch ber den JDBC-Treiber jConnect von Sybase oder die JDBC-ODBC-Brcke verfgen.

$ Hinweise zur Bereitstellung von jConnect finden Sie unter


http://manuals.sybase.com/onlinebooks/group-jc/jcg0420e/ auf der SybaseWebsite. Zur Bereitstellung der JDBC-ODBC-Brcke mssen die folgenden Dateien mitgeliefert werden:
jodbc.jar

Diese muss sich im Classpath der Anwendung befinden.

dbjodbc8.dll Diese muss sich im Systempfad befinden. In UNIX- oder Linux-Umgebungen ist die Datei eine gemeinsam genutzte Bibliothek (dbjodbc8.so).

Die ODBC-Treiberdateien. Weitere Hinweise finden Sie unter "Erforderliche Dateien fr den ODBC-Treiber" auf Seite 428.

Ihre Java-Anwendung bentigt einen URL, um sich mit der Datenbank zu verbinden. Dieser URL gibt den Treiber, den zu verwendenden Rechner und den Port an, auf dem der Datenbankserver auf Daten wartet.

435

Clientanwendungen im System bereitstellen

$ Weitere Hinweise zu URL finden Sie unter "Einem Server einen URL
liefern" auf Seite 152.

Open Client-Anwendungen im System bereitstellen


Um Open Client-Anwendungen bereitzustellen, muss auf jedem Rechner Sybase Open Client installiert sein. Sie mssen die Open Client-Software getrennt bei Sybase erwerben. Sie enthlt eigene Installationsanweisungen.

$ Verbindungsinformationen fr Open Client-Clients sind in der InterfaceDatei zu finden. Hinweise zur Interface-Datei finden Sie in der Open ClientDokumentation und unter "Open Server konfigurieren" auf Seite 122 der Dokumentation ASA Datenbankadministration.

436

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen

Tools zur Verwaltung bereitstellen


Abhngig von Ihrer Lizenzvereinbarung knnen Sie eine Reihe von Verwaltungstools wie Interactive SQL, Sybase Central und das berwachungsdienstprogramm dbconsole bereitstellen. Die einfachste Methode zur Bereitstellung von Verwaltungstools ist es, die mitgelieferten InstallShield-Objekte zu verwenden. Weitere Hinweise finden Sie unter "InstallShield-Objekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. Interactive SQL bereitstellen Wenn Ihre Kundenanwendung auf Rechnern mit begrenzten Ressourcen luft, sollten Sie die C-Version von Interactive SQL (dbisqlc.exe) an Stelle der Standardversion bereitstellen (dbisql.exe und die dazugehrigen JavaKlassen). Das dbisqlc-Programm erfordert die clientseitigen Embedded SQLStandardbibliotheken.

$ Hinweise ber die Systemanforderungen von Verwaltungstools finden


Sie unter "Systemvoraussetzungen fr das Administrationstool" auf Seite 153 der Dokumentation SQL Anywhere Studio Erste Orientierung.

437

Datenbankserver im System bereitstellen

Datenbankserver im System bereitstellen


Sie knnen einen Datenbankserver im System bereitstellen, indem Sie das Setup-Programm fr das SQL Anywhere Studio den Endbenutzern bergeben. Wenn der Endbenutzer die richtigen Installationsoptionen whlt, verfgt er garantiert ber alle erforderlichen Dateien. Die einfachste Methode zur Bereitstellung eines Personal Datenbankservers oder eines Netzwerk-Datenbankserver ist es, die mitgelieferten InstallShieldObjekte zu verwenden. Weitere Hinweise finden Sie unter "InstallShieldObjekte und Vorlagen zum Bereitstellen verwenden" auf Seite 420. Um einen Datenbankserver zu betreiben, mssen Sie eine Gruppe von Dateien installieren. Die Dateien werden in der folgenden Tabelle angefhrt. Die Weitergabe dieser Dateien unterliegt den Bestimmungen der Lizenzvereinbarung. Sie mssen vorher feststellen, ob Sie das Recht haben, die Dateien des Datenbankservers weiterzugeben.
Windows UNIX NetWare Nicht zutreffend

dbeng8.exe dbsrv8.exe dbserv8.dll dbserv8.dll dblgen8.dll oder dblgde8.dll dbjava8.dll (1) dbctrs8.dll dbextf.dll
(2)

dbeng8 dbsrv8 libdbserv8.so, libdbtasks8_r.so dbserv8.so, libdbtasks8.so dblgen8.res libdbjava8.so (1)


Nicht zutreffend
(2)

dbsrv8.nlm
Nicht zutreffend Nicht zutreffend

dblgen8.res dbjava8.nlm (1)


Nicht zutreffend

libdbextf.so

dbextf.nlm (2) asajdbc.zip (1,3) asajrt12.zip (1,3) classes.zip (1,3)


N/A N/A

asajdbc.zip (1,3) asajrt12.zip (1,3) classes.zip (1,3) dbmem.vxd (4) libunic.dll asa.cvf Verzeichnis charsets\

asajdbc.zip (1,3) asajrt12.zip (1,3) classes.zip (1,3)


N/A

libunic.so asa.cvf charsets/ directory

asa.cvf
N/A

1. Nur erforderlich, wenn Sie Java in der Datenbank verwenden. Bei Datenbanken, die mit JDK 1.1 initialisiert wurden, stellen Sie asajdbc.zip bereit. Bei Datenbanken, die mit JDK 1.2 oder JDK 1.3 initialisiert wurden, stellen Sie asajrt13.zip bereit.

438

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen


2. Nur erforderlich, wenn Sie erweiterte Systemprozeduren und Funktionen benutzen (xp_). 3. So installieren, dass die Klassen in dieser Datei ber die Umgebungsvariable CLASSPATH gefunden werden. 4. Erforderlich auf Windows 95/98/Me, wenn die dynamische Cachebelegung verwendet wird.

Hinweise

Je nach Konfiguration mssen Sie den Personal Datenbankserver (dbeng8) oder den Netzwerk-Datenbankserver (dbsrv8) im System bereitstellen. Die Java DLL (dbjava8.dll) ist nur erforderlich, wenn der Datenbankserver die Funktionalitt von Java in der Datenbank verwenden soll. Die Tabelle enthlt keine Dateien, die fr das Ausfhrung von Dienstprogrammen wie dbbackup erforderlich sind.

$ Hinweise zur Bereitstellung von Datenbank-Dienstprogrammen im


System finden Sie unter "Tools zur Verwaltung bereitstellen" auf Seite 437. Die zip-Dateien sind nur fr Anwendungen erforderlich, die Java in der Datenbank verwenden und werden an einem Standort in der Umgebungsvariable CLASSPATH auf dem Rechner des Benutzers installiert.

Datenbanken im System bereitstellen


Eine Datenbankdatei wird im System bereitgestellt, indem Sie die Datenbankdatei auf der Festplatte des Endbenutzers installieren. Wenn der Datenbankserver sauber herunterfhrt, brauchen Sie mit der Datenbankdatei kein Transaktionslog bereitzustellen. Wenn der Endbenutzer die Datenbank startet, wird ein neues Transaktionslog erstellt. Fr Anwendungen mit SQL Remote muss die Datenbank in einem ordentlich synchronisierten Zustand erstellt werden und daher wird kein Transaktionslog bentigt. Sie knnen dafr das Extraktionsdienstprogramm verwenden.

Datenbanken auf schreibgeschtzten Datentrgern bereitstellen


Sie knnen Datenbanken auf schreibgeschtzten Datentrgern verteilen, wie etwa CD-ROM, sofern Sie sie im schreibgeschtzten Modus oder mit einer Write-Datei ausfhren.

$ Weitere Hinweise zum Ausfhren von Datenbanken im


schreibgeschtzten Modus finden Sie unter "r-Serveroption" auf Seite 166 der Dokumentation ASA Datenbankadministration. 439

Datenbankserver im System bereitstellen


Damit nderungen an Adaptive Server Anywhere-Datenbanken vorgenommen werden knnen, die auf schreibgeschtzten Datentrgern geliefert werden, wie etwa CD-ROM, knnen Sie eine Write-Datei verwenden. In der Write-Datei werden nderungen gespeichert, die in einer schreibgeschtzten Datenbank durchgefhrt werden. Sie befindet sich auf einem Datentrger, der Schreiben und Lesen zulsst, z.B. einer Festplatte. In diesem Fall wird die Datenbankdatei auf der CD-ROM gespeichert, die Write-Datei hingegen auf der Festplatte. Die Verbindung wird mit der WriteDatei aufgenommen, die auf der Festplatte ein Transaktionslog fhrt.

$ Weitere Hinweise zu Write-Dateien finden Sie unter "Mit WriteDateien arbeiten" auf Seite 247 der Dokumentation ASA Datenbankadministration.

440

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, bei denen die Anwendung und die Datenbank auf demselben Rechner untergebracht sind. Eine eingebettete Datenbankanwendung enthlt folgende Komponenten:
Datenbankserver Der Adaptive Server Anywhere Personal

Datenbankserver.

$ Hinweise zur Bereitstellung von Datenbankservern finden Sie


unter "Datenbankserver im System bereitstellen" auf Seite 438.
SQL Remote Wenn Ihre Anwendung die Replikation mit SQL Remote

benutzt, mssen Sie das Deployment von SQL Remote Message Agent vornehmen.
Die Datenbank Sie mssen eine Datenbankdatei im System bereitstellen, die die von der Anwendung benutzten Daten aufnimmt.

Personal Server im System bereitstellen


Wenn Sie eine Anwendung im System bereitstellen, die den Personal Server benutzt, mssen Sie sowohl die Komponenten der Clientanwendung bereitstellen, als auch die Komponenten des Datenbankservers. Die Sprachen-Ressourcebibliothek (dblgen8.dll) wird vom Client und vom Server gemeinsam genutzt. Sie brauchen nur ein Exemplar dieser Datei. Es wird empfohlen, dass Sie die Installationsvorgaben von Adaptive Server Anywhere einhalten und die Dateien fr Client und Server in demselben Verzeichnis installieren. Beachten Sie, dass Sie die Java zip-Dateien und die Java-DLL bereitstellen mssen, wenn Ihre Anwendung Java in der Datenbank benutzt.

Datenbank-Dienstprogramme bereitstellen
Wenn Sie Datenbank-Dienstprogramme (wie z.B. dbbackup.exe) gemeinsam mit Ihrer Anwendung im System bereitstellen mssen, brauchen Sie die Programmdatei des Dienstprogramms mit folgenden zustzlichen Dateien:

441

Eingebettete Datenbankanwendungen im System bereitstellen

Beschreibung Bibliothek der Datenbanktools Zustzliche Bibliothek Sprachen-Ressourcebibliothek Verbindungsdialog (nur dbisqlc)

Windows

UNIX

Dbtool8.dll dbwtsp8.dll dblgen8.dll dbcon8.dll

libdbtools8.so, libdbtasks8.so Libdbwtsp8.so dblgen8.res

Hinweise

Die Datenbanktools sind Embedded SQL-Anwendungen. Sie mssen die fr diese Anwendungen erforderlichen Dateien bereitstellen. Siehe dazu die Liste in "Bereitstellen von Embedded SQL-Clients" auf Seite 433. Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie libdbodbc8_r.so und libdbtasks8_r.so.

SQL Remote im System bereitstellen


Wenn Sie den Nachrichtenagenten von SQL Remote im System bereitstellen, mssen folgende Dateien installiert werden:
Beschreibung Nachrichtenagent Bibliothek der Datenbanktools Zustzliche Bibliothek Sprachen-Ressourcebibliothek Bibliothek fr VIMNachrichtenverbindungen1 Bibliothek fr SMTPNachrichtenverbindungen1 Bibliothek fr FILENachrichtenverbindungen1 Bibliothek fr FTPNachrichtenverbindungen1 Bibliothek fr MAPINachrichtenverbindungen1 Schnittstellenbibliothek
1

Windows

UNIX

dbremote.exe dbtool8.dll dbwtsp8.dll dblgen8.dll dbvim8.dll dbsmtp8.dll dbfile8.dll dbftp8.dll dbmapi8.dll dblib8.dll

dbremote libdbtools8.so, libdbtasks8.so libdbwtsp8.so dblgen8.res

libdbfile8.so

Stellen Sie nur die Bibliothek fr die Nachrichtenverbindung bereit, die die Anwendung benutzen wird.

442

Kapitel 12 Deployment: Datenbanken und Anwendungen im System bereitstellen


Es wird empfohlen, dass Sie die Installationsvorgaben von Adaptive Server Anywhere einhalten und die Dateien fr SQL Remote in demselben Verzeichnis installieren wie Adaptive Server Anywhere. Bei Anwendungen mit mehrfachen Threads unter UNIX benutzen Sie libdbodbc8_r.so und libdbtasks8_r.so.

443

Eingebettete Datenbankanwendungen im System bereitstellen

444

K A P I T E L

1 3

Fehlermeldungen des SQL-Prprozessors

ber dieses Kapitel Inhalt

In diesem Kapitel finden Sie eine Liste aller Fehler- und Warnmeldungen des SQL-Prprozessors.
Thema Fehlermeldungen des SQL-Prprozessors, sortiert nach Fehlernummern SQLPP-Fehler Seite 446 450

445

Fehlermeldungen des SQL-Prprozessors, sortiert nach Fehlernummern

Fehlermeldungen des SQL-Prprozessors, sortiert nach Fehlernummern


Fehlernummer 2601 2602 Meldung "Subskriptionswert %1 zu gro" auf Seite 464 "Kombinierter Zeiger und Arrays fr Hosttypen nicht zulssig" auf Seite 455 "Nur eindimensionale Arrays werden fr den 'char'-Typ untersttzt" auf Seite 463 "VARCHAR-Typ muss eine Lnge haben" auf Seite 454 "Arrays von VARCHAR nicht untersttzt" auf Seite 454 "VARCHAR-Hostvariable knnen keine Zeiger sein" auf Seite 453 "Initialisieren bei der VARCHARHostvariablen nicht zulssig" auf Seite 459 "FIXCHAR-Typ muss eine Lnge haben" auf Seite 451 "Arrays werden fr FIXCHAR nicht untersttzt" auf Seite 454 "Arrays dieses Typs werden nicht untersttzt" auf Seite 455 "Beim Dezimaltyp muss die Anzahl der Dezimalstellen angegeben werden" auf Seite 463 "Dezimalzahlen-Arrays sind nicht zulssig" auf Seite 454 "Unbekannter Hostvariablen-Typ" auf Seite 453 "Ungltige 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

Kapitel 13 Fehlermeldungen des SQL-Prprozessors


Fehlernummer 2617 2618 2619 2620 2621 2622 2623 2625 Meldung "Das Symbol %1 ist bereits definiert" auf Seite 450 "Ungltiger Typ fr 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 "Ungltiger Typ fr Indikatorvariable '%1'" auf Seite 460 "Ungltiger 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 fr diesen Cursor nicht zulssig" auf Seite 457 "Hostvariable zweimal angegeben bei 'Declare' und bei 'Open'" auf Seite 458 "Host-Liste oder Using-Klausel fr %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 - Dies ist eine '%1' Erweiterung" auf Seite 458

2626 2627 2628 2629 2630

2631

2633 2634

2635

447

Fehlermeldungen des SQL-Prprozessors, sortiert nach Fehlernummern


Fehlernummer 2636 2637 Meldung "Fehlerhafte Embedded-SQL-Syntax" auf Seite 458 "Fehlendes schlieendes Anfhrungszeichen fr die Zeichenfolge" auf Seite 461 "Token zu lang" auf Seite 464 "'%1' Hostvariable muss ein Ganzzahltyp sein" auf Seite 450 "SQLDA muss fr DESCRIBE angegeben werden" auf Seite 462 "Zwei SQLDAs fr denselben Typ angegeben (INTO oder USING)" auf Seite 453 "Statische Cursor knnen nicht beschrieben werden" auf Seite 455 "Makros knnen nicht neu definiert werden" auf Seite 453 "Ungltige Arraydimension" auf Seite 453 "Ungltiger Deskriptor-Index" auf Seite 459 "Ungltiges Feld fr 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 zulssig - ignoriert" auf Seite 452 "Nicht erkannte SQL-Syntax" auf Seite 465 "Unbekannte SQL-Funktion '%1'" auf Seite 465 "Falsche Anzahl von Parametern fr 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

Kapitel 13 Fehlermeldungen des SQL-Prprozessors


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 "Temporre Datei kann nicht geffnet werden" auf Seite 465 "Fehler beim Lesen der temporren Datei" auf Seite 456 "Fehler beim Schreiben der Ausgabedatei" auf Seite 456 "Inkonsistente Zahl von Hostvariable fr diesen Cursor" auf Seite 452 "Inkonsistente Hostvariablentypen fr diesen Cursor" auf Seite 452 "Inkonsistente Indikatorvariable fr diesen Cursor" auf Seite 452 "Merkmal steht bei UltraLite nicht zur Verfgung" auf Seite 451 "Kein OPEN-Befehl fr Cursor '%1'" auf Seite 462 "Kein FETCH- oder PUT-Befehl fr Cursor '%1'" auf Seite 462 "Hostvariable '%1' wird mit unterschiedlichen Indikatoren mehr als einmal verwendet" auf Seite 451 "Grenlimit fr long binary/long varchar ist 65535 fr 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, die vom SQL-Prprozessor generiert werden. Die Meldungen knnen je nach Einstellung durch die Befehlszeilenparameter Fehler-, Warnmeldungen oder beides sein.

$ Weitere Hinweise zum SQL-Prprozessor und zu seinen


Befehlszeilenparametern finden Sie unter "SQL-Prprozessor" auf Seite 249.

%1 Hostvariable muss ein C-Zeichenfolgentyp sein


Fehlernummer 2615 Mgliche Ursache Fehlertyp Fehler

Eine C-Zeichenfolge war in einer Embedded SQL-Anweisung erforderlich (fr einen Cursornamen, Optionsnamen etc.), und der bergebene Wert war keine C-Zeichenfolge.

%1 Hostvariable muss ein Ganzzahltyp sein


Fehlernummer 2640 Mgliche Ursache Fehlertyp Fehler

Sie haben eine Hostvariable, die kein Ganzzahltyp ist, in einer Anweisung verwendet, in der nur Hostvariablen vom Ganzzahltyp zulssig sind.

Das Symbol %1 ist bereits definiert


Fehlernummer 2617 Mgliche Ursache Fehlertyp Fehler

Sie haben eine Hostvariable zweimal definiert.

450

Kapitel 13 Fehlermeldungen des SQL-Prprozessors

Include-Datei %1 kann nicht gefunden werden


Fehlernummer Fehlertyp

2619 Mgliche Ursache

Fehler

Die angegebene Include-Datei wurde nicht gefunden. Beachten Sie, dass der Prprozessor die INCLUDE-Umgebungsvariable zur Suche nach IncludeDateien verwendet.

FIXCHAR-Typ muss eine Lnge haben


Fehlernummer 2608 Mgliche Ursache Fehlertyp Fehler

Sie haben den Makro DECL_FIXCHAR benutzt, um eine Hostvariable des Typs FIXCHAR zu deklarieren, aber keine Lnge angegeben.

Merkmal steht bei UltraLite nicht zur Verfgung


Fehlernummer 2693 Mgliche Ursache Fehlertyp Markierung (Warnung oder Fehler)

Sie haben eine Funktion benutzt, die von UltraLite nicht untersttzt wird.

Hostvariable %1 wird mit unterschiedlichen Indikatoren mehr als einmal verwendet


Fehlernummer 2696 Mgliche Ursache Fehlertyp Fehler

Sie haben dieselbe Hostvariable mehrere Male mit unterschiedlichen Indikatorvariablen in derselben Anweisung verwendet. Dies wird nicht untersttzt.

451

SQLPP-Fehler

Inkonsistente Hostvariablentypen fr diesen Cursor


Fehlernummer 2691 Mgliche Ursache Fehlertyp Fehler

Sie haben eine Hostvariable mit einem anderen Typ oder einer anderen Lnge verwendet als vorher mit diesem Cursor. Hostvariablentypen mssen fr den Cursor konsistent sein.

Inkonsistente Indikatorvariable fr diesen Cursor


Fehlernummer 2692 Mgliche Ursache Fehlertyp Fehler

Sie haben eine Indikatorvariable benutzt, obwohl vorher mit dem Cursor keine verwendet wurde, oder Sie haben keine Indikatorvariable benutzt, obwohl vorher mit dem Cursor eine benutzt wurde. Indikatorvariablen mssen bei Cursorn konsistent verwendet werden.

Inkonsistente Zahl von Hostvariable fr diesen Cursor


Fehlernummer 2690 Mgliche Ursache Fehlertyp Fehler

Sie haben eine andere Anzahl von Hostvariablen benutzt als vorher mit dem Cursor benutzt wurde. Die Anzahl von Hostvariablentypen muss fr den Cursor konsistent sein.

Into-Klausel in 'declare cursor' nicht zulssig - ignoriert


Fehlernummer 2660 Mgliche Ursache Fehlertyp Warnung

Sie haben eine INTO-Klausel mit einer DECLARE CURSOR-Anweisung verwendet. Die INTO-Klausel wird ignoriert.

452

Kapitel 13 Fehlermeldungen des SQL-Prprozessors

Ungltige Arraydimension
Fehlernummer 2648 Mgliche Ursache Fehlertyp Fehler

Die Arraydimension der Variablen ist negativ.

Makros knnen nicht neu definiert werden


Fehlernummer 2647 Mgliche Ursache Fehlertyp Fehler

Ein Prprozessor-Makro wurde zweimal definiert, mglicherweise in einer Header-Datei.

Zwei SQLDAs fr denselben Typ angegeben (INTO oder USING)


Fehlernummer 2642 Mgliche Ursache Fehlertyp Fehler

Sie haben zwei INTO DESCRIPTOR- oder zwei USING DESCRIPTORKlauseln fr diese Anweisung angegeben.

Unbekannter Hostvariablen-Typ
Fehlernummer 2613 Mgliche Ursache Fehlertyp Fehler

Sie haben eine Hostvariable eines Typs angegeben, der vom SQLPrprozessor nicht verstanden wird.

VARCHAR-Hostvariable knnen keine Zeiger sein


Fehlernummer 2606 Fehlertyp Fehler

453

SQLPP-Fehler

Mgliche Ursache

Sie haben versucht, eine Hostvariable als Zeiger auf einen VARCHAR- oder BINARY-Typ zu deklarieren. Dies ist kein zulssiger Hostvariablentyp.

VARCHAR-Typ muss eine Lnge haben


Fehlernummer 2604 Mgliche Ursache Fehlertyp Fehler

Sie haben versucht, eine VARCHAR- oder BINARY-Hostvariable mit dem DECL_VARCHAR- oder DECL_BINARY-Makro zu deklarieren, aber keine Gre fr das Array angegeben.

Arrays werden fr FIXCHAR nicht untersttzt


Fehlernummer 2609 Mgliche Ursache Fehlertyp Fehler

Sie haben versucht, eine Hostvariable als Array von FIXCHAR-Arrays zu deklarieren. Dies ist kein zulssiger Hostvariablentyp.

Arrays von VARCHAR nicht untersttzt


Fehlernummer 2605 Mgliche Ursache Fehlertyp Fehler

Sie haben versucht, eine Hostvariable als Array von VARCHAR- oder BINARY-Arrays zu deklarieren. Dies ist kein zulssiger Hostvariablentyp.

Dezimalzahlen-Arrays sind nicht zulssig


Fehlernummer 2612 Fehlertyp Fehler

454

Kapitel 13 Fehlermeldungen des SQL-Prprozessors

Mgliche Ursache

Sie haben versucht, eine Hostvariable als Array von DECIMAL-Arrays zu deklarieren. Ein dezimales Array ist kein zulssiger Hostvariablentyp.

Arrays dieses Typs werden nicht untersttzt


Fehlernummer 2610 Mgliche Ursache Fehlertyp Fehler

Sie haben versucht, ein Hostvariablen-Array eines Typs zu deklarieren, der nicht untersttzt wird.

Statische Cursor knnen nicht beschrieben werden


Fehlernummer 2646 Mgliche Ursache Fehlertyp Fehler

Sie haben einen statischen Cursor beschrieben. Beim Beschreiben eines Cursors muss der Cursorname in einer Hostvariablen angegeben sein.

Kombinierter Zeiger und Arrays fr Hosttypen nicht zulssig


Fehlernummer 2602 Mgliche Ursache Fehlertyp Fehler

Sie haben ein Array von Zeigern als Hostvariable benutzt. Dies ist nicht zulssig.

Cursor %1 wurde vorher noch nicht deklariert


Fehlernummer 2627 Mgliche Ursache Fehlertyp Fehler

Ein Embedded SQL-Cursorname wurde benutzt (in FETCH, OPEN, CLOSE etc.), ohne vorher deklariert worden zu sein.

455

SQLPP-Fehler

Datenwert muss eine Hostvariable sein


Fehlernummer 2652 Mgliche Ursache Fehlertyp Fehler

Die in der SET DESCRIPTOR-Anweisung benutzte Variable wurde nicht als Hostvariable deklariert.

Fehler beim Lesen der temporren Datei


Fehlernummer 2682 Mgliche Ursache Fehlertyp Fehler

Beim Lesen aus einer temporren Datei ist ein Fehler aufgetreten.

Fehler beim Schreiben der Ausgabedatei


Fehlernummer 2683 Mgliche Ursache Fehlertyp Fehler

Beim Schreiben in die Ausgabedatei ist ein Fehler aufgetreten.

Feld in SET DESCRIPTOR Anweisung mehr als einmal verwendet


Fehlernummer 2651 Mgliche Ursache Fehlertyp Fehler

Dasselbe Schlsselwort wurde mehr als einmal in einer einzigen SET DESCRIPTOR-Anweisung verwendet.

Volles SQL-Merkmal
Fehlernummer 2668 Fehlertyp Markierung (Warnung oder Fehler)

456

Kapitel 13 Fehlermeldungen des SQL-Prprozessors

Mgliche Ursache

Sie haben eine volle SQL/92-Funktion verwendet und mit den Optionen -ee, -ei, -we oder -wi im Prprozessor verarbeitet.

Hostvariable %1! wurde neu definiert


Fehlernummer 2665 Mgliche Ursache Fehlertyp Warnung

Sie haben dieselbe Hostvariable mit einem anderen Hosttyp neu definiert. Fr den SQL-Prprozessor sind Hostvariable globale Variable: zwei Hostvariable mit unterschiedlichen Typen knnen niemals den gleichen Namen haben.

Hostvariable %1 hat zwei verschiedene Definitionen


Fehlernummer 2625 Mgliche Ursache Fehlertyp Fehler

Dieselbe Hostvariable wurden in demselben Modul mit zwei verschiedenen Typen definiert. Beachten Sie, dass die Hostvariablen in einem C-Modul global sind.

Hostvariable %1 ist unbekannt


Fehlernummer 2620 Mgliche Ursache Fehlertyp Fehler

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

Hostvariable fr diesen Cursor nicht zulssig


Fehlernummer 2629 Fehlertyp Fehler

457

SQLPP-Fehler

Mgliche Ursache

Hostvariable sind in der Declare-Anweisung fr den angegebenen Cursor nicht zulssig. Wenn der Cursorname ber eine Hostvariable bergeben wird, mssen 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 Mgliche Ursache Fehlertyp Fehler

Sie haben Hostvariablen fr einen Cursor in den Declare- und OpenAnweisungen angegeben. Im statischen Fall mssen 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 Mgliche 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-Prprozessors

Indikatorvariable %1 ist unbekannt


Fehlernummer 2621 Mgliche 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 zulssig


Fehlernummer 2607 Mgliche Ursache Fehlertyp Fehler

Sie knnen keinen C-Variablen-Initialisierer fr eine Hostvariable des Typs VARCHAR oder BINARY angeben. Sie mssen diese Variable in regultem ausfhrbarem C-Code initialisieren.

Intermediate-SQL-Merkmal
Fehlernummer 2667 Mgliche Ursache Fehlertyp Markierung (Warnung oder Fehler)

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

Ungltiger Deskriptor-Index
Fehlernummer 2649 Mgliche Ursache Fehlertyp Fehler

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

459

SQLPP-Fehler

Ungltiges Feld fr SET DESCRIPTOR


Fehlernummer 2650 Mgliche Ursache Fehlertyp Fehler

Ein ungltiges oder unbekanntes Schlsselwort ist in einer SET DESCRIPTOR-Anweisung vorhanden. Schlsselwrter knnen nur sein: TYPE, PRECISION, SCALE, LENGTH, INDICATOR oder DATA.

Ungltiger Hostvariablen-Typ auf '%1'


Fehlernummer 2623 Mgliche Ursache Fehlertyp Fehler

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

Ungltige Ganzzahl
Fehlernummer 2614 Mgliche Ursache Fehlertyp Fehler

Eine Ganzzahl wurde in einer Embedded SQL-Anweisung (fr einen FetchOffset oder einen Hostvariablen-Arrayindex, etc.) erwartet, und der Prprozessor konnte das bergebene Element nicht in eine Ganzzahl konvertieren.

Ungltiger Typ fr Indikatorvariable '%1'


Fehlernummer 2622 Mgliche Ursache Fehlertyp Fehler

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

460

Kapitel 13 Fehlermeldungen des SQL-Prprozessors

Ungltiger Typ fr SQL-Anweisungsvariable


Fehlernummer 2618 Mgliche 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.

Grenlimit fr long binary/long varchar ist 65535 fr UltraLite


Fehlernummer 2697 Mgliche Ursache Fehlertyp Fehler

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

Fehlendes schlieendes Anfhrungszeichen fr die Zeichenfolge


Fehlernummer 2637 Mgliche Ursache Fehlertyp Fehler

Sie haben eine Zeichenfolgenkonstante in einer Embedded SQL-Anweisung eingegeben, aber es ist kein schlieendes Anfhrungszeichen fr das Zeilenende oder das Dateiende vorhanden.

Host-Liste oder Using-Klausel fr %1 muss angegeben werden


Fehlernummer 2631 Mgliche Ursache Fehlertyp Fehler

Die angegebene Anweisung bentigt die Angabe von Hostvariablen in einer Hostvariablenliste oder aus einer SQLDA.

461

SQLPP-Fehler

SQLDA muss fr DESCRIBE angegeben werden


Fehlernummer 2641 Fehlertyp Fehler

Kein FETCH- oder PUT-Befehl fr Cursor '%1'


Fehlernummer 2695 Mgliche Ursache Fehlertyp Fehler

Ein Cursor ist deklariert und geffnet, wird aber nie verwendet.

Keine INTO-Klausel in SELECT-Anweisung


Fehlernummer 2633 Mgliche Ursache Fehlertyp Fehler

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

Kein OPEN-Befehl fr Cursor '%1'


Fehlernummer 2694 Mgliche Ursache Fehlertyp Fehler

Ein Cursor ist deklariert und mglicherweise benutzt, wird aber nie geffnet.

Kein Declare-Abschnitt und keine INCLUDE SQLCA Anweisung


Fehlernummer 2680 Mgliche Ursache Fehlertyp Fehler

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

462

Kapitel 13 Fehlermeldungen des SQL-Prprozessors

Nur eindimensionale Arrays werden fr den 'char'-Typ untersttzt


Fehlernummer 2603 Mgliche Ursache Fehlertyp Fehler

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

Beim Dezimaltyp muss die Anzahl der Dezimalstellen angegeben werden


Fehlernummer 2611 Mgliche Ursache Fehlertyp Fehler

Sie mssen 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 Mgliche 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

Mgliche Ursache

Sie haben einen statischen Anweisungsnamen benutzt und mit dem Wiedereintrittsparameter -r im Prprozessor verarbeitet. Statische Anweisungsnamen bewirken, dass statische Variable generiert werden, die aus der Datenbank einflieen. 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 Mgliche Ursache Fehlertyp Fehler

Sie haben versucht, eine Hostvariable zu indizieren, die in einem Array mit einem zu groen Wert fr das Array liegt.

Token zu lang
Fehlernummer 2639 Mgliche Ursache Fehlertyp Fehler

Der SQL-Prprozessor hat eine maximale Tokenlnge von 2 KByte. Alle Token ber 2 KByte ergeben diesen Fehler. Fr Konstantenzeichenfolgen in Embedded SQL-Befehlen (Hauptursache fr diesen Fehler) benutzen Sie eine Zeichenfolgenverkettung, um eine lngere Zeichenfolge zu ermglichen.

Transact-SQL-Erweiterung
Fehlernummer 2669 Mgliche 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 Prprozessor verarbeitet.

464

Kapitel 13 Fehlermeldungen des SQL-Prprozessors

Temporre Datei kann nicht geffnet werden


Fehlernummer 2681 Mgliche Ursache Fehlertyp Fehler

Beim ffnen einer temporren Datei ist ein Fehler aufgetreten.

Unbekannte SQL-Funktion %1
Fehlernummer 2662 Mgliche Ursache Fehlertyp Warnung

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

Unbekannte Anweisung %1
Fehlernummer 2628 Mgliche Ursache Fehlertyp Fehler

Sie haben versucht, eine Embedded SQL-Anweisung zu lschen, die nicht existiert.

Nicht erkannte SQL-Syntax


Fehlernummer 2661 Mgliche 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 Mgliche 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 Prprozessor verarbeitet.

Falsche Anzahl von Parametern fr SQL-Funktion '%1'


Fehlernummer 2663 Mgliche 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, Aufzhlungstyp, 369 a_writefile, Struktur, 364 Abfragen ADO-Recordset-Objekt, 377, 379 einzelne Zeilen, 214 Java in der Datenbank, 117 JDBC, 169 Abrollbare Cursor JDBC-Untersttzung, 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 Einfhrung 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

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

468

BB
autocommit ODBC, 289 steuern, 50 AutoCommit JDBC, 164 Autocommit, Modus Implementierung, 51 Transaktionen, 49 Datenbankserver, 438 dbconsole, Dienstprogramm, 437 eingebettete Datenbanken, 441 Embedded SQL, 433 Interactive SQL, 437 Java in der Datenbank, 438 jConnect, 435 JDBC-Clients, 435 JDBC-ODBC-Brcke, 435 ODBC, 427 ODBC-Treiber, 428 OLE DB-Provider, 426 Open Client, 436 Personal Datenbankserver, 441 schreibgeschtzte Datenbanken, 439 SQL Remote, 442 Sybase Central, 437 Verwaltungstools, 437 Bereitstellung Dateistandorte, 415 Datenbanken und Anwendungen, 411 Info, 411 InstallShield, 420 Methoden, 412 MobiLink-Synchronisationsserver, 422 ohne Dialog, 422 siehe auch Bereitstellung, berblick, 412 Write-Dateien, 418 Beschreiben Ergebnismengen, 47 Bestndigkeit Java in den Datenbankklassen, 80 Betriebssystem Dateinamen, 417 Bezeichner Anfhrungszeichen ntig, 270 Bibliotheken Embedded SQL, 185 Bibliotheksfunktionen Embedded SQL, 253 BINARY, Datentypen Embedded SQL, 201 Bindevariable Info, 223

B
Befehle ADO-Befehlsobjekt, 376 Befehlsobjekt ADO, 376 Beispieldatenbank Info ber asademo.db, xiv Java in der Datenbank, 94 Beispiele DBTools-Programm, 319 Embedded SQL, 191 Embedded SQL-Anwendungen, 190 esqldll.c, 188 ODBC, 285 statische Cursor in Embedded SQL, 193 Windows-Dienste, 286 Benutzerdefinierte Klassen Java in der Datenbank, 76 Berechnete Spalten Begrenzungen, 139 erstellen, 137 INSERT-Anweisung, 138 Java in der Datenbank, 137 Neuberechnungen, 139 Trigger, 138 UPDATE-Anweisung, 138 Berechtigungen JDBC, 173 Bereich Java, 72 Bereitstellen Anwendungen, 426 Datenbanken, 439 Datenbanken auf CD-ROM, 439

469

CC
Bindungsparameter vorbereitete Anweisungen, 13 Bit-Felder Verwendung, 319 BLOBs Embedded SQL, 237 in Embedded SQL abrufen, 238 in Embedded SQL senden, 240 Block-Cursor, 22 ODBC, 29 Bookmarks ODBC-Cursor, 303 Borland C++ Untersttzung, 184 Breite Ablagen, 218 Bytecode Java-Klassen, 58 Class.forName, Methode jConnect laden, 152 classes.zip Datenbankserver bereitstellen, 438 Laufzeitklassen, 97 CLASSPATH, Umgebungsvariable einrichten, 160 Info, 82 Java in der Datenbank, 82 jConnect, 150 Clientseitiges autocommit Info, 51 CLOSE, Anweisung Info, 215 com.sybase, Paket Laufzeitklassen., 97 COMMIT, Anweisung Autocommit-Modus, 49, 50 Cursor, 52 JDBC, 164 compareTo, Methode Objektvergleiche, 120 Compiler untersttzte, 184 COMPUTE, Klausel CREATE TABLE, 137 CREATE DATABASE, Anweisung Java in der Datenbank, 99, 100 CREATE PROCEDURE, Anweisung embedded SQL-Syntax, 243 CS_CSR_ABS, 398 CS_CSR_FIRST, 398 CS_CSR_LAST, 398 CS_CSR_PREV, 398 CS_CSR_REL, 398 CS_DATA_BOUNDARY, 398 CS_DATA_SENSITIVITY, 398 CS_PROTO_DYNPROC, 398 CS_REG_NOTIF, 398

C
C, Programmiersprache Datentypen, 201 Cache Java in der Datenbank, 140 CALL, Anweisung embedded SQL, 243 Callback, Funktionen Embedded SQL, 247 registrieren, 261 Callbacks DB_CALLBACK_DEBUG_MESSAGE, 262 Catch, Block Java, 73 CD-ROM Datenbanken bereitstellen, 439 Chained, Modus Implementierung, 51 steuern, 50 Transaktionen, 49 CHAINED, Option JDBC, 164

470

DD
CS_REQ_BCP, 398 ct_command, Funktion Open Client, 394, 396 CT_CURSOR, Funktion Open Client, 395 ct_dynamic, Funktion Open Client, 394 ct_results, Funktion Open Client, 396 ct_send, Funktion Open Client, 396 Cursor, 29 abbrechen, 25, 257 abrollende, 23 ADO, 28 aktualisieren, 379, 396 aktualisieren und lschen, 24 anfordern, 27 Arbeitstabellen, 43 Beispiel C-Code, 190 beschreiben, 47 DYNAMIC SCROLL, 21, 26, 39 Dynamisch, 37 eindeutig, 26 Einfhrung, 15 Embedded SQL, 28, 215 empfindlich, 37 Empfindlichkeit, 30, 31 Empfindlichkeit, Beispiele, 32, 34 Ergebnismengen, 15 Fat, 22 Fetch-Vorgnge fr mehrere Zeilen, 22 Fetch-Vorgnge fr Zeilen, 20, 22 gespeicherte Prozeduren, 244 Info, 15 Interna, 30 Isolationsstufe (isolation level), 21 lschen, 396 Mitgliedschaft, 30 nicht-empfindlich, 39 NO SCROLL, 26, 36 ODBC, 28, 299 ODBC-Aktualisierungen, 302 ODBC-Bookmarks, 303 ODBC-Cursor-Merkmale whlen, 299 ODBC-Ergebnismengen, 300 ODBC-Lschungen, 302 OLE DB, 28 Open Client, 395 Performance, 43, 44 Plattformen, 26 positionieren, 20 Reihenfolge, 30 Savepoints, 52 Schlsselmengen-gesteuert, 40 Schreibschutz, 26 Schritt fr Schritt, 17 SCROLL, 26, 40 sichtbare nderungen, 31 Statisch, 36 Transaktionen, 52 unbestimmte Empfindlichkeit, 39 unempfindlich, 26, 36 Verfgbarkeit, 26 verwenden, 15, 20 vorbereitete Anweisungen, 19 Werte, 30 wert-empfindlich, 40 Cursor positionieren Fehlerbehandlung, 21

D
JDBCExamples.java, 144 Dateien Namenskonventionen, 416 Standorte fr die Bereitstellung, 415 Dateinamen Konventionen, 416 Sprache, 417 Versionsnummer, 416 Daten abrufen Embedded SQL, 214 Datenbankdesign Java in der Datenbank, 133 Datenbankeigenschaften db_get_property-Funktion, 258 Datenbanken bereitstellen, 439 Java in der Datenbank, 133 Java-aktivieren, 97, 99, 101 URL, 153

471

DD
Datenbankoptionen fr jConnect eingestellt, 154 Datenbankserver bereitstellen, 438 Funktionen, 267 Datenbank-Tools, Schnittstelle 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 a_validate_db-Struktur, 363 a_validate_type-Aufzhlungstypen, 369 a_writefile-Struktur, 364 an_erase_db-Struktur, 349 an_expand_db-Struktur, 350 an_unload_db-Struktur, 359 an_upgrade_db-Struktur, 361 Auffllen mit Leerzeichen, 367 Aufzhlungstypen, 367 Ausfhrlichkeit, 367 DBBackup-Funktion, 323 DBChangeLogName-Funktion, 323 DBChangeWriteFile-Funktion, 324 DBCollate-Funktion, 324 DBCompress-Funktion, 325 DBCreate-Funktion, 325 DBCreateWriteFile-Funktion, 326 DBCrypt-Funktion, 326 DBErase-Funktion, 327 DBExpand-Funktion, 327 DBInfo, Funktion, 327 DBInfoDump-Funktion, 328 DBInfoFree-Funktion, 328 DBLicense-Funktion, 329 DBStatusWriteFile-Funktion, 329 DBToolsFini-Funktion, 330 DBToolsInit-Funktion, 331 DBToolsVersion-Funktion, 332 dbtran_userlist_type-Aufzhlungstyp, 368 DBTranslateLog-Funktion, 332 DBTruncateLog-Funktion, 332 dbunload-Aufzhlungstyp, 368 DBUnload-Funktion, 333 DBUpgrade-Funktion, 333 DBValidate-Funktion, 334 dbxtract, 333 Info, 311 Datentypen Bereiche, 392 C-Datentypen, 201 dynamische SQL, 228 Embedded SQL, 196 Hostvariable, 201 Java in der Datenbank, 109 Open Client, 391 SQLDA, 230 Zuordnung, 391 Datentypkonvertierung Indikatorvariable, 206 db_backup, Funktion Info, 247, 254 DB_BACKUP_CLOSE_FILE, Parameter, 254 DB_BACKUP_END, Parameter, 254 DB_BACKUP_OPEN_FILE, Parameter, 254 DB_BACKUP_READ_PAGE, Parameter, 254 DB_BACKUP_READ_RENAME_LOG, Parameter, 254 DB_BACKUP_START, Parameter, 254 DB_CALLBACK_CONN_DROPPED, CallbackParameter, 262 DB_CALLBACK_DEBUG_MESSAGE, CallbackParameter, 262 DB_CALLBACK_FINISH, Callback-Parameter, 262 DB_CALLBACK_MESSAGE, Callback-Parameter, 263 DB_CALLBACK_START, Callback-Parameter, 262

472

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

473

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

474

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

475

EF
Dynamische Cursor Beispiel, 193 Info, 37 ODBC, 28 Dynamische SQL Info, 223 SQLDA, 228 SQL-Anweisungen, 10 statische Anweisungen, 223 Zeichenfolgen, 251 Zeilennummern, 251 Empfindliche Cursor Beispiele fr Aktualisieren, 34 Beispiele fr Lschen, 32 Einfhrung, 31 Embedded SQL, 28 Info, 37 Empfindlichkeit Beispiele fr Aktualisieren, 34 Beispiele fr Lschen, 32 Cursor, 30, 31 Isolationsstufen und, 45 Entitten Java in der Datenbank, 133 Ergebnismengen ADO-Recordset-Objekt, 377, 379 Cursor, 15 gespeicherte Prozeduren, 244 Java in der Datenbank, Gespeicherte Prozeduren, 125 Java in der Datenbank, Methoden, 125 Metadaten, 47 ODBC, 299, 304 ODBC abrufen, 300 Open Client, 396 verwenden, 20 Escapezeichen Java in der Datenbank, 80 SQL, 80 EXEC SQL Entwicklung in Embedded SQL, 187 EXECUTE, Anweisung, 223 Gespeicherte Prozeduren in Embedded SQL, 243 executeQuery, Methode Info, 169 executeUpdate, JDBC-Methode, 14 Info, 166

E
EAServer dreischichtige Datenverarbeitung, 403 Komponenten-Transaktionsattribut, 408 transaction coordinator, 407 Verteilte Transaktionen, 407 Eigenschaften db_get_property-Funktion, 258 Einbeziehung verteilte Transaktionen, 402 Eindeutige Cursor Info, 26 Eindeutige Spalten Java in der Datenbank, Spalten, 120 Eingebettete Datenbanken bereitstellen, 441 Einstellen Werte mit SQLDA, 234 Embedded SQL autocommit-Modus, 49, 50 Befehlszusammenfassung, 272 Beispielprogramm, 186 Berechtigungen, 251 Cursor, 28, 190, 215 Cursortypen, 26 Daten abrufen, 214 Dynamische Anweisungen, 223 Dynamische Cursor, 193 Einfhrung, 4 Entwicklung, 182 Funktionen, 253 Header-Dateien, 184 Hostvariable, 200 Importbibliotheken, 185 Info, 181 Kompilieren- und Verknpfen-Prozess, 183

F
Fat Cursor, 22

476

GG
Feedback geben, xv Fehler Codes, 208 SQLCODE, 208 sqlcode SQLCA-Feld, 208 Fehlerbehandlung Cursor positionieren, 21 Java, 73 Java in der Datenbank, Methoden, 124 ODBC, 306 Fehlermeldungen Embedded SQL-Funktion, 271 Felder Instanz, 67 Java in der Datenbank, 66 Klasse, 67 private, 72 protected, 72 public, 72, 83 Festschreiben Transaktionen aus ODBC, 289 Fetch ODBC, 300 FETCH, Anweisung dynamische Abfragen, 226 Info, 214, 215 mehrzeilig, 218 weit, 218 Fetch, Vorgnge abrollende Cursor, 23 Beschrnkungen, 20 Cursor, 22 Mehrere Zeilen, 22 fill_s_sqlda, Funktion Info, 269 fill_sqlda, Funktion Info, 269 Finally, Block Java, 73 FIXCHAR, Datentyp Embedded SQL, 201 ForceStart, Verbindungsparameter db_start_engine, 265 Format Java in der Datenbank, Objekte, 130 free_filled, Funktion Info, 269 free_sqlda, Funktion Info, 270 free_sqlda_noind, Funktion Info, 270 Funktionen DBTools, 323 DBTools-Funktionen aufrufen, 315 Embedded SQL, 253

G
Gemischte Cursor ODBC, 28 Gespeicherte Prozeduren Embedded SQL, 243 Ergebnismengen, 244 in dynamischem SQL ausfhren, 243 in dynamischem SQL erstellen, 243 INOUT-Parameter und Java, 127 Java in der Datenbank, 125 OUT-Parameter und Java, 127 getConnection, Methode Instanzen, 164 getObject, Methode verwenden, 176 Gleichheit Java in der Datenbank-Objekte, 119 GNU-Compiler Untersttzung, 184 GRANT, Anweisung JDBC, 173 Gro-/Kleinschreibung Java in der Datenbank und SQL, 78 Java in der Datenbank, Datentypen, 109 GROUP BY, Klausel Java in der Datenbank, Spalten, 120

477

HI

H
Handles ODBC zuweisen, 288 ber ODBC, 287 Header-Dateien Embedded SQL, 184 ODBC, 280 Heap-Gre Java in der Datenbank, 141 Hintergrundverarbeitung Callback-Funktionen, 247 Hinzufgen JAR-Dateien, 105 Klassen fr Java in der Datenbank, 104 Hostvariable benutzen, 203 Datentypen, 201 deklarieren, 200 Info, 200 SQLDA, 230

Indizes Java in der Datenbank, 120, 130, 137 INOUT, Parameter Java in der Datenbank, 127 INSERT, Anweisung Java in der Datenbank, 112 JDBC, 166, 168 mehrzeilig, 218 Objekte, 172 Performance, 12 weit, 218 INSTALL, Anweisung Einfhrung, 76 Klassenversionen, 132 verwenden, 104, 105 Installation ohne Dialog, 422 Installationsprogramme Bereitstellung, 413 Installieren JAR-Dateien in einer Datenbank, 105 Java-Klassen in einer Datenbank, 103, 104 InstallShield Adaptive Server Anywhere-Anwendungen bereitstellen, 420 Bereitstellung ohne Dialog, 422 Instanz, Felder Info, 67 Instanz, Methoden Info, 68 Instanzen Java-Klassen, 71 Instanziert Definition, 71 Interactive SQL bereitstellen, 437 Isolationsstufen Anwendungen, 51 Cursor, 21 Cursorempfindlichkeit und, 45

I
Import, Anweisung Java, 71 Java in der Datenbank, 81 jConnect, 151 Importbibliotheken Alternativen, 187 DBTools, 314 Einfhrung, 183 Embedded SQL, 185 NetWare, 188 ODBC, 280 Windows CE ODBC, 282 INCLUDE, Anweisung SQLCA, 208 Indikatorvariable Datentypkonvertierung, 206 Info, 204 krzen, 206 NULL, 205 SQLDA, 230 Zusammenfassungen der Werte, 206

478

JJ

J
Jaguar EAServer, 407 JAR- und ZIP-Datei erstellen verwenden, 105 JAR, Dateien aktualisieren, 106 hinzufgen, 105 installieren, 103, 105 Java, 71 lschen, 116 Versionen, 106 Java Catch-Block, 73 Destruktoren, 72 Fehlerbehandlung, 73 Finally-Block, 73 JDBC, 144 Klassen, 71 Konstruktoren, 72 Objekte abfragen, 174 Schnittstellen, 73 Try-Block, 73 Java 2 untersttzte Versionen, 75 Java in der Datenbank Abfragen, 117 API, 60, 75 Beispiel-Tabellen, 94 benutzen, 93 bereitstellen, 438 Bestndigkeit, 80 compareTo-Methode, 120 Datenbankdesign, 133 Datentypen, 109 die Dokumentation verwenden, 55 die wichtigsten Funktionen, 57 eine Datenbank aktivieren, 99, 101 einfgen, 112 Einfhrung, 54, 64 Escapezeichen, 80 Fehler, Prozedur nicht gefunden, 124 Felder, 66 Fragen und Antworten, 57 Heap-Gre, 141 in der Datenbank aktivieren, 97 Indizes, 120, 130

Klassen installieren, 103 Klassen kompilieren, 65 Klassen lschen, 116 Klassenversionen, 131 Laufzeitklassen, 97 Laufzeitumgebung, 75, 96 main-Methode, 79, 123 Methoden, 66 Namensbereich, 141 NULL, 109 Objekte, 66 Objekte einfgen, 114 Objekte entladen und wieder laden, 132 Objekte replizieren, 132 Objekte vergleichen, 119 Performance, 130 Praktische Einfhrung, 84 Primrschlssel, 120 Sicherheitsmanagement, Info, 128 Spalten aktualisieren, 115 Spalten berechnen, 137 Spalten erstellen, 109 Speicherfragen, 140 Speicherung, 130 Standardwerte, 109 untersttzte Klassen, 61 untersttzte Plattformen, 59 berblick, 94 Version, 75 Virtual Machine, 57, 58, 141 Werte aktualisieren, 114 Zeilen lschen, 116 Java, Datentypen abrufen, 172 einfgen, 172 Java, gespeicherte Prozeduren Beispiel, 126 Info, 125 Java, Paket Laufzeitklassen., 97 JAVA_HEAP_SIZE, Option, 141 JAVA_NAMESPACE_SIZE, Option verwenden, 141 Java-Klasse erstellen, Assistant verwenden, 85 Java-Klasse hinzufgen, Assistant verwenden, 104, 161

479

KK
Java-Klassen Hinzufgen, 104 installieren, 104 Java-Sicherheitsmanagement Info, 129 jcatalog.sql, Datei jConnect, 151 jConnect CLASSPATH, Umgebungsvariable, 150 Einrichtung der Datenbank, 151 gelieferte Versionen, 150 Info, 150 JDBC-Clients bereitstellen, 435 JDBC-Treiber whlen, 145 laden, 152 Pakete, 151 Systemobjekte, 151 URL, 152 Verbindungen, 157, 161 JDBC Arten der Benutzung, 144 AutoCommit, 164 Autocommit-Modus, 49, 50 Beispiele, 144 Berechtigungen, 173 Bespiele, 157 clientseitig, 149 Client-Verbindungen, 157 Cursortypen, 26 Datenzugriff, 165 Einfhrung, 5 Info, 144 INSERT-Anweisung, 166, 168 jConnect, 150 JDBC-Clients bereitstellen, 435 Laufzeitklassen, 97 Nicht-Standardklassen, 146, 147 SELECT-Anweisung, 169 serverseitig, 149 serverseitige Verbindungen, 161 SQL-Anweisungen, 10 Standardwerte fr die Verbindung, 164 berblick ber die Anwendungen, 145 verbinden, 157 Verbindung mit einer Datenbank, 153 Verbindungen, 149, 157 Verbindungscode, 158 Version, 75, 146, 147 Version 2.0-Funktionen, 146, 147 Voraussetzungen, 144 vorbereitete Anweisungen, 171 JDBCExamples, Klasse Info, 165 JDBC-ODBC-Brcke erforderliche Dateien, 155 JDBC-Clients bereitstellen, 435 JDBC-Treiber whlen, 145 verbinden, 155 verwenden, 155 JDBC-Treiber Kompatibilitt, 145 Performance, 145 whlen, 145 jdemo.sql Beispieltabellen, 94 JDK Definition, 60 Version, 75, 97

K
Kapazitten untersttzte, 398 Klassen aktualisieren, 106 als Datentypen, 109 Beispiel, 111 erstellen, 103 importieren, 176 Info, 64 installieren, 103 Instanzen, 71 Java, 71 kompilieren, 65 Konstruktoren, 66 Laufzeit, 75 untersttzte, 61 Versionen, 106 Klassen, Felder Info, 67 Klassen, Methoden Info, 68

480

LM
Klauseln WITH HOLD, 21 Kompilieren und Verknpfen, Prozess, 183 Komponenten Transaktionsattribut, 408 Konsolendienstprogramm bereitstellen, 437 Konstruktoren Daten einfgen, 113 Info, 66 Java, 72 Konventionen Dateinamen, 416 Dokumentation, xi Konvertierung Datentypen, 206 Krzen bei FETCH, 206 FETCH-Anweisung, 206 Indikatorvariable, 206 Lschen JAR-Dateien, 116 Java-Klassen, 116

M
main, Methode Java in der Datenbank, 79, 123 Makros _SQL_OS_NETWARE, 188 _SQL_OS_UNIX, 188 _SQL_OS_WINNT, 188 manual commit, Modus Implementierung, 51 steuern, 50 Transaktionen, 49 MAX, Funktion Java in der Datenbank, Spalten, 120 Mehrere Ergebnismengen DESCRIBE-Anweisung, 246 Mehrere Threads in Anwendungen Embedded SQL, 211 Java in der Datenbank, 124 Mehrfache Ergebnismengen ODBC, 304 Mehrzeilige Abfragen Cursor, 215 Mehrzeilige Abrufe, 218 Mehrzeilige Einfgungen, 218 Mehrzeiliges Speichern, 218 Meldungen Callback, 263 Server, 263 println Java in der Datenbank, 79 Methoden >>, 77 deklarieren, 68 Instanz, 68 Java in der Datenbank, 66 Klasse, 68 private, 72

L
Laufzeitklassen Inhalt, 97 installieren, 97 Laufzeitklassen, Java in der Datenbank, 75 Laufzeitumgebung Java in der Datenbank, 96 length, SQLDA-Feld Info, 230, 232 Lesezeichen, 29 LONG BINARY, Datentyp Embedded SQL, 201, 237 in Embedded SQL abrufen, 238 in Embedded SQL senden, 240 LONG VARCHAR, Datentyp Embedded SQL, 201, 237 in Embedded SQL abrufen, 238 in Embedded SQL senden, 240

481

NO
protected, 72 public, 72 Punktoperator, 77 statisch, 68 void-Rckgabewert, 125 Microsoft Transaction Server dreischichtige Datenverarbeitung, 403 Microsoft Visual C++ Untersttzung, 184 MIN, Funktion Java in der Datenbank, Spalten, 120 Mit Leerzeichen aufgefllt Zeichenfolgen in Embedded SQL, 196 Mitgliedschaft Ergebnismengen, 30 mlxtract, Dienstprogramm eigenes schreiben, 359 Header-Datei, 359 MobiLink, Synchronisationsserver Bereitstellung, 422 MSDASQL OLE DB-Provider, 372 NO SCROLL, Cursor Embedded SQL, 28 Info, 26, 36 ntodbc.h Info, 280 NULL Indikatorvariable, 204 Java in der Datenbank, 109 Nullabschlusszeichen fr Zeichenfolge Embedded SQL-Datentyp, 196 NULLWERT dynamische SQL, 228

O
Objekte abfragen, 174 abrufen, 172 einfgen, 172 entladen und wieder laden, 132 Java in der Datenbank, 66 Klassenversionen, 131 Replikation, 132 Speicherformat, 107 Speicherung von Java in der Datenbank, 130 Typen, 66 Objektorientierte Programmierung Java in der Datenbank, 70 Stil, 83 ODBC Abwrts-Kompatibilitt, 279 Anwendungen mit mehreren Threads, 293 Autocommit-Modus, 49, 50 Beispielanwendung, 289 Beispielprogramm, 285 bereitstellen, 427 Cursor, 28, 299 Cursortypen, 26 Datenquellen, 431 Einfhrung, 278 Einfhrung in die Programmierung, 2 Ergebnismengen, 304 Fehlerprfung, 306 gespeicherte Prozeduren, 304 Handles, 287 Header-Dateien, 280

N
name, SQLDA-Feld Info, 230 Namensbereich Java in der Datenbank, 141 NetWare Embedded SQL-Programme, 188 Newsgroups technische Untersttzung, xv Nicht-empfindlicher Cursor Beispiele fr Aktualisieren, 34 Beispiele fr Lschen, 32 Einfhrung, 31 Info, 39 NLM Embedded SQL-Programme, 188

482

PP
Importbibliotheken, 280 kein Treiber-Manager, 284 Kompatibilitt, 279 linken, 280 mehrfache Ergebnismengen, 304 programmieren, 277 Registrierungseintrge, 431 SQL-Anweisungen, 10 Treiber bereitstellen, 428 UNIX-Entwicklung, 282, 284 untersttzte Version, 278 bereinstimmung, 278 vorbereitete Anweisungen, 297 Windows CE, 281, 282 ODBC, Treiber UNIX, 283 odbc.h Info, 280 ODBC-Einstellungen bereitstellen, 428, 430 OLE DB Adaptive Server Anywhere, 372 Aktualisierungen, 379 bereitstellen, 426 Cursor, 28, 379 Cursortypen, 26 Einfhrung in die Programmierung, 3 Info, 372 ODBC und, 372 Provider bereitstellen, 426 untersttzte Plattformen, 372 untersttzte Schnittstellen, 382 OLE, Transaktionen dreischichtige Datenverarbeitung, 402 Online-Sicherungen Embedded SQL-Funktionen, 247 Open Client Adaptive Server Anywhere-Einschrnkungen, 398 Anforderungen, 390 autocommit-Modus, 49, 50 Cursortypen, 26 Datentypbereiche, 392 Datentypen, 391 Datentyp-Kompatibilitt, 391 Einfhrung, 6 Open Client-Anwendungen bereitstellen, 436 SQL, 394 SQL-Anweisungen, 10 OPEN, Anweisung Info, 215 OpenClient Einschrnkungen, 398 Schnittstelle, 389 ORDER BY, Klausel Java in der Datenbank, Spalten, 120 OUT, Parameter Java in der Datenbank, 127

P
Pakete installieren, 105 Java, 71 Java in der Datenbank, 81 jConnect, 151 Performance Cursor, 43, 44 Java in der Datenbank, Werte, 130 JDBC, 171 JDBC-Treiber, 145 vorbereitete Anweisungen, 12, 297 Personal Server bereitstellen, 441 Plattenspeicher Java in der Datenbank, Werte, 130 Plattformen Cursor, 26 Java in der Datenbank, 59 Platzhalter dynamische SQL, 223 Positionsbasierte Lsch-Vorgnge, 24 Positionsbasierte Updates Info, 21 Positionsbasierte Update-Vorgnge, 24 Prprozessor ausfhren, 184 Info, 182

483

QR
Prefetch Cursor, 44 Cursor-Performance, 43 PREFETCH, Option Cursor, 44 Prefetch-Vorgnge mehrere Zeilen abrufen, 22 PREPARE TRANSACTION, Anweisung und OpenClient, 398 PREPARE, Anweisung, 223 PreparedStatement, Klasse setObject-Methode, 114 PreparedStatement, Schnittstelle Info, 171 prepareStatement, Methode, 14 Primrschlssel Java in der Datenbank, Spalten, 120 Private Java-Zugriff, 72 Programmeinstiegspunkte DBTools-Funktionen aufrufen, 315 Programmstruktur Embedded SQL, 187 Protected Java, 71 Java-Zugriff, 72 Prozedur nicht gefunden, Fehlermeldung Java-Methoden, 168 Prozeduren Embedded SQL, 243 Ergebnismengen, 244 ODBC, 304 Public Java-Zugriff, 72 Public, Felder Wichtiges, 83 Punkt-Operator Java und SQL, 77 PUT, Anweisung, 24 mehrzeilig, 218 weit, 218 PUT, Vorgang, 24

Q
QUOTED_IDENTIFIER, Option jConnect-Einstellung, 154

R
Recordset-Objekt ADO, 377, 379 Registrierung bereitstellen, 428, 430 ODBC, 431 REMOTEPWD verwenden, 153 Replikation Java in der Datenbank, Objekte, 132 Reservierte Wrter SQL und Java in der Datenbank, 81 Ressourcen-Manager dreischichtige Datenverarbeitung, 402 Info, 400 Ressourcen-Verteiler dreischichtige Datenverarbeitung, 402 ROLLBACK TO SAVEPOINT, Anweisung Cursor, 52 ROLLBACK, Anweisung Cursor, 52 rt.jar Laufzeitklassen, 97 Rckgabecodes, 316 ODBC, 306 Rckrufe DB_CALLBACK_CONN_DROPPED, 262 DB_CALLBACK_FINISH, 262 DB_CALLBACK_MESSAGE, 263 DB_CALLBACK_START, 262 DB_CALLBACK_WAIT, 262

484

SS

S
Savepoints Cursor, 52 Schlsselmengen-gesteuerte Cursor Info, 40 ODBC, 28 Schlsselwrter SQL und Java in der Datenbank, 81 Schnittstelle Java, 73 Schnittstellenbibliothek Dateiname, 182 dynamisch laden, 187 Info, 182 Schreibgeschtzte Cursor Info, 26 Schreibschutz Datenbanken bereitstellen, 439 SCROLL, Cursor Embedded SQL, 28 Info, 26, 40 SecurityManager, Klasse Info, 128, 129 SELECT, Anweisung dynamisch, 226 einzelne Zeilen, 214 Java in der Datenbank, 117 JDBC, 169 Objekte, 172 Serialisierung Java in der Datenbank, Objekte, 130 Objekte, 175 Objekte in Tabellen, 107 verteilte Datenverarbeitung, 176 Server suchen, 268 Serveradressen Embedded SQL-Funktion, 258 setAutocommit, Methode Info, 164 setObject, Methode verwenden, 176

Setup-Programm dialogfreie Installation, 422 Sicherheit Java in der Datenbank, 128, 129 Sicherungen DBBackup, DBTools-Funktion, 323 DBTools-Beispiel, 319 Embedded SQL-Funktionen, 247 Sichtbare nderungen Cursor, 31 Software Rckgabecode, 316 Sortieren Java in der Datenbank-Objekte, 119 sp_tsql_environment, Systemprozedur Optionen fr jConnect einstellen, 154 Spalten Java in der Datenbank aktualisieren, 114 Java in der Datenbank, Datentypen, 109 Speicher Java in der Datenbank, 140 Speicherung Java in der Datenbank, Objekte, 130 Sprachen Dateinamen, 417 Sprachen-DLL erhalten, 417 spt_mda, gespeicherte Prozedur Optionen fr jConnect einstellen, 154 SQL ADO-Anwendungen, 10 Anwendungen, 10 Embedded SQL-Anwendungen, 10 JDBC-Anwendungen, 10 ODBC-Anwendungen, 10 Open Client-Anwendungen, 10 SQL Anywhere Studio Dokumentation, viii SQL Remote bereitstellen, 442 Java in der Datenbank, Objekte, 132

485

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

486

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

487

TU
Standards SQLJ, 54 Standardwerte Java in der Datenbank, 109 START JAVA, Anweisung verwenden, 141 Starten Datenbanken unter Verwendung von jConnect, 153 Statische Methoden Info, 68 Statische SQL Info, 223 Statischer Cursor Info, 36 ODBC, 28 STOP JAVA, Anweisung verwenden, 141 Strukturverdichten Header-Dateien, 184 sun, Paket Laufzeitklassen., 97 Sybase Central bereitstellen, 437 Datenbnak fr Java aktivieren, 101 JAR-Dateien hinzufgen, 105 Java-Klassen hinzufgen, 104 ZIP-Dateien hinzufgen, 105 sybase.sql, Paket Laufzeitklassen., 97 sybase.sql.ASA, Paket JDBC 2.0-Funktionen, 147 Sybase-Laufzeitklassen fr Java Info, 97 Symbole in Handbchern, xii System Management Server Systemeinfhrung, 424 Systemeinfhrung ODBC-Einstellungen, 428, 430 Registrierungseinstellungen, 428, 430 System Management Server, 424

T
Technische Untersttzung Newsgroups, xv this Java in der Datenbank, Methoden, 125 -gn, Option, 124 Threads Embedded SQL, 211 Java in der Datenbank, 124 ODBC, 278 ODBC-Anwendungen, 293 UNIX-Entwicklung, 282 TIMESTAMP, Datentyp Konvertierung, 392 Transaction coordinator EAServer, 407 Transaktionen Anwendungsentwicklung, 49 Autocommit-Modus, 49, 50 Cursor, 52 Isolationsstufe, 51 ODBC, 289 verteilt, 400, 405 Transaktionsattribut Komponente, 408 Try, Block Java, 73 Typen Objekte, 66

U
Umgebungs-Handle ODBC, 287 Unchained, Modus Implementierung, 51 steuern, 50 Transaktionen, 49 Unempfindliche Cursor Beispiele fr Aktualisieren, 34 Beispiele fr Lschen, 32 Einfhrung, 31

488

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

berlauffehler Datentyp-Konvertierung, 392

V
VARCHAR, Datentyp Embedded SQL, 201 Veraltete Java-Klassen Info, 75

489

W
VM Java Virtual Machine, 58 starten, 141 stoppen, 141 void Java in der Datenbank, Methoden, 66, 125 Vorbereiten zum Festschreiben, 403 Vorbereitete Anweisungen Bindungsparameter, 13 Cursor, 19 Java in der Datenbank, Objekte, 114 JDBC, 171 lschen, 13 ODBC, 297 Open Client, 394 verwenden, 12 Windows CE dbtool8.dll, 312 Java in der Datenbank nicht untersttzt, 59 ODBC, 281, 282 OLE DB, 372 untersttzte Versionen, 372 Windows-Dienste Beispielcode, 195 WITH HOLD, Klausel Cursor, 21 Write-Dateien bereitstellen, 418

Z
Zeichenfolgen, 251 Datentyp, 271 DT_STRING wird mit Leerzeichen aufgefllt, 196 Java in der Datenbank, 78 Zeichensatzkonvertierung JDBC-ODBC-Brcke, 156 Zeilenlnge SQL-Prprozessor-Ausgabe, 250 Zeilennummern SQL-Prprozessor, 251 Zip, Dateien Java, 71 Zugriffsmodifizierer Java, 72 Zwei-Phasen-Commit dreischichtige Datenverarbeitung, 402, 403 und OpenClient, 398

W
Watcom C/C++ Untersttzung, 184 Weite Abrufe, 22 Info, 218 Weite Einfgungen, 218 Wert-empfindlicher Cursor Beispiele fr Aktualisieren, 34 Beispiele fr Lschen, 32 Einfhrung, 31 Info, 40 Wiederherstellung verteilte Transaktionen, 406

490

You might also like