Professional Documents
Culture Documents
Stand: Bestellnummer:
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
iii
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
10
11
12
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
Index............................................................................... 467
vi
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
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/.
Syntaxkonventionen
Folgende Konventionen werden bei SQL-Syntaxbeispielen verwendet:
Schlsselwrter Alle SQL-Schlsselwrter werden wie die Wrter
Ausdrcke ersetzt werden mssen, werden wie die Wrter Eigentmer und Tabellenname im folgenden Beispiel angezeigt:
ALTER TABLE [ Eigentmer.]Tabellenname
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
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
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
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.
$ Weitere Hinweise finden Sie unter "Die OLE DB- und ADOProgrammierschnittstellen" auf Seite 371
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.
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.
K A P I T E L
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
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 );
knnen Sie SQL-Anweisungen ausfhren, indem Sie Methoden des Statement-Objekts aufrufen. Zum Beispiel:
stmt.executeUpdate( "DELETE FROM employee WHERE emp_id = 105" );
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
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
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
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.
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.
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.
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.
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.
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
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.
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.
Halten der gesamten Ergebnismenge auf dem Client zu zustzlichem Speicherbedarf fhren.
16
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.
Bereiten Sie eine Anweisung vor. Cursor verwenden blicherweise einen Anweisungs-Handle statt einer Zeichenfolge. Sie mssen eine Anweisung vorbereiten, damit ein Handle verfgbar ist.
$ Weitere Hinweise finden Sie unter "DECLARE CURSORAnweisung [ESQL] [GP]" auf Seite 412 der Dokumentation ASA SQLReferenzhandbuch. 3 ffnen Sie den Cursor.
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 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
19
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
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 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
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 Open ClientAnwendungen finden Sie unter "Cursor verwenden" auf Seite 395.
Mehrzeilen-FetchVorgnge verwenden
23
24
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.
Cursorverfgbarkeit
Nicht alle Schnittstellen bieten Untersttzung fr alle Cursortypen. ODBC und OLE DB (ADO) untersttzen 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
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.
Cursortypen auswhlen
Die Empfindlichkeit der Adaptive Server Anywhere-Cursorn wird entsprechend der Cursortyp-Anfrage des Clients gesetzt.
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
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.
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
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
der Reihenfolge oder den Werten der Ergebnismenge, wie sie durch den Cursor gesehen wird, wiedergespiegelt werden, mssen es aber nicht.
Werten der darunter liegenden Daten sind sichtbar. Die Mitgliedschaft der Ergebnismenge ist unvernderlich, wenn der Cursor geffnet ist. 31
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
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.
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
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.
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
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
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.
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
Programmierschnittstellen
Cursortyp Static
Kommentar Wenn ein aktualisierbarer statischer Cursor angefordert wird, wird statt dessen ein Wert-empfindlicher Cursor verwendet.
Embedded SQL
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
Programmierschnittstellen
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
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.
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
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
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
$ 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
ClientAnwendung
Die Empfindlichkeit und Aktualisierbarkeit beschrnken die Verwendung von zwischengeschalteten Standorten. 43
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
45
46
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.
48
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.
49
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.
Standardmig arbeitet JDBC im AUTOCOMMIT-Modus. Um AUTOCOMMIT auszuschalten, verwenden Sie die setAutoCommitMethode des Verbindungsobjekts:
conn.setAutoCommit( false );
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
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
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
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.
52
K A P I T E L
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.
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.
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
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
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
58
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
60
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.
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.
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.
64
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
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
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.
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; }
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
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; } }
70
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.
$ 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.
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
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
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
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.
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.
76
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();
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
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.
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
Das folgende Java-Codefragment ist auch gltig, wenn es in einer JavaKlasse verwendet wird.
String str = new java.lang.String( "Brandneues Objekt" );
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
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
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!;
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
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
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
Ressourcen
Erstellen Sie eine Datei mit dem Namen Invoice.java mit dem folgenden Code:
84
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
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.
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.
86
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
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
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();
Tabelle mit einer Spalte vom Typ Invoice erstellen. Fhren Sie von Interactive SQL die folgende SQL-Anweisung aus. 89
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
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
92
K A P I T E L
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
Vor den Beispielen in diesem Kapitel mssen Sie die Datei Samples\ASA\Java\jdemo.sql in Ihrem SQL Anywhere-Verzeichnis ausfhren.
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
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
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.
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.
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.
dass der erforderliche Speicher fr das Ausfhren von Java-Aufgaben vorhanden ist.
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.
97
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.
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
$ Hinweise zur Syntax finden Sie unter "CREATE DATABASEAnweisung" auf Seite 298 der Dokumentation ASA SQLReferenzhandbuch. Benutzen Sie das Dienstprogramm dbinit.
$ Hinweise zur Syntax finden Sie unter "ALTER DATABASEAnweisung" auf Seite 224 der Dokumentation ASA SQLReferenzhandbuch. Benutzen Sie das Upgrade-Dienstprogramm dbupgrad.exe.
99
Die folgende Anweisung erstellt eine Datenbankdatei temp2.db, die Java nicht untersttzt:
CREATE DATABASE c:\\sybase\\asa8\\temp2
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.
100
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
102
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
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.
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.
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
Wenn Sie einen relativen Suchpfad verwenden, muss er zum aktuellen Arbeitsverzeichnis des Datenbankservers relativ sein.
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.
105
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.
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
106
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
108
Anders als bei SQL-Datentypen bercksichtigen Java-Datentypen die Gro/Kleinschreibung. Sie mssen die Datentypen immer in der richtigen Schreibweise eingeben.
zulassen. Wenn fr eine nullwertfhige Spalte mit einem Java-Datentyp kein Standardwert gesetzt ist, enthlt die Spalte NULL.
109
110
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
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
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
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;
113
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.
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
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.
Der Einsatz von Methoden anstelle der direkten Ansprache des Feldes ist langsamer, da die Java VM laufen muss.
115
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
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
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-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.
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
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
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
122
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.
Deklarieren Sie die Methode mit einem Array von Zeichenfolgen als Argument.
public static void main( java.lang.String[] args ){ ... }
123
$ 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.
124
Die Methode setName gibt "void" und daher implizit das Objekt "Product" an SQL zurck.
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
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
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.
$ Weitere Hinweise finden Sie unter "Umwandlung von JAVA- in SQLDatentypen" auf Seite 95 der Dokumentation ASA SQL-Referenzhandbuch.
127
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.
128
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
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
130
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
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.
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
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.
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.
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
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.
137
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.
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
Trigger Sie knnen Trigger fr eine berechnete Spalte definieren, damit ein INSERT oder UPDATE in diesen Spalten den Trigger auslst.
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
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
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
142
K A P I T E L
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
143
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.
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
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.
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.
$ 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
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();
Die folgenden Klassen sind Teil der Kernschnittstelle von JDBC 2.0, stehen aber im Paket sybase.sql.ASA nicht zur Verfgung: 147
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
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.
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
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.*
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.
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
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();
152
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.
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 );
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.
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
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
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.
157
JDBC-Verbindungen herstellen
158
JDBC-Verbindungen herstellen
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.
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.
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
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.
161
JDBC-Verbindungen herstellen
} catch ( Exception e ) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } } }
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.
162
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
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 ) ;
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
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
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.
166
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.
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.
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
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).
Wenn Sie dies noch nicht getan haben, installieren Sie die Datei JDBCExamples.class in der Beispieldatenbank.
168
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
169
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
171
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.
$ 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
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
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
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
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
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.
Die Datei asademo.jar muss in Ihren CLASSPATH einbezogen sein, damit dieses Paket gefunden werden kann.
176
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
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.
178
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
180
K A P I T E L
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
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
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
184
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
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
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.
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
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.
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.
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
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
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
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++.
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:
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.
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
193
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
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
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
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.
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;
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
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.
198
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.
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
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*/
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_STRING(n)
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
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.
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
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
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.
206
Indikatorwert >0
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
1 2
Nullwert Nullwert
< 2
Nullwert
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.
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.
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)
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.
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
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.
$ Hinweise zur Abbruchanforderung finden Sie unter "AnforderungsManagement implementieren" auf Seite 247.
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.
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
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.
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.
214
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; }
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.
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
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
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 ); }
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
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
$ 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
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
226
Beenden Sie Anweisungen (drop), wenn sie nicht mehr gebraucht werden. So stellen Sie sicher, dass Anweisungen beendet werden, damit nicht unntigerweise Ressourcen gebunden bleiben.
227
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
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
sqlvar
229
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.
230
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
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.
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
DECIMAL(p,s)
DT_DECIMAL
DOUBLE FLOAT INT LONG BINARY LONG VARCHAR REAL SMALLINT TIME
TIMESTAMP
DT_TIMESTAMP
233
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
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)
keine Aktion erforderlich bis zur Lnge des Puffers aufgefllt mit Leerzeichen keine Aktion erforderlich
235
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
$ 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]; } \ \ \ \ \
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
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.
DECL_LONGBINARY-Feld enthlt die Anzahl von Byte, die in das Array abgerufen werden. Der Wert ist niemals grer als array_len.
238
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
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
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.
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
242
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
244
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;
Diese Beispiele haben statische Cursor verwendet. Dynamische Cursor knnen auch fr die CALL-Anweisung verwendet werden.
$ 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
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:
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
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.
248
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
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
an. Die erzeugten Synchronisationsskripts knnen in einer MobiLinkkonsolidierten Datenbank fr einfache Synchronisation verwendet werden.
250
#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
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
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
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
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
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
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
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
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:
"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
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
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
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
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
Liste mit Parametereinstellungen enhlt, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"
263
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
getrennte Liste mit Parametereinstellungen enhlt, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"
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
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:
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
getrennte Liste mit Parametereinstellungen enhlt, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"
265
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
getrennte Liste mit Parametereinstellungen enhlt, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"
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
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
getrennte Liste mit Parametereinstellungen enhlt, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"
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
Argumente
sqlca Ein Zeiger auf eine SQLCA-Struktur. Hinweise dazu finden Sie unter
getrennte Liste mit Parametereinstellungen enhlt, und zwar in der Form STICHWORT=Wert. Zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\\db\\MeineDatenbank.db"
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
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
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
270
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
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.
272
Datenbank deklarieren
lschen
deklarieren
erklren
Bereich abrufen.
abholen
Bereich benutzen
aktualisieren
275
276
K A P I T E L
ODBC-Programmierung
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.
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
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.
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
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.
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
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.
Solaris/Sparc
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.
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
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 );
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 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
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
Kapitel 7 ODBC-Programmierung
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
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.
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.
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).
290
Kapitel 7 ODBC-Programmierung
In den Beispielen in diesem Kapitel wird hauptschlich SQLDriverConnect verwendet.
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.
Diejenigen Verbindungsattribute festlegen, die vor dem Verbinden eingerichtet sein mssen.
291
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.
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
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.
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 );
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) ;
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.
296
Kapitel 7 ODBC-Programmierung
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);
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);
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.
298
Kapitel 7 ODBC-Programmierung
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.
299
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
$ 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
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
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
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
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
310
K A P I T E L
Die DBTools-Schnittstelle
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
Die dbtools.hHeader-Datei
312
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
314
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
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
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
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 ); }
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 ); }
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 ); }
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; }
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
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.
319
DBTools-Schnittstelle verwenden
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
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
DBTools-Funktionen
Dieser Abschnitt beschreibt die Funktionen in der DBTools-Bibliothek. Die Funktionen sind alphabetisch aufgelistet.
DBBackup-Funktion
Funktion Prototyp Parameter
Rckgabewert Anwendung
Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben. Die Funktion DBBackup verwaltet alle Datenbanksicherungs-Aufgaben.
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
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.
Siehe auch
"DBCreateWriteFile-Funktion" auf Seite 326 "DBStatusWriteFile-Funktion" auf Seite 329 "a_writefile-Struktur" auf Seite 364
DBCollate-Funktion
Funktion Prototyp Parameter
Rckgabewert Anwendung
Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.
324
Siehe auch
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.
Siehe auch
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.
Siehe auch
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.
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.
Siehe auch
326
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.
Siehe auch
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.
Siehe auch
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.
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.
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
Parameter
Parameter DB-Info
Rckgabewert Anwendung
Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.
Siehe auch
"DBInfo-Funktion" auf Seite 327 "DBInfoDump-Funktion" auf Seite 328 "a_db_info-Struktur" auf Seite 345
DBLicense-Funktion
Funktion Prototyp Parameter
Rckgabewert Anwendung
Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.
Siehe auch
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.
Siehe auch
"DBChangeWriteFile-Funktion" auf Seite 324 "DBCreateWriteFile-Funktion" auf Seite 326 "a_writefile-Struktur" auf Seite 364
DBSynchronizeLog-Funktion
Funktion Prototyp Parameter
Rckgabewert Anwendung
Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.
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
Siehe auch
DBToolsInit-Funktion
Funktion Prototyp Parameter
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
DBTools-Funktionen
DBToolsVersion-Funktion
Funktion Prototyp Rckgabewert Anwendung
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.
Siehe auch
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
Rckgabewert Anwendung
Ein Rckgabecode wie in "Rckgabecodes der Softwarekomponenten" auf Seite 316 beschrieben.
Siehe auch
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.
Siehe auch
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
Siehe auch
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.
Siehe auch
334
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
Parameter fr die Verbindung zur Datenbank. Sie haben die Form von Zeichenfolgen, zum Beispiel:
"UID=DBA;PWD=SQL;DBF=c:\asa\asademo.db"
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
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:
set_generation_number
ignore_dbsync_trunc
zap_starting_offset
"DBChangeLogName-Funktion" auf Seite 323 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.
338
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
"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
Parameter
340
Siehe auch
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
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
342
"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"
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
"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
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
"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
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
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
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_sync_db-Struktur
Funktion
Enthlt Informationen, die fr den Gebrauch des Dienstprogramms dbmlsync mit der DBTools-Bibliothek bentigt werden.
352
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
Die Parameter entsprechen Funktionen, die ber das Dienstprogramm dbmlsync zugnglich sind. In der Header-Datei dbtools.h finden Sie weitere Kommentare.
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;
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
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
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_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
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_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
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
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"
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
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"
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
"DBUpgrade-Funktion" auf Seite 333 $ Weitere Hinweise zu Callback-Funktionen finden Sie unter "CallbackFunktionen verwenden" auf Seite 316.
a_validate_db-Struktur
Funktion Syntax
363
DBTools-Strukturen
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"
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
$ 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
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.
"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
DBTools-Aufzhlungstypen
Dieser Abschnitt fhrt die Aufzhlungstypen auf, die von der DBToolsBibliothek benutzt werden. Die Aufzhlungstypen sind alphabetisch aufgefhrt.
Verbosity (Ausfhrlichkeit)
Funktion Syntax
Parameter
Siehe auch
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
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
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
368
a_validate_type-Aufzhlungstyp
Funktion Syntax
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
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.
372
Verteilte Transaktionen
Der OLE DB-Treiber kann in einer Umgebung mit verteilten Transaktionen als Ressourcen-Manager eingesetzt werden.
373
Samples\ASA\VBSampler\vbsampler.vbp Samples\ASA\ADOCE\OLEDB_PocketPC.ebp
374
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:
375
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
377
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.
378
379
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
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
381
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
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
IConvertType
383
IDBCreateCommand IDBCreateSession
IDBDataSourceAdmin
Nicht untersttzt
IDBInfo
Nicht fr CE
384
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
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
Nicht untersttzt
IRowsetCurrentIndex
Nicht untersttzt
385
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
ISourcesRowset
Nicht fr CE
ISQLErrorInfo ISupportErrorInfo
Optional fr CE
Tabellen mit Integrittsregeln erstellen, lschen und ndern Transaktionen festschreiben oder abbrechen
Nicht fr CE
ITransactionJoin
ITransactionLocal
Transaktionen fr eine Sitzung werden abgewickelt Nicht alle Kennzeichnungen werden untersttzt
Nicht fr CE
387
IviewChapter
Nicht untersttzt
IviewFilter
Nicht untersttzt
IviewRowset
Nicht untersttzt
IviewSort
Nicht untersttzt.
388
K A P I T E L
1 0
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
389
390
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
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
393
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
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
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.
396
397
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.
398
K A P I T E L
1 1
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
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.
401
Dreischichtige Datenverarbeitungsarchitektur
402
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.
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
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.
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
gelingt, werden die ausstehenden Vorgnge zurckgesetzt und die Wiederherstellung wird fortgesetzt.
406
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.
407
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
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
410
K A P I T E L
1 2
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.
412
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.
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).
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
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
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:
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.
416
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.
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.
417
Dateierweiterung
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
.dll
Windows
.so .sl .a
UNIX
Datenbankdateinamen
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
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
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
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
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
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
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
425
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.
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
Windows
Windows CE
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.
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
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.
Daten haben, aus denen sie die Informationen fr die Verbindung mit dem Server bezieht. Diese Informationen sind normalerweise in der ODBC-Datenquelle enthalten.
dbodbc8.dll
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
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
Pfad\dbodbc8.dll Pfad\dbodbc8.dll
429
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
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
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
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.
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
Datenquelle
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
Daten haben, aus denen sie die Informationen fr die Verbindung mit dem Server bezieht. Diese Informationen knnen in die ODBCDatenquelle aufgenommen werden.
dblib8.dll dblgen8.dll
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.
434
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.
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
$ Weitere Hinweise zu URL finden Sie unter "Einem Server einen URL
liefern" auf Seite 152.
$ 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
437
dbeng8.exe dbsrv8.exe dbserv8.dll dbserv8.dll dblgen8.dll oder dblgde8.dll dbjava8.dll (1) dbctrs8.dll dbextf.dll
(2)
dbsrv8.nlm
Nicht zutreffend Nicht zutreffend
libdbextf.so
asajdbc.zip (1,3) asajrt12.zip (1,3) classes.zip (1,3) dbmem.vxd (4) libunic.dll asa.cvf Verzeichnis charsets\
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
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.
$ Weitere Hinweise zu Write-Dateien finden Sie unter "Mit WriteDateien arbeiten" auf Seite 247 der Dokumentation ASA Datenbankadministration.
440
Datenbankserver.
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.
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
Beschreibung Bibliothek der Datenbanktools Zustzliche Bibliothek Sprachen-Ressourcebibliothek Verbindungsdialog (nur dbisqlc)
Windows
UNIX
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.
Windows
UNIX
dbremote.exe dbtool8.dll dbwtsp8.dll dblgen8.dll dbvim8.dll dbsmtp8.dll dbfile8.dll dbftp8.dll dbmapi8.dll dblib8.dll
libdbfile8.so
Stellen Sie nur die Bibliothek fr die Nachrichtenverbindung bereit, die die Anwendung benutzen wird.
442
443
444
K A P I T E L
1 3
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
2603
446
2631
2633 2634
2635
447
448
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.
Eine C-Zeichenfolge war in einer Embedded SQL-Anweisung erforderlich (fr einen Cursornamen, Optionsnamen etc.), und der bergebene Wert war keine C-Zeichenfolge.
Sie haben eine Hostvariable, die kein Ganzzahltyp ist, in einer Anweisung verwendet, in der nur Hostvariablen vom Ganzzahltyp zulssig sind.
450
Fehler
Die angegebene Include-Datei wurde nicht gefunden. Beachten Sie, dass der Prprozessor die INCLUDE-Umgebungsvariable zur Suche nach IncludeDateien verwendet.
Sie haben den Makro DECL_FIXCHAR benutzt, um eine Hostvariable des Typs FIXCHAR zu deklarieren, aber keine Lnge angegeben.
Sie haben eine Funktion benutzt, die von UltraLite nicht untersttzt wird.
Sie haben dieselbe Hostvariable mehrere Male mit unterschiedlichen Indikatorvariablen in derselben Anweisung verwendet. Dies wird nicht untersttzt.
451
SQLPP-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.
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.
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.
Sie haben eine INTO-Klausel mit einer DECLARE CURSOR-Anweisung verwendet. Die INTO-Klausel wird ignoriert.
452
Ungltige Arraydimension
Fehlernummer 2648 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.
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.
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.
Sie haben versucht, eine Hostvariable als Array von FIXCHAR-Arrays zu deklarieren. Dies ist kein zulssiger Hostvariablentyp.
Sie haben versucht, eine Hostvariable als Array von VARCHAR- oder BINARY-Arrays zu deklarieren. Dies ist kein zulssiger Hostvariablentyp.
454
Mgliche Ursache
Sie haben versucht, eine Hostvariable als Array von DECIMAL-Arrays zu deklarieren. Ein dezimales Array ist kein zulssiger Hostvariablentyp.
Sie haben versucht, ein Hostvariablen-Array eines Typs zu deklarieren, der nicht untersttzt wird.
Sie haben einen statischen Cursor beschrieben. Beim Beschreiben eines Cursors muss der Cursorname in einer Hostvariablen angegeben sein.
Sie haben ein Array von Zeigern als Hostvariable benutzt. Dies ist nicht zulssig.
Ein Embedded SQL-Cursorname wurde benutzt (in FETCH, OPEN, CLOSE etc.), ohne vorher deklariert worden zu sein.
455
SQLPP-Fehler
Die in der SET DESCRIPTOR-Anweisung benutzte Variable wurde nicht als Hostvariable deklariert.
Beim Lesen aus einer temporren Datei ist ein Fehler aufgetreten.
Dasselbe Schlsselwort wurde mehr als einmal in einer einzigen SET DESCRIPTOR-Anweisung verwendet.
Volles SQL-Merkmal
Fehlernummer 2668 Fehlertyp Markierung (Warnung oder Fehler)
456
Mgliche Ursache
Sie haben eine volle SQL/92-Funktion verwendet und mit den Optionen -ee, -ei, -we oder -wi im Prprozessor verarbeitet.
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.
Dieselbe Hostvariable wurden in demselben Modul mit zwei verschiedenen Typen definiert. Beachten Sie, dass die Hostvariablen in einem C-Modul global sind.
Sie haben eine Hostvariable in einer Anweisung benutzt, und diese Hostvariable wurde nicht in einem Declare-Abschnitt deklariert.
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.
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-Syntax
Fehlernummer 2636 Mgliche Ursache Fehlertyp Fehler
Eine Embedded SQL-spezifische Anweisung (OPEN, DECLARE, FETCH etc.) hat einen Syntaxfehler.
458
Sie haben eine Indikatorvariable in einer Anweisung benutzt, und diese Indikatorvariable wurde nicht in einem Declare-Abschnitt deklariert.
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
Ein ungltiges oder unbekanntes Schlsselwort ist in einer SET DESCRIPTOR-Anweisung vorhanden. Schlsselwrter knnen nur sein: TYPE, PRECISION, SCALE, LENGTH, INDICATOR oder DATA.
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.
Indikatorvariable mssen den Typ "short int" haben. Sie haben eine Variable eines anderen Typs als Indikatorvariable verwendet.
460
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.
Bei der Verwendung von DECL_LONGBINARY oder DECL_LONGVARCHAR mit UltraLite ist die Obergrenze fr das Array 64 KByte.
Sie haben eine Zeichenfolgenkonstante in einer Embedded SQL-Anweisung eingegeben, aber es ist kein schlieendes Anfhrungszeichen fr das Zeilenende oder das Dateiende vorhanden.
Die angegebene Anweisung bentigt die Angabe von Hostvariablen in einer Hostvariablenliste oder aus einer SQLDA.
461
SQLPP-Fehler
Ein Cursor ist deklariert und geffnet, wird aber nie verwendet.
Sie haben eine statische Embedded-SQL-SELECT-Anweisung angegeben, aber keine INTO-Klausel fr die Ergebnisse festgelegt.
Ein Cursor ist deklariert und mglicherweise benutzt, wird aber nie geffnet.
462
Sie haben versucht, eine Hostvariable als Array von Zeichen-Arrays zu deklarieren. Dies ist kein zulssiger Hostvariablentyp.
Sie mssen die Dezimalstellen angeben, wenn Sie eine gepackte dezimale Hostvariable mit dem Makro DECL_DECIMAL deklarieren. Die Gesamtstellenanzahl ist fakultativ.
Ein Embedded SQL-Anweisungsname wurde benutzt (EXECUTE), ohne vorher vorbereitet worden zu sein.
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
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.
Sie haben eine SQL-Anweisung benutzt, die wahrscheinlich einen Syntaxfehler generieren wird, sobald sie an die Datenbankengine geschickt wurde.
465
SQLPP-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.
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
>
>> 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
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