Odbc
Odbc
Odbc
Programmers Manual
ii
Table of Contents
1 Table of Contents
2 Introduction
Organization of this Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Document Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
How to Use This Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Typographical Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 15
Command-Line Conventions . . . . . . . . . . . . . . . . . . . . . . . . 16
Example Code Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 17
3 ODBC Theory of Operation
ODBC History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
ODBC Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
ODBC Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Driver Manager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Data Source. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Types of Drivers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Single-Tier Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Multiple-Tier Configuration . . . . . . . . . . . . . . . . . . . . . . . . . 24
Network Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Matching an Application to a Driver . . . . . . . . . . . . . . . . . . . . . . . . 28
ODBC Conformance Levels . . . . . . . . . . . . . . . . . . . . . . . . . 28
How to Select a Set of Functionality . . . . . . . . . . . . . . . . . . 32
Connections and Transactions . . . . . . . . . . . . . . . . . . . . . . . 33
4 A Short History of SQL
SQL Background Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
ANSI 1989 Standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Embedded SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Current ANSI Specification . . . . . . . . . . . . . . . . . . . . . . . . . 37
Dynamic SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Call Level Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5 Guidelines for Calling ODBC Functions
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Determining Driver Conformance Levels . . . . . . . . . . . . . . . . . . . . 41
Determining API Conformance Levels . . . . . . . . . . . . . . . . 42
Determining SQL Conformance Levels . . . . . . . . . . . . . . . . 42
Using the Driver Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Calling ODBC Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Environment, Connection, and Statement Handles . . . . . . . 45
Using Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
ODBC Function Return Codes . . . . . . . . . . . . . . . . . . . . . . . 46
6 Basic Application Steps
7 Connecting to a Data Source
About Data Sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Initializing the ODBC Environment . . . . . . . . . . . . . . . . . . . . . . . . 52
Allocating a Connection Handle . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Connecting to a Data Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
ODBC Extensions for Connections . . . . . . . . . . . . . . . . . . . . . . . . . 54
Connecting to a Data Source With SQLDriverConnect . . . . 54
Connection Browsing With SQLBrowse Connect . . . . . . . . 56
Translating Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Additional Extension Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
8 Executing SQL Statements
Allocating a Statement Handle . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Executing an SQL Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Prepared Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Direct Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Setting Parameter Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
iv
Performing Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
ODBC Extensions for Connections . . . . . . . . . . . . . . . . . . . . . . . . . 67
Retrieving Information About the Data Sources Catalog . . 67
Sending Parameter Data at Execution Time . . . . . . . . . . . . . 68
Specifying Arrays of Parameter Values . . . . . . . . . . . . . . . . 69
Executing Functions Asynchronously . . . . . . . . . . . . . . . . . 69
Using ODBC Extensions to SQL . . . . . . . . . . . . . . . . . . . . . 71
Additional Extension Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
9 Retrieving Results
Assigning Storage for Results (Binding) . . . . . . . . . . . . . . . . . . . . . 80
Determining the Characteristics of a Result Set . . . . . . . . . . . . . . . 80
Fetching Result Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Using Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
ODBC Extensions for Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Retrieving Data from Unbound Columns . . . . . . . . . . . . . . . 82
Assigning Storage for Rowsets (Binding) . . . . . . . . . . . . . . 83
Retrieving Rowset Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Using Block and Scrollable Cursors . . . . . . . . . . . . . . . . . . . 85
Using Bookmarks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Modifying Result Set Data . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Processing Multiple Results . . . . . . . . . . . . . . . . . . . . . . . . . 93
10 Retrieving Status and Error Information
Function Return Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Retrieving Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
ODBC Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Error Text Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Sample Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Processing Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
11 Terminating Transactions and Connections
Terminating Statement Processing . . . . . . . . . . . . . . . . . . . . . . . . 103
Terminating Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Terminating Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
SQLMoreResults . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
SQLNativeSql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
SQLNumParams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
SQLNumResultCols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
SQLParamData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
SQLParamOptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
SQLPrepare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
SQLPrimaryKeys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
SQLProcedureColumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
SQLProcedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
SQLPutData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
SQLRowCount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
SQLSetConnectOption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
SQLSetCursorName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
SQLSetParam . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
SQLSetPos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
SQLSetScrollOptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
SQLSetStmtOption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
SQLSpecialColumns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
SQLStatistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
SQLTablePrivileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
SQLTables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
SQLTransact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
24 Setup Shared Library Function Reference
ConfigDSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
ConfigTranslator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
25 TranslationShared Library Function Reference
SQLDataSourceToDriver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
SQLDriverToDataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
26 ODBC Error Codes
27 ODBC State Transition Tables
x
28 SQL Grammar
29 Data Types
30 Comparison Between Embedded SQL and ODBC
31 Scalar Functions
32 ODBC Cursor Library
33 Index
xii
Introduction
Organization of this Manual
This manual is organized into the following parts:
Part 2 Developing Applications, containing information for developing applications using the ODBC interface;
Part 5 API Reference, containing syntax and semantic information for all ODBC
functions.
Document Conventions
This manual uses the following typographic conventions.
Format
Used for
ALTER TABLE
RETCODE SQLFetch(hdbc)
Introduction 13
Format
Used for
argument
SQLTransact
Bold type indicates that syntax must be typed exactly as shown, including function names. Bold
type is also used to indicate filenames.
[]
{}
...
.
.
.
14
Typographical Conventions
Typographical Conventions
. The following typographical conventions are used throughout this manual:
italics
boldface
computer
KEYWORD
Additionally, when you are instructed to enter or execute text, immediately press
RETURN after the entry. When you are instructed to type the text or press a key, no
RETURN is required.
Introduction 15
Command-Line Conventions
Command-Line Conventions
OnLine supports a variety of command-line options. You enter these commands at the
operating-system prompt to perform certain functions as part of OnLine administration.
This section defines and illustrates the format of the commands. These commands have
their own conventions, which may include alternative forms of a command, required and
optional parts of the command, and so forth.
Each diagram displays the sequences of required and optional elements that are valid in a
command. A diagram begins at the upper left with a command. It ends at the upper right
with a vertical line. Between these points, you can trace any path that does not stop or back
up. Each path describes a valid form of the command. You must supply a value for words
that are in italics.
Along a command-line path, you might encounter the following elements:
command
variable
-flag
.ext
16
(.,;+*-/)
...
For detailed directions on using SQL statements for a particular application development
tool or SQL API, see the manual for your product.
Note that an ellipsis (...) in the example code indicates that arguments can be repeated several times.
Also note that a column of three dots in the example indicates that more code would be
added in a full application, but it is not necessary to show it to describe the concept being
discussed.
Introduction 17
18
Chapter 34
ODBC History
In the traditional database world, application has usually meant a program that performed
a specific database task with a specific DBMS in mind such as payroll, financial analysis, or
inventory management. Such applications have typically been written using embedded
SQL. While embedded Core SQL Grammar is efficient and is portable across different hardware and operating system environments, the source code must be recompiled for each
new environment.
ODBC offers a new approach: provide a separate program to extract the database information, and then have a way for applications to import the data. Since there are and probably
always will be many viable communication methods, data protocols, and DBMS capabilities, the ODBC solution is to allow different technologies to be used by defining a standard
interface. This solution leads to theidea of database drivers shared libraries that an application can invoke on demand to gain access to a particular data source through a particular
communications method, much like a device driver running under UNIX. ODBC provides
the standard interface that allows both application writers and providers of libraries to
shuttle data between applications and data sources.
19
ODBC Interface
ODBC Interface
The ODBC interface defines the following:
SQL SQLsyntax based on the X/Open and SQL Access Group (SAG) SQL CAE
specification (1992
The same object code can be used to access different DBMS products.
Data values can be sent and retrieved in a format convenient to the application.
Core functions are based on the X/Open and SQL Access Group Call Level Interface specification.
Extended functions support additional functionality, including scrollable cursors and asynchronous processing.
20
ODBC Components
ODBC Components
The ODBC architecture has four components:
Application
Performs application processing and calls ODBC functions to submit SQL statements and retrieve results.
Driver Manager
Driver
Data source
Consists of the data the user wants to access and its associated operating system, DBMS, and network platform
(if any) used to access the DBMS.
The Driver Manager and driver appear to an application as one unit that processes ODBC
function calls. The following diagram shows the relationship between the four components. The following paragraphs describe each component in more detail.
Data Source
Driver
ODBC
Interface
Application
Figure 0-1
fb figure border
Data Source
Driver Manager
Driver
Data Source
Driver
21
Application
Application
An application using the ODBC interface performs the following tasks.
Defines storage areas and data formats for the results of SQL requests.
Requests results.
Processes errors.
Driver Manager
Uses the .odbc.ini file to map a data source name to a specific driver shared
library.
Driver
A driver is a shared library that implements ODBC function calls and interacts with a
data source.
The Driver Manager loads a driver when the application calls the SQLBrowseConnect,
SQLConnect, or SQLDriverConnect function.
22
Data Source
A driver performs the following tasks in response to ODBC function calls from an application:
Formats errors into standard error codes and returns them to the application.
Data Source
In this manual, DBMS refers to the general features and functionality provided by an SQL
database management system. A data source is a specific instance of a combination of a
DBMS product and any remote operating system and network necessary to access it.
An application establishes a connection with a particular vendors DBMS product on a
particular operating system, accessible by a particular network. For example, the application might establish connections to:
A local ISAM file, in which case the network and remote operating system are not
part of the communication path
Types of Drivers
ODBC defines two types of drivers . A Single-tier driver processes both ODBC calls and
SQL statements. (In this case, the driver performs part of the data source functionality.) A
Multiple-tier driver processes ODBC calls and passes SQL statements to the data source.
Single-Tier Configuration
Single-Tier Configuration
In a single-tier implementation, the database file is processed directly by the driver. The
driver processes SQL statements and retrieves information from the database. A driver
that manipulates an ISAM file is an example of a single-tier implementation.
A single-tier driver may limit the set of SQL statements that may be submitted. The minimum set of SQL statements that must be supported by a single-tier driver is defined in
Appendix C, SQL Grammar.
The following diagram shows two types of single-tier configurations
.
Figure 0-2
fbw figure border wide
System A
Application
Driver Manager
Driver (includes data
access software)
Data Storage
Server B
Client B
Application
Driver Manager
Driver (includes data
access software)
Data Storage
Multiple-Tier Configuration
In a multiple-tier configuration, the driver sends SQL requests to a server that processes
SQL requests.
24
Multiple-Tier Configuration
Although the entire installation may reside on a single system, it is more often divided
across platforms. The application, driver, and Driver Manager reside on one system,
called the client. The database and the software that controls access to the database typically reside on another system, called the server.
Another type of multiple-tier configuration is a gateway architecture. The driver passes
SQL requests to a gateway process, which in turn sends the requests to the data source.
The following diagram shows three types of multiple-tier configurations. From an applications perspective, all three configurations are identical.
.
Figure 0-3
fbw figure border wide
System C
Application
Driver Manager
Driver
Data access software
Data Storage
Server D
Client D
Application
Driver Manager
Driver
Client E
Application
Driver Manager
Driver
Data Storage
Data Storage
Server E2
Data Storage
Gateway Software
25
Network Example
Network Example
The following diagram shows how each of the preceding configurations could appear
in a single network. The diagram includes examples of the types of DBMSs that could
reside in a network.
Server E1
26
Network Example
Figure 0-4
fbw figure border wide
System A
(Standalone Xbase file
on local disk)
Server B
Client B
Data Storage
Server D
(Oracle DBMS on UNIX
System C
Data Storage
Server E2
(standalone DBMS
server; SQL server
on OS/2)
Gateway
Server E1
(DB2 on MVS)
Client D
Data Storage
(to Oracle DBMS on
UNIX server)
Client E
(to DB2 via Gateway)
27
Figure 0-5
fb figure border
Client F
Server F
application and driver developers by establishing standard sets of functionality. Applications can easily determine if a driver provides the functionality they need. Drivers can
be developed to support a broad selection of applications without being concerned
about the specific requirements of each application.
To claim that it conforms to a given API or SQL conformance level, a driver must support
all the functionality in that conformance level, regardless of whether that functionality
is supported by the DBMS associated with the driver. However, conformance levels do
28
not restrict drivers to the functionality in the levels to which they conform. Driver developers are encouraged to support as much functionality as they can; applications can
determine the functionality supported by a driver by calling SQLGetInfo, SQLGetFunctions, and SQLGetTypeInfo.
Important: Many ODBC applications require that drivers support all of the functions
in the Level 1 API conformance level. To ensure that their driver works with most
ODBC applications, driver developers should implement all Level 1 functions.
Core API
Retrieve data from a result set. Retrieve information about a result set.
Level 1 API
Retrieve part or all of a result column value (useful for long data).
29
Retrieve information about driver and data source capabilities, such as supported data types, scalar functions, and ODBC functions.
Level 2 API
For a list of functions and their conformance levels, see Chapter 20, Function Summary.
Note Each function description in this manual indicates whether the function is a core
function or a level 1 or level 2 extension function.
30
DDL: ALTER TABLE, CREATE INDEX, DROP INDEX, CREATE VIEW, DROP VIEW,
GRANT, and REVOKE.
Note In ODBC 1.0, positioned update, positioned delete, and SELECT FOR
UPDATE statements and the UNION clause were part of the core SQL grammar;
in ODBC 2.0, they are part of the extended grammar. Applications that use the
SQL conformance level to determine whether these statements are supported
also need to check the version number of the driver to correctly interpret the
information. In particular, applications that use these features with ODBC 1.0
drivers need to explicitly check for these capabilities in ODBC 2.0 drivers.
Expressions: scalar functions such as SUBSTRING and ABS, date, time, and
timestamp literals.
Procedure calls.
For more information about SQL statements and conformance levels, see Appendix C, SQL Grammar. The grammar listed in Appendix C is not intended to
restrict the set of statements that an application can submit for execution. Drivers
should support data sourcespecific extensions to the SQL language, although
interoperable applications should not rely on those extensions. For more information about data types, see Appendix D, Data Types.
31
The data sources to be accessed by the application and the extent to which the
application must be interoperable among these data sources.
32
Use all the drivers and not dim any columns. The application behaves the same
for all data sources, but has reduced functionality: the user might attempt to
update data in a column for which they do not have update privileges. The
application returns an error message only when the driver attempts to update
the data in the data source.
Use all the drivers and, for drivers that support SQLColumnPrivileges, dim
columns the user cannot update. Otherwise, warn the user that they might not
have update privileges on all columns. The application behaves differently for
different data sources but has increased functionality: the application supports
all drivers and sometimes dims columns the user cannot update.
Use all the drivers and always dim columns the user cannot update; the application locally implements SQLColumnPrivileges for those drivers that do not
support it. The application behaves the same for all data sources and has maximum functionality. However, the developer must know how to retrieve column
privileges from some of the data sources, the application contains data source
specific code, and developement time is longer.
Developers of specialized applications may make different trade-offs than developers of
generalized applications. For example, the developer of an application that only transfers
data between two DBMSs (each from a different vendor) can safely exploit the full functionality of each of the drivers.
Before an application can use ODBC, it must initialize ODBC and request an
environment handle (henv). To communicate with a data source, the application
must request a connection handle (hdbc) and connect to the data source. The
application uses the environment and connection handles in subsequent ODBC
calls to refer to the environment and specific connection.
An application may request multiple connections for one or more data sources.
Each connection is considered a separate transaction space.
A driver maintains a transaction for each active connection. The application can
request that each SQL statement be automatically committed on completion;
otherwise, the driver waits for an explicit commit or rollback request from the
application. When the driver performs a commit or rollback operation, the driver
resets all statement requests associated with the connection.
The Driver Manager manages the work of allowing an application to switch connections while transactions are in progress on the current connection.
Figure 0-6
fbw figure border wide
33
34
Chapter 35
35
Embedded SQL
The current standard is ANSI 1989, which defines three programmatic interfaces to SQL :
Module language
Embedded SQL
Allows SQL statements to be embedded within a program. The specification defines embedded statements
for COBOL, FORTRAN, Pascal, and PL/1.
Direct invocation
Access is implementation-defined.
Embedded SQL
Embedded SQL allows programmers to place SQL statements into programs written in a
standard programming language (for example, COBOL or Pascal), which is termed the
host language. SQL statements are delimited with specific starting and ending statements defined by the host language. The resulting program contains source code from
two languages SQL and the host language.
When compiling a program with embedded SQL statements, a precompiler translates
the SQL statements into equivalent host language source code. After precompiling, the
host language compiler compiles the resulting source code.
In the ANSI 1989 standard, the embedded SQL only supports static SQL . Static SQL has
the following characteristics:
To use static SQL , define each SQL statement within the program source code. Specify
the number of result columns and their data types before compiling.
Variables called host variables are accessible to both the host-language code and to SQL
requests. However, host variables cannot be used for column names or table names.
Host variables are fully defined (including length and data type) prior to compilation.
If an SQL request is submitted that returns more than one row of data, define a cursor
that points to one row of result data at a time.
36
Each run of the associated program performs exactly the same SQL request, with possible
variety in the values of host variables. All table names and column names must remain
the same from one execution of the program to the next; otherwise, the program must be
recompiled.
Use standard data storage areas for status and error information.
Static SQL is efficient; SQL statements can be precompiled prior to execution and run
multiple times without recompiling. The application is bound to a particular DBMS when
it is compiled.
Static SQL cannot defer the definition of the SQL statement until run time. Therefore,
static SQL is not the best option for client-server configurations or for ad hoc requests.
Dynamic SQL
Dynamic SQL , which is included in the most recent ANSI specification, allows an application to generate and execute SQL statements at run time.
Dynamic SQL statements can be prepared. When a statement is prepared, the database
environment generates an access plan and a description of the result set. The statement
can be executed multiple times with the previously generated access plan, which minimizes processing overhead.
37
38
Interoperability
Interoperability
Interoperability for call level interfaces can be addressed in the following ways:
All clients adhere to a standard interface; driver programs interpret the commands for a specific data source.
The second approach allows drivers to shield clients from database functionality differences, database protocol differences, and network differences. ODBC follows the second
approach. ODBC can take advantage of standard database protocols and network protocols, but does not require the use of a standard database protocol or network protocol.
39
Interoperability
40
Chapter 36
Overview
Each ODBC function name starts with the prefix SQL. Each function accepts one or more
arguments. Arguments are defined as input (to the driver) or output (from the driver).
C programs that call ODBC functions must include the sql.h and sqlext.h header files.
These files define ODBC constants and types and provide function prototypes for all ODBC
functions.
41
The following sections refer to SQLGetInfo and SQLGetTypeInfo, which are part of the
Level 1 API conformance level. Although it is strongly recommended that drivers support this conformance level, drivers are not required to do so. If these functions are not
supported, an application developer must consult the driver documentation to determine its conformance levels.
42
Whenever an application calls an ODBC function, the Driver Manager performs one of
the following actions:
For SQLDataSources and SQLDrivers, the Driver Manager processes the call. It does not pass
the call to the driver.
For SQLGetFunctions, the Driver Manager passes the call to the driver associated with
the connection. If the driver does not support SQLGetFunctions, the Driver Manager
processes the call.
For SQLAllocEnv, SQLAllocConnect, SQLSetConnectOption, SQLFreeConnect, and
SQLFreeEnv, the Driver Manager processes the call. The Driver Manager calls SQLAllocEnv, SQLAllocConnect, and SQLSetConnectOption in the driver when the application
calls a function to connect to the data source (SQLConnect, SQLDriverConnect, or SQLBrowseConnect). The Driver Manager calls SQLFreeConnect and SQLFreeEnv in the
driver when the application calls SQLDisconnect.
For SQLConnect, SQLDriverConnect, SQLBrowseConnect, and SQLError, the Driver
Manager performs initial processing then passes the call to the driver associated with the
connection.
For any other ODBC function, the Driver Manager passes the call to the driver associated
with the connection.
If requested, the Driver Manager records each called function in a trace file. The name of
each function is recorded, along with the values of the input arguments and the names
of the output arguments (as listed in the function definitions).
Buffers
An application passes data to a driver in an input buffer. The driver returns data to an
application in an output buffer. The application must allocate memory for both input and
output buffers. (If the application will use the buffer to retrieve string data, the buffer
must contain space for the null termination byte.)
43
Buffers
Note that some functions accept pointers to buffers that are later used by other functions. The application must ensure that these pointers remain valid until all applicable
functions have used them. For example, the argument rgbValue in SQLBindCol points
to an output buffer in which SQLFetch returns the data for a column.
Input Buffers
An application passes the address and length of an input buffer to a driver. The length
of the buffer must be one of the following values:
A length greater than or equal to zero. This is the actual length of the data in the input
buffer. For character data, a length of zero indicates that the data is an empty (zero
length) string. Note that this is different from a null pointer. If the application specifies
the length of character data, the character data does not need to be null-terminated.
SQL_NTS. This specifies that a character data value is null-terminated.
SQL_NULL_DATA. This tells the driver to ignore the value in the input buffer and use a
NULL data value instead. It is only valid when the input buffer is used to provide the
value of a parameter in an SQL statement.
The operation of ODBC functions on character data containing embedded null characters
is undefined, and is not recommended for maximum interoperability.
Unless it is specifically prohibited in a function description, the address of an input
buffer may be a null pointer. When the address of an input buffer is a null pointer, the
value of the corresponding buffer length argument is ignored.
For more information about input buffers, see Converting Data from C to SQL Data
Types in Appendix D, Data Types.
Output Buffers
An application passes the following arguments to a driver, so that it can return data in
an output buffer:
The address of the buffer in which the driver returns the data (the output buffer). Unless
it is specifically prohibited in a function description, the address of an output buffer can
be a null pointer. In this case, the driver does not return anything in the buffer and, in
the absence of other errors, returns SQL_SUCCESS.
If necessary, the driver converts data before returning it. The driver always null-terminates character data before returning it.
44
The length of the buffer. This is ignored by the driver if the returned data has a fixed length in C,
such as an integer, real number, or date structure.
The address of a variable in which the driver returns the length of the data (the length buffer). The
returned length of the data is SQL_NULL_DATA if the data is a NULL value in a result set. Otherwise, it is the number of bytes of data available to return. If the driver converts the data, it is the
number of bytes after the conversion. For character data, it does not include the null termination
byte added by the driver.
If the output buffer is too small, the driver attempts to truncate the data. If the truncation does not
cause a loss of significant data, the driver returns the truncated data in the output buffer, returns
the length of the available data (as opposed to the length of the truncated data) in the length buffer,
and returns SQL_SUCCESS_WITH_INFO. If the truncation causes a loss of significant data, the
driver leaves the output and length buffers untouched and returns SQL_ERROR. The application
calls SQLError to retrieve information about the truncation or the error.
For more information about output buffers, see Converting Data from SQL to C Data Types in
Appendix D, Data Types.
45
Statement handles identify memory storage for information about an SQL statement. ODBC
defines statement handles as variables of type HSTMT. An application must request a statement
handle prior to submitting SQL requests. Each statement handle is associated with exactly one
connection handle. Each connection handle can, however, have multiple statement handles associated with it.
For more information about requesting a connection handle, see Chapter 5, Connecting
to a Data Source. For more information about requesting a statement handle, see Chapter 6, Executing SQL Statements.
46
SQL_ERROR
SQL_INVALID_HANDLE
SQL_STILL_EXECUTING
SQL_NEED_DATA
47
48
Chapter 37
Connects to the data source, specifying the data source name and any additional
information needed to complete the connection.
2.
The application places the SQL text string in a buffer. If the statement includes
parameter markers, it sets the parameter values.
If the statement returns a result set, the application assigns a cursor name for
the statement or allows the driver to do so
If the statement creates a result set, the application can inquire about the
attributes of the result set, such as the number of columns and the name and
type of a specific column. It assigns storage for each column in the result set
and fetches the results.
3.
4.
Terminates the connection when it has finished interacting with the data source.
The following diagram lists the ODBC function calls that an application makes to connect
to a data source, process SQL statements, and disconnect from the data source. Depending
on its needs, an application may call other ODBC functions.
49
SQLAllocEnv
SQLAllocConnect
SQLConnect
SQLAllocStmt
50
Chapter 38
51
Suppose also that an Rdb driver needs the ID of the last user to log in, a server name, and
a schema declaration statement. The section that describes the Personnel data source
might be:
[Personnel]
Driver=/opt/odbc/drivers/rdb.so
Description=Personnel database: CURLY
Lastuid=smithjo
Server=curly
Schema=attach filename sys$device:[corpdata]personnel.rdb
For more information about data sources and how to configure them, see Chapter 19,
Configuring Data Sources.
Declares a variable of type HENV. For example, the application could use the
declaration:
HENV henv1;
2.
Calls SQLAllocEnv and passes it the address of the variable. The driver initializes the ODBC environment, allocates memory to store information about the
environment, and returns the environment handle in the variable.
52
Declares a variable of type HDBC. For example, the application could use the declaration:
2.
Calls SQLAllocConnect and passes it the address of the variable. The driver
allocates memory to store information about the connection and returns the connection handle in the variable.
HDBC hdbc1;
User ID The login ID or account name for access to the data source, if appropriate (optional).
When an application calls SQLConnect, the Driver Manager uses the data source name
to read the name of the driver shared library from the appropriate section of the .odbc.ini
file. It then loads the driver shared library and passes the SQLConnect arguments to it.
If the driver needs additional information to connect to the data source, it reads this information from the same section of the .odbc.ini file.
If the application specifies a data source name that is not in the .odbc.ini file, or if the
application does not specify a data source name, the Driver Manager searches for the
default data source specification. If it finds the default data source, it loads the default
driver shared library and passes the application-specified data source name to it. If there
is no default data source, the Driver Manager returns an error.
53
Data sources that require more connection information than the three arguments in SQLConnect.
SQLDriverConnect uses a connection string to specify the information needed to connect to a driver and data source
A connection string contains the following information:
The connection string is a more flexible interface than the data source name, user ID, and
password used by SQLConnect. The application can use the connection string for multiple levels of login authorization or to convey other data sourcespecific connection
information.
An application calls SQLDriverConnect in one of three ways:
54
Specifies a connection string that contains a data source name. The Driver Manager retrieves the full path of the driver shared library associated with the data
source from the .odbc.ini file. To retrieve a list of data source names, an application calls SQLDataSources.
Specifies a connection string that contains a driver description. The Driver Manager retrieves the full path of the driver shared library. To retrieve a list of driver
descriptions, an application calls SQLDrivers.
Specifies a connection string that does not contain a data source name or a driver
description. The Driver Manager displays a dialog box from which the user
selects a data source name. The Driver Manager then retrieves the full path of the
driver shared library associated with the data source.
The Driver Manager then loads the driver shared library and passes the SQLDriverConnect arguments to it.
The application may pass all the connection information the driver needs. It may also
request that the driver always prompt the user for connection information or only
prompt the user for information it needs. Finally, if a data source is specified, the driver
may read connection information from the appropriate section of the .odbc.ini file. (For
information on the structure of the .odbc.ini file, see Structure of the .odbc.ini File in
Chapter 19, Configuring Data Sources.)
After the driver connects to the data source, it returns the connection information to the
application. The application may store this information for future use.
If the application specifies a data source name that is not in the .odbc.ini, the Driver Manager searches for the default data source specification. If it finds the default data source,
it loads the default driver shared library and passes the application-specified data source
name to it. If there is no default data source, the Driver Manager returns an error.
The Driver Manager displays the following dialog box if the application calls SQLDriverConnect and requests that the user be prompted for information.
55
On request from the application, the driver displays a dialog box similar to the following
to retrieve login information.
OK
Cancel
Next, the application calls SQLBrowseConnect and specifies a data source name:
SQLBrowseConnect(hdbc, "DSN=Sybase10", SQL_NTS,
szBrowseResult, 100, &cb);
56
Because this is the first call to SQLBrowseConnect, the Driver Manager locates the data
source name (Sybase 10) in the .odbc.ini file and loads the corresponding driver shared
library (sybdrvr.so). The Driver Manager then calls the drivers SQLBrowseConnect
function with the same arguments it received from the application.
The driver determines that this is the first call to SQLBrowseConnect and returns the
second level of connection attributes: server, user name, password, and application
name. For the server attribute, it returns a list of valid server names. The return code from
SQLBrowseConnect is SQL_NEED_DATA. The browse result string is:
"SERVER:Server={red,blue,green,yellow};UID:Login ID=?;PWD:Password=?;
*APP:AppName=?;*WSID:WorkStation ID=?"
Note that each keyword in the browse result string is followed by a colon and one or
more words before the equal sign. These words are the user-friendly name that an application can use as a prompt in a dialog box.
In its next call to SQLBrowseConnect, the application must supply a value for the
SERVER, UID, and PWD keywords. Because they are prefixed by an asterisk, the APP
and WSID keywords are optional and may be omitted. The value for the SERVER keyword may be one of the servers returned by SQLBrowseConnect or a user-supplied
name.
The application calls SQLBrowseConnect again, specifying the green server and omitting the APP and WSID keywords and the user-friendly names after each keyword:
SQLBrowseConnect(hdbc, "SERVER=green;UID=Smith;PWD=Sesame",
SQL_NTS,szBrowseResult, 100, &cb);
The driver attempts to connect to the green server. If there are any nonfatal errors, such
as a missing keyword-value pair, SQLBrowseConnect returns SQL_NEED_DATA and
remains in the same state as prior to the error. The application can call SQLError to determine the error. If the connection is successful, the driver returns SQL_NEED_DATA and
returns the browse result string:
"*DATABASE:Database={master,model,pubs,tempdb};
*LANGUAGE:Language={us_english,Franais}"
Since the attributes in this string are optional, the application can omit them. However,
the application must call SQLBrowseConnect again. If the application chooses to omit
the database name and language, it specifies an empty browse request string. In this
57
Translating Data
example, the application chooses the pubs database and calls SQLBrowseConnect a
final time, omitting the LANGUAGE keyword and the asterisk before the DATABASE
keyword:
SQLBrowseConnect(hdbc, "DATABASE=pubs", SQL_NTS,
szBrowseResult, 100, &cb);
Since the DATABASE attribute is the final connection attribute of the data source, the
browsing process is complete, the application is connected to the data source, and SQLBrowseConnect returns SQL_SUCCESS. SQLBrowseConnect also returns the complete
connection string as the browse result string:
"DSN=Sybase 10;SERVER=green;UID=Smith;PWD=Sesame;
DATABASE=pubs"
The final connection string returned by the driver does not contain the user-friendly
names after each keyword, nor does it contain optional keywords not specified by the
application. The application can use this string with SQLDriverConnect to reconnect to
the data source on the current hdbc (after disconnecting) or to connect to the data source
on a different hdbc:
SQLDriverConnect(hdbc, szBrowseResult, SQL_NTS, szConnStrOut, 100, &cb,
SQL_DRIVER_NOPROMPT);
Translating Data
An application and a data source can store data in different formats. For example, the
application might use a different character set than the data source. ODBC provides a
mechanism by which a driver can translate all data (data values, SQL statements, table
names, row counts, and so on) that passes between the driver and the data source.
The driver translates data by calling functions in a translation shared library. A default
translation shared library can be specified for the data source in the .odbc.ini file; the
application can override this by calling SQLSetConnectOption. When the driver connects to the data source, it loads the translation shared library (if one has been specified).
After the driver has connected to the data source, the application may specify a new
translation shared library by calling SQLSetConnectOption. For more information
about specifying a default translation shared library, see Specifying a Default Translator in Chapter 19, Configuring Data Sources.
58
Translation functions may support several different types of translation. For example, a
function that translates data from one character set to another might support a variety of
character sets. To specify a particular type of translation, an application can pass an
option flag to the translation functions with SQLSetConnectOption.
Description
SQLDataSources
SQLDrivers
SQLGetFunctions
Retrieves functions supported by a driver. This function allows an application to determine at run time
whether a particular function is supported by a
driver.
59
Function
60
Description
SQLGetInfo
SQLGetTypeInfo
SQLSetConnectOption
SQLGetConnectOption
Chapter 39
61
Initialize
Repeatable Execution?
No
Yes
SQLSetParam
SQLExecDirect
SQLPrepare
SQLSetParam
SQLExecute
Kind of Statement?
SELECT
statement
UPDATE, DELETE,
or INSERT statement
SQLNumResultCols
SQLDescribeCol
SQLBindCol
SQLRowCount
SQLFetch
More Rows?
Yes
No
SQLFreeStmt
if repeat
SQLTransact
if more processing
Terminate
62
Declares a variable of type HSTMT. For example, the application could use the
declaration:
HSTMT hstmt1;
2.
Calls SQLAllocStmt and passes it the address of the variable and the connected
hdbc with which to associate the statement. The driver allocates memory to store
information about the statement, associates the statement handle with the hdbc,
and returns the statement handle in the variable.
Direct
Call SQLExecDirect.
These options are similar, though not identical to, the prepared and immediate options
in embedded SQL. For a comparison of the ODBC functions and embedded SQL, see
Appendix E, Comparison Between Embedded SQL and ODBC.
Prepared Execution
An application should prepare a statement before executing it if either of the following
is true:
The application will execute the statement more than once, possibly with intermediate changes to parameter values.
The application needs information about the result set prior to execution.
63
Direct Execution
A prepared statement executes faster than an unprepared statement because the data
source compiles the statement, produces an access plan, and returns an access plan identifier to the driver. The data source minimizes processing time as it does not have to produce an access plan each time it executes the statement. Network traffic is minimized
because the driver sends the access plan identifier to the data source instead of the entire
statement.ons:access plan b
Important: Committing or rolling back a transaction, either by calling SQLTransact or by using the SQL_AUTOCOMMIT connection option, can cause
the data source to delete the access plans for all hstmts on an hdbc. For more
information, see the SQL_CURSOR_COMMIT_BEHAVIOR and
SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
To prepare and execute an SQL statement, an application:
1.
2.
Sets the values of any statement parameters. For more information, see Setting
Parameter Values later in this chapter.
3.
Retrieves information about the result set, if necessary. For more information,
see Determining the Characteristics of a Result Set in Chapter 7, Retrieving
Results.
4.
5.
Direct Execution
An application should execute a statement directly if both of the following are true:
The application does not need information about the result set prior to execution.
64
1.
Sets the values of any statement parameters. For more information, see Setting
Parameter Values later in this chapter.
2.
It needs to execute the same prepared statement several times with different
parameter values.
The parameter values are not known when the statement is prepared.
The parameter values need to be converted from one data type to another.
To set a parameter value, an application performs the following steps in any order:
These steps can be performed before or after a statement is prepared, but must be performed before a statement is executed.
Parameter values must be placed in storage locations in the C data types specified in
SQLBindParameter. For example:
Parameter Value
C Data Type
Stored Value
ABC
10
10
1 p.m.
1 p.m.
SQL_CHAR
SQL_INTEGER
SQL_INTEGER
SQL_TIME
SQL_TIME
SQL_C_CHAR
SQL_C_SLONG
SQL_C_CHAR
SQL_C_TIME
SQL_C_CHAR
ABC\0 a
10
10\0 a
13,0,0 b
{t 13:00:00}\0a,c
\0 represents a null-termination byte; the null termination byte is required only if the
parameter length is SQL_NTS.
a
65
Performing Transactions
The numbers in this list are the numbers stored in the fields of the TIME_STRUCT
structure.
b
The string uses the ODBC date escape clause. For more information, see Date, Time,
and Timestamp Data later in this chapter.
c
Storage locations remain bound to parameter markers until the application calls SQLFreeStmt with the SQL_RESET_PARAMS option or the SQL_DROP option. An application can bind a different storage area to a parameter marker at any time by calling
SQLBindParameter. An application can also change the value in a storage location at
any time. When a statement is executed, the driver uses the current values in the most
recently defined storage locations.
Performing Transactions
In auto-commit mode, every SQL statement is a complete transaction, which is automatically committed. In manual-commit mode, a transaction consists of one or more statements. In manual-commit mode, when an application submits an SQL statement and no
transaction is open, the driver implicitly begins a transaction. The transaction remains
open until the application commits or rolls back the transaction with SQLTransact.
If a driver supports the SQL_AUTOCOMMIT connection option, the default transaction
mode is auto-commit; otherwise, it is manual-commit. An application calls SQLSetConnectOption to switch between manual-commit and auto-commit mode. Note that if an
application switches from manual-commit to auto-commit mode, the driver commits
any open transactions on the connection.
Applications should call SQLTransact, rather than submitting a COMMIT or ROLLBACK statement, to commit or roll back a transaction. The result of a COMMIT or
ROLLBACK statement depends on the driver and its associated data source.
_C
Important: Committing or rolling back a transaction, either by calling SQLTransact or by using the SQL_AUTOCOMMIT connection option, can cause
the data source to close the cursors and delete the access plans for all hstmts
on an hdbc. For more information, see SQL_CURSOR_COMMIT_BEHAVIOR
and SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
66
SQLPrimaryKeys returns the names of columns that comprise the primary key
of a single table.
SQLForeignKeys returns the names of columns in a single table that are foreign
keys. It also returns the names of columns in other tables that refer to the primary
key of the specified table.
SQLStatistics returns statistics about a single table and the indexes associated
with that table.
Each function returns the information as a result set. An application retrieves these
results by calling SQLBindCol and SQLFetch.
67
SQLBindParameter
SQLParamData
SQLPutData
To indicate that it plans to send parameter data at statement execution time, an application calls SQLBindParameter and sets the pcbValue buffer for the parameter to the result
of the SQL_LEN_DATA_AT_EXEC(length) macro. If the fSqlType argument is
SQL_LONGVARBINARY or SQL_LONGVARCHAR and the driver returns Y for the
SQL_NEED_LONG_DATA_LEN information type in SQLGetInfo, length is the total
number of bytes of data to be sent for the parameter; otherwise, it is ignored.
The application sets the rgbValue argument to a value that, at run time, can be used to
retrieve the data. For example, rgbValue might point to a storage location that will contain the data at statement execution time or to a file that contains the data. The driver
returns the value to the application at statement execution time.
When the driver processes a call to SQLExecute or SQLExecDirect and the statement
being executed includes a data-at-execution parameter, the driver returns
SQL_NEED_DATA. To send the parameter data, the application:
1.
2.
Calls SQLPutData one or more times to send data for the parameter. (More than
one call will be needed if the data value is larger than the buffer; multiple calls
are allowed only if the C data type is character or binary and the SQL data type
is character, binary, or data sourcespecific.)
3.
Calls SQLParamData again to indicate that all data has been sent for the parameter. If there is another data-at-execution parameter, the driver returns rgbValue
for that parameter and SQL_NEED_DATA for the function return code. Otherwise, it returns SQL_SUCCESS for the function return code.
4.
SQLForeignKeys
SQLProcedureColumns
SQLColumnPrivileges
SQLGetData
SQLProcedures
SQLColumns
SQLGetTypeInfo
SQLPutData
SQLDescribeCol
SQLMoreResults
SQLSetPos
SQLDescribeParam
SQLNumParams
SQLSpecialColumns
SQLExecDirect
SQLNumResultCols
SQLStatistics
SQLExecute
SQLParamData
SQLTablePrivileges
SQLExtendedFetch
SQLPrepare
SQLTables
SQLFetch
SQLPrimaryKeys
69
2.
Calls one of the functions listed earlier in this section and passes it the hstmt. The
driver begins asynchronous execution of the function and returns
SQL_STILL_EXECUTING.
When the application calls a function that cannot be executed asynchronously,
the driver executes the function synchronously.
3.
4.
5.
6.
70
Scalar functions such as numeric, string, and data type conversion functions
Outer joins
Procedures
The syntax defined by ODBC for these extensions uses the escape clause provided by the
X/Open and SQL Access Group SQL CAE specification (1992) to cover vendor-specific
extensions to SQL. Its format is:
--(*vendor(vendor-name), product(product-name) extension *)--
For the ODBC extensions to SQL, product-name is always ODBC, since the product
defining them is ODBC. Vendor-name is always Microsoft, since ODBC is a Microsoft
product. ODBC also defines a shorthand syntax for these extensions:
{extension}
Most DBMSs provide the same extensions to SQL as does ODBC. Because of this, an
application may be able to submit an SQL statement using one of these extensions in
either of two ways:
Use the syntax defined by ODBC. An application that uses the ODBC syntax will be
interoperable among DBMSs.
Use the syntax defined by the DBMS. An application that uses DBMS-specific syntax will
not be interoperable among DBMSs.
Due to the difficulty in implementing some ODBC extensions to SQL, such as outer joins,
a driver might only implement those ODBC extensions that are supported by its associated DBMS. To determine whether the driver and data source support all the ODBC
extensions to SQL, an application calls SQLGetInfo with the
SQL_ODBC_SQL_CONFORMANCE flag. For information about how an application
determines whether a specific extension is supported, see the section that describes the
extension.
71
Note that many DBMs provide extensions to SQL other than those defined by ODBC.
To use one of these extensions, an application uses the DBMS-specific syntax. The application will not be interoperable among DBMSs.
where d indicates value is a date in the yyyy-mm-dd format, t indicates value is a time
in the hh:mm:ss format, and ts indicates value is a timestamp in the yyyy-mm-dd
hh:mm:ss[.f...] format. The shorthand syntax for date, time, and timestamp data is:
{d value}
{t value}
{ts value}
For example, each of the following statements updates the birthday of Roger Sippl in the
EMPLOYEE table. The first statement uses the escape clause syntax. The second statement uses the shorthand syntax. The third statement uses the native syntax for a DATE
column in a database server and is not interoperable among DBMSs.
UPDATE EMPLOYEE
SET BIRTHDAY=--(*vendor(Microsoft),product(ODBC) d 1967-01-15 *)-WHERE NAME=Sippl, Roger
UPDATE EMPLOYEE
SET BIRTHDAY={d 1967-01-15}
WHERE NAME=Sippl, Roger
UPDATE EMPLOYEE
SET BIRTHDAY=01/15/1967
WHERE NAME=Sippl, Roger
The ODBC escape clauses for date, time, and timestamp literals can be used in parameters with a C data type of SQL_C_CHAR. For example, the following statement uses a
parameter to update the birthday of John Smith in the EMPLOYEE table:
UPDATE EMPLOYEE SET BIRTHDAY=? WHERE NAME=Smith, John
72
A storage location of type SQL_C_CHAR bound to the parameter might contain any of
the following values. The first value uses the escape clause syntax. The second value uses
the shorthand syntax.
"--(*vendor(Microsoft),product(ODBC) d 1967-01-15 *)--"
"{d 1967-01-15}"
An application can also send date, time, or timestamp values as parameters using the C
structures defined by the C data types SQL_C_DATE, SQL_C_TIME, and
SQL_C_TIMESTAMP.
To determine if a data source supports date, time, or timestamp data, an application calls
SQLGetTypeInfo. If a driver supports date, time, or timestamp data, it must also support the escape clauses for date, time, or timestamp literals.
Scalar Functions
Scalar functions such as string length, absolute value, or current date can be used on
columns of a result set and on columns that restrict rows of a result set. The escape clause
ODBC uses for scalar functions is:
where scalar-function is one of the functions listed in Appendix F, Scalar Functions. The
shorthand syntax for scalar functions is:
{ fn scalar-function}
For example, each of the following statements creates the same result set of uppercase
employee names. The first statement uses the escape clause syntax. The second statement
uses the shorthand syntax. The third statement uses the native syntax for Ingres for
UNIX and is not interoperable among DBMSs.
SELECT --(*vendor(Microsoft),product(ODBC) fn UCASE(NAME) *)-FROM EMPLOYEE
SELECT {fn UCASE(NAME)} FROM EMPLOYEE
SELECT uppercase(NAME) FROM EMPLOYEE
An application can mix scalar functions that use native syntax and scalar functions that
use ODBC syntax. For example, the following statement creates a result set of last names
of employees in the EMPLOYEE table. (Names in the EMPLOYEE table are stored as a
73
last name, a comma, and a first name.) The statement uses the ODBC scalar function
SUBSTRING and the Sybase SQL Server scalar function CHARINDEX and will only
execute correctly on Sybase SQL Server.
SELECT {fn SUBSTRING(NAME, 1, CHARINDEX(',', NAME) 1)} FROM EMPLOYEE
To determine which scalar functions are supported by a data source, an application calls
SQLGetInfo with the SQL_NUMERIC_FUNCTIONS, SQL_STRING_FUNCTIONS,
SQL_SYSTEM_FUNCTIONS, and SQL_TIMEDATE_FUNCTIONS flags.
where value_exp is a column name, the result of another scalar function, or a literal value,
and data_type is a keyword that matches the #define name used by an ODBC SQL data
type (as defined in Appendix D, Data Types). The shorthand syntax for the CONVERT function is:
{fn CONVERT(value_exp, data_type)}
For example, the following statement creates a result set of the names and ages of all
employees in their twenties. It uses the CONVERT function to convert each employees
age from type SQL_SMALLINT to type SQL_CHAR. Each resulting character string is
compared to the pattern 2% to determine if the employees age is in the twenties.
SELECT NAME, AGE FROM EMPLOYEE WHERE {fn CONVERT(AGE,SQL_CHAR)} LIKE 2%
74
where escape-character is any character supported by the data source. The shorthand
syntax for the LIKE predicate escape character is:
{escape escape-character}
For example, each of the following statements creates the same result set of department
names that start with the characters %AAA. The first statement uses the escape clause
syntax. The second statement uses the shorthand syntax. The third statement uses the
native syntax for Ingres and is not interoperable among DBMSs. Note that the second
percent character in each LIKE predicate is a wild-card character that matches zero or
more of any character.
SELECT NAME FROM DEPT WHERE NAME LIKE \%AAA% -(*vendor(Microsoft),product(ODBC) escape \*)-SELECT NAME FROM DEPT WHERE NAME LIKE \%AAA% {escape \}
SELECT NAME FROM DEPT WHERE NAME LIKE \%AAA% ESCAPE \
To determine whether LIKE predicate escape characters are supported by a data source,
an application calls SQLGetInfo with the SQL_LIKE_ESCAPE_CLAUSE information
type.
Outer Joins
ODBC supports the ANSI SQL-92 left outer join syntax. The escape clause ODBC uses for
outer joins is:
--(*vendor(Microsoft),product(ODBC) oj outer-join *)--
75
An outer join request must appear after the FROM keyword and before the WHERE
clause (if one exists). For complete syntax information, see Appendix C, SQL Grammar.
For example, each of the following statements creates the same result set of the names
and departments of employees working on project 544. The first statement uses the
escape clause syntax. The second statement uses the shorthand syntax. The third statement uses the native syntax for Oracle and is not interoperable among DBMSs.
SELECT EMPLOYEE.NAME, DEPT.DEPTNAME
FROM --(*vendor(Microsoft),product(ODBC) oj
EMPLOYEE LEFT OUTER JOIN DEPT ON EMPLOYEE.DEPTID=DEPT.DEPTID*)-WHERE EMPLOYEE.PROJID=544
SELECT EMPLOYEE.NAME, DEPT.DEPTNAME
FROM {oj EMPLOYEE LEFT OUTER JOIN DEPT
ON EMPLOYEE.DEPTID=DEPT.DEPTID}
WHERE EMPLOYEE.PROJID=544
SELECT EMPLOYEE.NAME, DEPT.DEPTNAME
FROM EMPLOYEE, DEPT
WHERE (EMPLOYEE.PROJID=544) AND (EMPLOYEE.DEPTID = DEPT.DEPTID (+))
To determine the level of outer joins a data source supports, an application calls
SQLGetInfo with the SQL_OUTER_JOINS flag. Data sources can support two-table
outer joins, partially support multi-table outer joins, fully support multi-table outer
joins, or not support outer joins.
Procedures
An application can call a procedure in place of an SQL statement. The escape clause
ODBC uses for calling a procedure is:
--(*vendor(Microsoft),product(ODBC)
[?=] call procedure-name[([parameter][,[parameter]]...)] *)--
where procedure-name specifies the name of a procedure stored on the data source and
parameter specifies a procedure parameter. A procedure can have zero or more parameters and can return a value. The shorthand syntax for procedure invocation is:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
For output parameters, parameter must be a parameter marker. For input and input/output parameters, parameter can be a literal, a parameter marker, or not specified. If parameter is a literal or is not specified for an input/output parameter, the driver discards the
output value. If parameter is not specified for an input or input/output parameter, the
procedure uses the default value of the parameter as the input value; the procedure also
76
uses the default value if parameter is a parameter marker and the pcbValue argument in
SQLBindParameter is SQL_DEFAULT_PARAM. If a procedure call includes parameter
markers (including the ?= parameter marker for the return value), the application must
bind each marker by calling SQLBindParameter prior to calling the procedure._CH06PR.DOC1205
Important: For some data sources, parameter cannot be a literal value. For all
data sources, it can be a parameter marker. For maximum interoperability,
applications should always use a parameter marker for parameter.
If an application specifies a return value parameter for a procedure that does not return
a value, the driver sets the pcbValue buffer specified in SQLBindParameter for the
parameter to SQL_NULL_DATA. If the application omits the return value parameter for
a procedure which returns a value, the driver ignores the value returned by the procedure.
If a procedure returns a result set, the application retrieves the data in the result set in the
same manner as it retrieves data from any other result set.
For example, each of the following statements uses the procedure EMPS_IN_PROJ to
create the same result set of names of employees working on a project. The first statement
uses the escape clause syntax. The second statement uses the shorthand syntax. For an
example of code that calls a procedure, see SQLProcedures in Chapter 21, ODBC Function Reference.
--(*vendor(Microsoft),product(ODBC) call EMPS_IN_PROJ(?)*)-{call EMPS_IN_PROJ(?)}
77
78
Function
Description
SQLDescribeParam
SQLNativeSql
SQLNumParams
SQLSetStmtOptionSQLSetConnectOptionSQLGetStmtOption
Chapter 40
Retrieving Results
A SELECT statement is used to retrieve data that meets a given set of specifications. For
example, SELECT * FROM EMPLOYEE WHERE EMPNAME = "Jones" is used to retrieve
all columns of all rows in EMPLOYEE where the employees name is Jones. ODBC extension functions also can retrieve data. For example, SQLColumns retrieves data about columns in the data source. These sets of data, called result sets, can contain zero or more
rows.
Other SQL statements, such as GRANT or REVOKE, do not return result sets. For these
statements, the return code from SQLExecute or SQLExecDirect is usually the only source
of information as to whether the statement was successful. (For INSERT, UPDATE, and
DELETE statements, an application can call SQLRowCount to return the number of
affected rows.)
The steps an application takes to process a result set depends on what is known about it.
Known result set
79
If the result set is unknown, an application can use the information returned by these
functions to bind the columns in the result set. An application can call these functions at
any time after a statement is prepared or executed. Note that although SQLRowCount
can sometimes return the number of rows in a result set, it is not guaranteed to do so.
Few data sources support this functionality and interoperable applications should not
rely on it.
80
\_C H07PR.DOC-1137
Calls SQLBindCol to bind the columns of the result set to storage locations if it
has not already done so.
2.
Calls SQLFetch to move to the next row in the result set and retrieve data for all
bound columns.
The following diagram shows the operations an application uses to retrieve data from the
result set:
SELECT statement
SQLNumResultCols
SQLDescribeCol
SQLBindCol
SQLFetch
More Rows?
Yes
No
Finished
81
Using Cursors
Using Cursors
To keep track of its position in the result set, a driver maintains a cursor. The cursor is so
named because it indicates the current position in the result set, just as the cursor on a
CRT screen indicates current position.
Each time an application calls SQLFetch, the driver moves the cursor to the next row
and returns that row. The cursor supported by the core ODBC functions only scrolls forward, one row at a time. (To reretrieve a row of data that it has already retrieved from
the result set, the application must close the cursor by calling SQLFreeStmt with the
SQL_CLOSE option, reexecute the SELECT statement, and fetch rows with SQLFetch
until the target row is retrieved.)Transactions:cursor behavior\\_CH07PR.DOC-1140
Important: Committing or rolling back a transaction, either by calling SQLTransact or by using the SQL_AUTOCOMMIT connection option, can cause
the data source to close the cursors for all hstmts on an hdbc. For more information, see the SQL_CURSOR_COMMIT_BEHAVIOR and
SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
82
An application may retrieve data from both bound and unbound columns in the same
row. It calls SQLBindCol to bind as many columns as desired. It calls SQLFetch or
SQLExtendedFetch to position the cursor on the next row of the result set and retrieve
all bound columns. It then calls SQLGetData to retrieve data from unbound columns.
If the data type of a column is character, binary, or data sourcespecific and the column
contains more data than can be retrieved in a single call, an application may call SQLGetData more than once for that column, as long as the data is being transferred to a buffer
of type SQL_C_CHAR or SQL_C_BINARY. For example, data of the
SQL_LONGVARBINARY and SQL_LONGVARCHAR types may need to be retrieved in
several parts.
For maximum interoperability, an application should only call SQLGetData for columns
to the right of the rightmost bound column and then only in left-to-right order. To determine if a driver can return data with SQLGetData for any column (including unbound
columns before the last bound column and any bound columns) or in any order, an application calls SQLGetInfo with the SQL_GETDATA_EXTENSIONS option.
Column-Wise Binding
To assign storage for column-wise bound results, an application performs the following
steps for each column to be bound:
1.
Allocates an array of data storage buffers. The array has as many elements as
there are rows in the rowset.
2.
3.
Calls SQLBindCol and specifies the address of the data array, the size of one element of the data array, the address of the number-of-bytes array, and the type to
which the data will be converted. When data is retrieved, the driver will use the
83
array element size to determine where to store successive rows of data in the
array.
Row-Wise Binding
To assign storage for row-wise bound results, an application performs the following
steps:
1.
Declares a structure that can hold a single row of retrieved data and the associated data lengths. (For each column to be bound, the structure contains one field
to contain data and one field to contain the number of bytes of data available to
return.)
2.
Allocates an array of these structures. This array has as many elements as there
are rows in the rowset.
3.
Calls SQLBindCol for each column to be bound. In each call, the application
specifies the address of the columns data field in the first array element, the size
of the data field, the address of the columns number-of-bytes field in the first
array element, and the type to which the data will be converted.
4.
84
Block Cursors
An application calls SQLSetStmtOption with the SQL_ROWSET_SIZE option to specify
the rowset size. The application can call SQLSetStmtOption to change the rowset size at
any time. Each time the application calls SQLExtendedFetch, the driver returns the next
rowset size rows of data. After the data is returned, the cursor points to the first row in the
rowset. By default, the rowset size is one.
Scrollable Cursors
Applications have different needs in their ability to sense changes in the tables underlying a result set. For example, when balancing financial data, an accountant needs data
that appears static; it is impossible to balance books when the data is continually changing. When selling concert tickets, a clerk needs up-to-the minute, or dynamic, data on
which tickets are still available. Various cursor models are designed to meet these needs,
each of which requires different sensitivities to changes in the tables underlying the
result set.
Static Cursors
At one extreme are static cursors, to which the data in the underlying tables appears to
be static. The membership, order, and values in the result set used by a static cursor are
generally fixed when the cursor is opened. Rows updated, deleted, or inserted by other
users (including other cursors in the same application) are not detected by the cursor
until it is closed and then reopened; the SQL_STATIC_SENSITIVITY information type
returns whether the cursor can detect rows it has updated, deleted, or inserted.
85
Static cursors are commonly implemented by taking a snapshot of the data or locking
the result set. Note that in the former case, the cursor diverges from the underlying
tables as other users make changes; in the latter case, other applications and cursors in
the same application are prohibited from changing the data.
Dynamic Cursors
At the other extreme are dynamic cursors, to which the data appears to be dynamic. The
membership, order, and values in the result set used by a dynamic cursor are everchanging. Rows updated, deleted, or inserted by all users (the cursor, other cursors in
the same application, and other applications) are detected by the cursor when data is
next fetched. Although ideal for many situations, dynamic cursors are difficult to implement.
Keyset-Driven Cursors
Between static and dynamic cursors are keyset-driven cursors, which have some of the
attributes of each. Like static cursors, the membership and ordering of the result set of a
keyset-driven cursor is generally fixed when the cursor is opened. Like dynamic cursors, most changes to the values in the underlying result set are visible to the cursor
when data is next fetched.
When a keyset-driven cursor is opened, the driver saves the keys for the entire result set,
thus fixing the membership and order of the result set. As the cursor scrolls through the
result set, the driver uses the keys in this keyset to retrieve the current data values for
each row in the rowset. Because data values are retrieved only when the cursor scrolls
to a given row, updates to that row by other users (including other cursors in the same
application) after the cursor was opened are visible to the cursor.
If the cursor scrolls to a row of data that has been deleted by other users (including other
cursors in the same application), the row appears as a hole in the result set, since the key
is still in the keyset but the row is no longer in the result set. Updating the key values in
a row is considered to be deleting the existing row and inserting a new row; therefore,
rows of data for which the key values have been changed also appear as holes. When the
driver encounters a hole in the result set, it returns a status code of
SQL_ROW_DELETED for the row.
Rows of data inserted into the result set by other users (including other cursors in the
same application) after the cursor was opened are not visible to the cursor, since the keys
for those rows are not in the keyset.
86
The SQL_STATIC_SENSITIVITY information type returns whether the cursor can detect
rows it has deleted or inserted. Because updating key values in a keyset-driven cursor is
considered to be deleting the existing row and inserting a new row, keyset-driven cursors
can always detect rows they have updated.
87
Using Bookmarks
Using Bookmarks
A bookmark is a 32-bit value that an application uses to return to a row. The application
does not request that the driver places a bookmark on a row; instead, the application
requests a bookmark that it can use to return to a row. For example, if a bookmark is a
88
Using Bookmarks
row number, an application requests the row number of a row and stores it. Later, the
application passes this row number back to the driver and requests that the driver return
to the row.
Before opening the cursor, an application must call SQLSetStmtOption with the
SQL_USE_BOOKMARKS option to inform the driver it will use bookmarks. After opening the cursor, the application retrieves bookmarks either from column 0 of the result set
or by calling SQLGetStmtOption with the SQL_GET_BOOKMARK option. To retrieve
a bookmark from the result set, the application either binds column 0 and calls SQLExtendedFetch or calls SQLGetData; in either case, the fCType argument must be set to
SQL_C_BOOKMARK. To return to the row specified by a bookmark, the application calls
SQLExtendedFetch with a fetch type of SQL_FETCH_BOOKMARK.
If a bookmark requires more than 32 bits, such as when it is a key value, the driver maps
the bookmarks requested by the application to 32-bit binary values. The 32-bit binary
values are then returned to the application. Because this mapping may require considerable memory, applications should only bind column 0 of the result set if they will actually
use bookmarks for most rows. Otherwise, they should call SQLGetStmtOption with the
SQL_BOOKMARK statement option or call SQLGetData for column 0.
Before an application opens a cursor with which it will use bookmarks, it: calls SQLSetStmtOption with the SQL_USE_BOOKMARKS option and a value of SQL_UB_ON.
To retrieve a bookmark for the current row, an application does one of the following
actions:
Retrieves the value from column 0 of the rowset. The application can either call
SQLBindCol to bind column 0 before it calls SQLExtendedFetch or call
SQLGetData to retrieve the data after it calls SQLExtendedFetch. In either case,
the fCType argument must be SQL_C_BOOKMARK.
To determine whether it can call SQLGetData for a block (more than one row) of
data and whether it can call SQLGetData for a column before the last bound column, an application calls SQLGetInfo with the SQL_GETDATA_EXTENSIONS
information type.
Or
Calls SQLSetPos with the SQL_POSITION option to position the cursor on the
row and calls SQLGetStmtOption with the SQL_BOOKMARK option to
retrieve the bookmark.
89
To return to the row specified by a bookmark (or a row a certain number of rows from
the bookmark), an application:Calls SQLExtendedFetch with the irow argument set to
the bookmark and the fFetchType argument set to SQL_FETCH_BOOKMARK. The
driver returns the rowset starting with the row identified by the bookmark.
90
The application must use different hstmts for the SELECT statement and the UPDATE or
DELETE statement.
The hstmts for the SELECT statement and the UPDATE or DELETE statement must be
on the same connection.
To determine if a data source supports positioned update and delete statements, an
application calls SQLGetInfo with the SQL_POSITIONED_STATEMENTS option. For
an example of code that performs a positioned update in a rowset, see SQLSetPos in
Chapter 21, ODBC Function Reference.
In ODBC 1.0, positioned update, positioned delete, and SELECT FOR UPDATE statements were part of the core SQL grammar; in ODBC 2.0, they are part of the extended
grammar. Applications that use the SQL conformance level to determine whether these
statements are supported also need to check the version number of the driver to correctly
interpret the information. In particular, applications that use these features with ODBC
1.0 drivers need to explicitly check for these capabilities in ODBC 2.0 drivers.
91
Places the data for each column the rgbValue buffers specified with SQLBindCol. To avoid overwriting an existing row of data, the application should allocate an extra row of the rowset buffers to use as an add buffer.
2.
Places the length of each column in the pcbValue buffer specified with SQLBindCol; this only needs to be done for columns with an fCType of SQL_C_CHAR or
SQL_C_BINARY. To use the default value for a column, the application specifies
a length of SQL_IGNORE.
To add a new row of data to a result set, one of the following two conditions
must be met:
All unbound columns and all bound columns for which the specified length
is SQL_IGNORE must accept NULL values or have default values.
Calls SQLSetPos with the fOption argument set to SQL_ADD. The irow argument determines the row in the rowset buffers from which the data is retrieved.
For information about how an application sends data for data-at-execution columns, see SQLSetPos in Chapter 21, ODBC Function Reference.
After the row is added, the row the cursor points to is unchanged.
Columns for long data types, such as SQL_LONGVARCHAR and
SQL_LONGVARBINARY, are generally not bound. However, if an application
uses SQLSetPos to send data for these columns, it must bind them with SQLBindCol. Unless the driver returns the SQL_GD_BOUND bit for the
SQL_GETDATA_EXTENSIONS information type, the application must unbind
them before calling SQLGetData to retrieve data from them.
92
1.
Modifies the data of each column to be updated in the rgbValue buffer specified
with SQLBindCol.
2.
Places the length of each column to be updated in the pcbValue buffer specified
with SQLBindCol. This only needs to be done for columns with an fCType of
SQL_C_CHAR or SQL_C_BINARY.
3.
Sets the value of the pcbValue buffer for each bound column that is not to be
updated to SQL_IGNORE.
4.
Calls SQLSetPos with the fOption argument set to SQL_UPDATE. The irow argument specifies the number of the row in the rowset to modify and the index of
row in the rowset buffer from which to retrieve the data. The cursor points to this
row after it is updated.
For information about how an application sends data for data-at-execution columns, see SQLSetPos in Chapter 21, ODBC Function Reference.
To delete a row of data, an application:calls SQLSetPos with the fOption argument set to
SQL_DELETE. The irow argument specifies the number of the row in the rowset to delete.
The cursor points to this row after it is deleted.
The application cannot perform any positioned operations, such as executing a positioned update or delete statement or calling SQLGetData, on a deleted row.
To determine what operations a data source supports for SQLSetPos, an application calls
SQLGetInfo with the SQL_POS_OPERATIONS flag.
2.
3.
4.
93
94
Chapter 41
Description
SQL_SUCCESS
95
Return Code
Description
SQL_NO_DATA_FOUND
SQL_ERROR
SQL_INVALID_HANDLE
SQL_STILL_EXECUTING
SQL_NEED_DATA
The application is responsible for taking the appropriate action based on the return code.
Error or status information from an ODBC function, indicating that a programming error was detected.
Error or status information from the data source, indicating that an error
occurred during SQL statement processing.
The information returned by SQLError is in the same format as that provided by SQLSTATE in the X/Open and SQL Access Group SQL CAE specification (1992). Note that
SQLError never returns error information about itself.
96
For errors that occur in a data source, the error text must use the format:
[vendor-identifier][ODBC-component-identifier][data-source-identifier]data-source-supplied-text
97
Meaning
vendor-identifier
ODBC-component-identifier
data-source-identifier
component-supplied-text
data-source-supplied-text
In this case, the driver is acting as both the driver and the data source.
Note that the brackets ([ ]) are included in the error text; they do not indicate optional
items.
Single-Tier Driver
A single-tier driver acts both as an ODBC driver and as a data source. It can therefore
generate errors both as a component in an ODBC connection and as a data source.
Because it also is the component that interfaces with the Driver Manager, it formats and
returns arguments for SQLError.
98
For example, if a Visigenic driver for text files could not allocate sufficient memory, it
might return the following arguments for SQLError:
szSQLState = "S1001"pf
NativeError = NULL
szErrorMsg = "[Visigenic][ODBC Text Driver]Unable to
allocate sufficient memory."
pcbErrorMsg = 67
Because this error was not related to the data source, the driver only added prefixes to
the error text for the vendor ([Visigenic]) and the driver ([ODBC Text Driver]).
If the driver could not find the file EMPLOYEE.DBF, it might return the following arguments for SQLError:
szSQLState = "S0002"
pfNativeError = NULL
szErrorMsg = "[Visigenic][ODBC Text Driver][Text]Invalid file
name;file EMPLOYEE.DBF not found."
pcbErrorMsg = 83
Because this error was related to the data source, the driver added the file format of the
data source ([Text]) as a prefix to the error text. Because the driver was also the component that interfaced with the data source, it added prefixes for the vendor ([Visigenic])
and the driver ([ODBC Text Driver]).
Multiple-Tier Driver
A multiple-tier driver sends requests to a DBMS and returns information to the application through the Driver Manager. Because it is the component that interfaces with the
Driver Manager, it formats and returns arguments for SQLError.
For example, if a Visigenic driver for Sybase SQL Server encountered a duplicate cursor
name, it might return the following arguments for SQLError:
szSQLState =
"3C000"
pfNativeError = NULL
szErrorMsg =
"[Visigenic][ODBC Sybase SQL Server Driver]Duplicate
cursor name:EMPLOYEE_CURSOR."
pcbErrorMsg = 67
Because the error occurred in the driver, it added prefixes to the error text for the vendor
([Visigenic]) and the driver ([ODBC Sybase SQL Server Driver]).
99
If the DBMS could not find the table EMPLOYEE, the driver might format and return
the following arguments for SQLError:
szSQLState =
"S0002"
pfNativeError = -1
szErrorMsg =
"[Visigenic][ODBC Sybase SQL Server Driver]
[Sybase SQL Server] %SQL-F-RELNOTDEF, Table EMPLOYEE is
Because the error occurred in the data source, the driver added a prefix for the data
source identifier ([Sybase SQL Server]) to the error text. Because the driver was the component that interfaced with the data source, it added prefixes for its vendor ([Visigenic])
and identifier ([ODBC Sybase SQL Server Driver]) to the error text.
Gateways
In a gateway architecture, a driver sends requests to a gateway that supports ODBC. The
gateway sends the requests to a DBMS. Because it is the component that interfaces with
the Driver Manager, the driver formats and returns arguments for SQLError.
For example, if DEC based a gateway to Rdb on Microsoft Open Data Services, and
Oracle7 could not find the table EMPLOYEE, the gateway might generate the following
error text:
"[S0002][-1][DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF, Table EMPLOYEE
is not defined in schema."
Because the error occurred in the data source, the gateway added a prefix for the data
source identifier ([Rdb]) to the error text. Because the gateway was the component that
interfaced with the data source, it added prefixes for its vendor ([DEC]) and identifier
([ODS Gateway]) to the error text. Note that it also added the SQLSTATE value and the
Rdb error code to the beginning of the error text. This permitted it to preserve the semantics of its own message structure and still supply the ODBC error information to the
driver.
Because the gateway driver is the component that interfaces with the Driver Manager, it
would use the preceding error text to format and return the following arguments for
SQLError:
szSQLState =
"S0002"
pfNativeError = -1
szErrorMsg =
"[DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF, Table
EMPLOYEE is not defined in schema."
pcbErrorMsg = 81
100
Driver Manager
The Driver Manager can also generate error messages. For example, if an application
passed an invalid argument value to SQLDataSources, the Driver Manager might
format and return the following arguments for SQLError:
szSQLState =
"S1009"
pfNativeError = NULL
szErrorMsg =
"[Visigenic][ODBC lib]Invalid argument value:
SQLDataSources."
pcbErrorMsg = 60
Because the error occurred in the Driver Manager, it added prefixes to the error text for
its vendor ([Visigenic]) and its identifier ([ODBC lib]).
101
102
Chapter 42
SQL_CLOSE Closes the cursor, if one exists, and discards pending results. The
application can use the statement handle again later.
SQL_DROP Closes the cursor if one exists, discards pending results, and frees all
resources associated with the statement handle.
SQL_UNBIND
handle.
SQL_RESET_PARAMS Frees all parameter buffers requested by SQLBindParameter for the statement handle.
Calls SQLCancel. When and if the statement is actually canceled is driver- and
data sourcedependent.
Calls the function that was executing the statement asynchronously. If the statement is still executing, the function returns SQL_STILL_EXECUTING; if it was
successfully canceled, the function returns SQL_ERROR and SQLSTATE S1008
(Operation canceled); if it completed normal execution, the function returns any
valid return code, such as SQL_SUCCESS or SQL_ERROR.
103
Terminating Transactions
Terminating Transactions
An application calls SQLTransact to commit or roll back the current transaction.
Terminating Connections
To terminate a connection to a driver and data source, an application performs the following steps:
104
1.
Calls SQLDisconnect to close the connection. The application can then use the
handle to reconnect to the same data source or to a different data source.
2.
Calls SQLFreeConnect to free the connection handle and free all resources associated with the handle.
3.
Calls SQLFreeEnv to free the environment handle and free all resources associated with the handle.
Chapter 43
105
SQLAllocEnv(&henv);
SQLAllocConnect(henv, &hdbc);
rc = SQLConnect(hdbc, server, SQL_NTS, uid, SQL_NTS, pwd, SQL_NTS);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
return(print_err(hdbc, SQL_NULL_HSTMT));
SQLAllocStmt(hdbc, &hstmt);
/* EXEC SQL CREATE TABLE NAMEID (ID integer, NAME varchar(50)); */
/* Execute the SQL statement.
*/
lstrcpy(create, "CREATE TABLE NAMEID (ID INTEGER, NAME
106
VARCHAR(50))");
rc = SQLExecDirect(hstmt, create, SQL_NTS);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO)
return(print_err(hdbc, hstmt));
/* EXEC SQL COMMIT WORK;
/* Commit the table creation. */
*/
/* Note that the default transaction mode for drivers that support */
/* SQLSetConnectOption is auto-commit and SQLTransact has no effect
SQLTransact(hdbc, SQL_COMMIT);
/*
/*
/*
/*
/*
EXEC SQL DECLARE c1 CURSOR FOR SELECT ID, NAME FROM NAMEID; */
EXEC SQL OPEN c1;
*/
Show the use of the SQLExecDirect method.
*/
Execute the selection.
*/
Note that the application does not declare a cursor.
*/
107
*/
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
return(0);
}
108
109
return(print_err(hdbc, hstmt));
/*
/*
/*
/*
/*
/*
/*
SQLNumResultCols(hstmt, &nresultcols);
if (nresultcols == 0) {
SQLRowCount(hstmt, &rowcount);
if (rowcount > 0 ) {
printf("%ld rows affected.\n", (int) rowcount);
} else {
printf("Operation successful.\n");
}
SQLTransact(hdbc, SQL_COMMIT);
/*
/*
/*
/*
/*
Otherwise, display the column names of the result set and use the */
display_size() function to compute the length needed by each data */
type. Next, bind the columns and specify all data will be
*/
converted to char. Finally, fetch and print each row, printing */
truncation messages as necessary.
*/
} else {
for (i = 0; i < nresultcols; i++) {
SQLDescribeCol(hstmt, i + 1, colname, (SQLSMALLINT)sizeof(colname),
&colnamelen, &coltype, &collen[i], &scale,
&nullable);
collen[i] = display_size(coltype, collen[i], colname);
printf("%*.*s", collen[i], collen[i], colname);
data[i] = (UCHAR *) malloc(collen[i] + 1);
SQLBindCol(hstmt, i + 1, SQL_C_CHAR, data[i], (SQLLEN)collen[i],
&outlen[i]);
}
printf("\n");
while (TRUE) {
rc = SQLFetch(hstmt);
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
errmsg[0] = \0;
for (i = 0; i < nresultcols; i++)
if (outlen[i] == SQL_NULL_DATA) {
lstrcpy(data[i], "NULL");
} else if (outlen[i] >= (SQLLEN)collen[i]) {
sprintf(&errmsg[strlen(errmsg)],
"%d chars truncated, col %d\n",
(int) (outlen[i] - collen[i] + 1, i);
110
colnum;
}
printf("%*.*s ", collen[i], collen[i], data[i]);
}
printf("\n%s", errmsg);
} else {
break;
}
}
}
/* Free the data buffers. */
for (i = 0; i < nresultcols; i++) {
free(data[i]);
}
SQLFreeStmt(hstmt, SQL_DROP ); /* Free the statement handle.
*/
SQLDisconnect(hdbc);
/* Disconnect from the data source. */
SQLFreeConnect(hdbc);
/* Free the connection handle.
*/
SQLFreeEnv(henv);
/* Free the environment handle.
*/
return(0);
}
/************************************************************/
/* The following function is included for completeness, but */
/* is not relevant for understanding the function of ODBC. */
/************************************************************/
#define MAX_NUM_PRECISION 15
/* Define max length of char string representation of number as:
*/
/* = max(precision) + leading sign + E + exp sign + max exp length */
/* = 15
+1
+1+1
+2
*/
/* = 15 + 5
*/
#define MAX_NUM_STRING_SIZE (MAX_NUM_PRECISION + 5)
SQLULEN display_size(coltype, collen, colname)
SQLSMALLINT coltype;
SQLULEN collen;
UCHAR * colname;
{
switch (coltype) {
case SQL_CHAR:
case SQL_VARCHAR:
return(max(collen, strlen(colname)));
case SQL_SMALLINT:
111
return(max(6, strlen(colname)));
case SQL_INTEGER:
return(max(11, strlen(colname)));
case
case
case
case
case
SQL_DECIMAL:
SQL_NUMERIC:
SQL_REAL:
SQL_FLOAT:
SQL_DOUBLE:
return(max(MAX_NUM_STRING_SIZE, strlen(colname)));
/* Note that this function only supports the core data types. */
default:
printf("Unknown datatype, %d\n", coltype);
return(0);
}
112
Chapter 44
Validating Arguments
Validating Arguments
The following general guidelines discuss the arguments or types of arguments checked
by the Driver Manager. They are not intended to be exhaustive; the Diagnostics section
of each function in Chapter 21, ODBC Function Reference, lists those SQLSTATEs
returned by the Driver Manager for that function. Unless otherwise noted, the Driver
Manager returns the return code SQL_ERROR.
Environment, connection, and statement handles are checked to make sure they are not
null pointers and are the correct type of handle for the argument. For example, the
Driver Manager checks that the application does not pass an hdbc where an hstmt is
required. If the Driver Manager finds an invalid handle, it returns
SQL_INVALID_HANDLE.
Other required arguments, such as the phenv argument in SQLAllocEnv or the szCursor
argument in SQLSetCursorName, are checked to make sure they are not null pointers.
Option flags that cannot be extended by the driver are checked to make sure they specify
only supported options. For example, the Driver Manager checks that the fDriverCompletion argument in SQLDriverConnect is a valid value.
114
Option flags that can be extended by the driver, such as the fInfoType argument in
SQLGetInfo, are checked only to make sure that values in the ranges reserved for ODBC
options are valid; drivers must check that values in the ranges reserved for driver-specific options are valid. For more information, see Driver-Specific Data Types, Descriptor
Types, Information Types, and Options, later in this chapter.
All option flags are checked to make sure that no ODBC 2.0 option values are sent to
ODBC 1.0 drivers. For example, the Driver Manager returns an error if the fInfoType argument in SQLGetInfo is SQL_GROUP_BY and the driver is an ODBC 1.0 driver.
Argument values that specify a column or parameter number are checked to make sure
they are greater than 0 or greater than or equal to 0, depending on the function. The
driver must check the upper limit of these argument values based on the current result
set or SQL statement.
Buffer length arguments are checked as possible to make sure that their values are appropriate for the corresponding buffer in the context of the given function. For example,
szTableName in SQLColumns is an input argument. Therefore, the Driver Manager
checks that if the corresponding length argument (cbTableName) is less than 0, it is
SQL_NTS. The szColName argument in SQLDescribeCol is an output argument. Therefore, the Driver Manager checks that the corresponding length argument (cbColNameMax) is greater than or equal to 0.
Note that the driver may also need to check the validity of buffer length arguments. For
example, the driver must check that the cbTableName argument in SQLColumns is less
than or equal to the maximum length of a table name in the data source.
115
General Information
Each ODBC function name starts with the prefix SQL. Each function includes one or
more arguments. Arguments are defined for input (to the driver) or output (from the
driver). Applications can include variable-length data where appropriate.
116
Buffers
extension through SQLGetInfo with a flag for that extension. It returns whether it supports specific SQL data types through SQLGetTypeInfo. For more information, see
Appendix C, SQL Grammar, and Appendix D, Data Types.
Note: If a driver supports sQL data types that map to the ODBC SQL date, time, or timestamp
data types, the driver must also support the extended SQL grammar for specifying date, time, or
timpestamp literals.
Buffers
An application passes data to a driver in an input buffer. The driver returns data to an
application in an output buffer. The application must allocate memory for both input
and output buffers. (If the application will use the buffer to retrieve string data, the
buffer must contain space for the null termination byte.)
Input Buffers
An application passes the address and length of an input buffer to a driver. The length
of the buffer must be one of the following values:
A length greater than or equal to zero. This is the actual length of the data in the input
buffer. For character data, a length of zero indicates that the data is an empty (zero
length) string. Note that this is different from a null pointer. If the application specifies
the length of character data, the character data does not need to be null-terminated.
SQL_NTS. This specifies that a character data value is null-terminated.
SQL_NULL_DATA. This tells the driver to ignore the value in the input buffer and use
a NULL data value instead. It is only valid when the input buffer is used to provide the
value of a parameter in an SQL statement.
The operation of ODBC functions on character data containing embedded null characters is undefined, and is not recommended for maximum interoperability. Unless it is
specifically prohibited in the description of a given function, the address of an input
buffer may be a null pointer. When the address of an input buffer is a null pointer, the
value of the corresponding buffer length argument is ignored.
For more information about input buffers, see Converting Data from C to SQL Data
Types in Appendix D, Data Types.
118
Output Buffers
An application passes the following arguments to a driver, so that it can return data in an
output buffer:
The address of the buffer in which the driver returns the data (the output buffer). Unless
it is specifically prohibited in a function description, the address of an output buffer can
be a null pointer. In this case, the driver does not return anything in the buffer and, in the
absence of other errors, returns SQL_SUCCESS.
If necessary, the driver converts data before returning it. The driver always null-terminates character data before returning it.
The length of the buffer. This is ignored by the driver if the returned data has a fixed
length in C, such as an integer, real number, or date structure.
he address of a variable in which the driver returns the length of the data (the length
buffer). The returned length of the data is SQL_NULL_DATA if the data is a NULL value
in a result set. Otherwise, it is the number of bytes of data available to return. If the driver
converts the data, it is the number of bytes after the conversion. For character data, it does
not include the null-termination byte added by the driver.
If the output buffer is too small, the driver attempts to truncate the data. If the truncation
does not cause a loss of significant data, the driver returns the truncated data in the
output buffer, returns the length of the available data (as opposed to the length of the
truncated data) in the length buffer, and returns SQL_SUCCESS_WITH_INFO. If the
truncation causes a loss of significant data, the driver leaves the output and length buffers untouched and returns SQL_ERROR. The application calls SQLError to retrieve
information about the truncation or the error.
For more information about output buffers, see Converting Data from SQL to C Data
Types in Appendix D, Data Types.
The environment handle identifies memory storage for global information, including
the valid connection handles and current active connection handle. ODBC defines the
environment handle as a variable of type HENV. An application uses a single environment handle; it must request this handle prior to connecting to a data source.
The connection handle identifies memory storage for information about a particular
connection. ODBC defines a connection handle as a variable of type HDBC. An application must request a connection handle prior to connecting to a a data source. Each connection handle is associated with the environment handle. The environment handle can,
however, have multiple connection handles associated with it.
The statement handle identifies memory storage for information about an SQL statement. ODBC defines a statement handle as a variable of type HSTMT. An application
must request a statement handle prior to submitting SQL requests. Each statement
handle is associated with exactly one connection handle. Each connection handle can,
however, have multiple statement handles associated with it.
For more information about connection handles, see Chapter 13, Establishing Connections. For more information about statement handles, see Chapter 14, Processing an
SQL Statement.
120
121
reserve a block of values in the driver-specific range. Furthermore, you must describe all
driver-specific data types, descriptor types, information types, statement options, and
connection options in your drivers documentation.
When any of these values is passed to an ODBC function, the Driver Manager checks
that values in the ODBC ranges are valid. Drivers must check that values in the driverspecific range are valid. In particular, drivers return SQLSTATE S1C00 (Driver not capable) for driver-specific values that apply to other drivers. The following table shows the
ranges of the driver-specific values for each item:
Item
Driver-Specific Range
Descriptor types
Information types
Connection and
statement options
122
Chapter 45
Connects to the data source. It specifies the data source name and any additional
information needed to complete the connection.
2.
The application places the SQL text string in a buffer. If the statement includes
parameter markers, it sets the parameter values.
If the statement returns a result set, the application assigns a cursor name for
the statement or allows the driver to do so.
If the statement creates a result set, the application can inquire about the
attributes of the result set, such as the number of columns and the name and
type of a specific column. It assigns storage for each column in the result set
and fetches the results.
3.
4.
Terminates the connection when it has finished interacting with the data source.
The following diagram lists the ODBC function calls that an application makes to connect
to a data source, process SQL statements, and disconnect from the data source. Depending
on its needs, an application may call other ODBC functions. For a listing of valid command
flow sequences, see Appendix B, ODBC State Transition Table.
123
SQLAllocEnv
SQLAllocConnect
SQLConnect
SQLAllocStmt
124
Chapter 46
Establishing Connections
This chapter briefly describes data sources. It then describes how an application, Driver
Manager, and driver work together to establish a connection to a data source.
125
Suppose also that an Rdb driver needs the ID of the last user to log in, a server name,
and a schema declaration statement. The section that describes the Personnel data
source might be:
[Personnel]
Driver=/opt/odbc/drivers/rdb.so
Description=Personnel database: CURLY
Lastuid=smithjo
Server=curly
Schema=attach filename SYS$SYSDEVICE:[CORPDATA]PERSONNEL.RDB
For more information about data sources and how to configure them, see Chapter 19,
Configuring Data Sources.
User ID The login ID or account name for access to the data source, if appropriate
(optional).
Authentication string (password) A character string associated with the user ID that
allows access to the remote data source (optional).
When an application calls SQLConnect, the Driver Manager uses the data source name
to read the path of the driver shared library from the appropriate section of the .odbc.ini
file. It then loads the driver shared library and passes the SQLConnect arguments to it.
If the driver needs additional information to connect to the data source, it reads this
information from the same section of the .odbc.ini file.
126
If the application specifies a data source name that is not in the .odbc.ini file, or if the
application does not specify a data source name, the Driver Manager searches for the
default data source specification in the .odbc.ini file. If it finds the default data source, it
loads the default driver shared library and passes the application-specified data source
name to it. If there is no default data source, the Driver Manager returns an error.
The Driver Manager does not load a driver until the application calls a function (SQLConnect, SQLDriverConnect, or SQLBrowseConnect) to connect to the driver. Until
that point, the Driver Manager works with its own handles and manages connection
information. When the application calls a connection function, the Driver Manager
checks if a driver is currently loaded for the specified hdbc:
If a driver is not loaded, the Driver Manager loads the driver and calls SQLAllocEnv,
SQLAllocConnect, SQLSetConnectOption (if the application specified any connection
options), and the connection function in the driver. The Driver Manager returns SQLSTATE IM006 (Drivers SQLSetConnectOption failed) and SQL_SUCCESS_WITH_INFO
for the connection function if the driver returned an error for SQLSetConnectOption.
If the specified driver is already loaded on the hdbc, the Driver Manager only calls the
connection function in the driver. In this case, the driver must ensure that all connection
options for the hdbc maintain their current settings.
If a different driver is loaded, the Driver Manager calls SQLFreeConnect and SQLFreeEnv in the loaded driver and then unloads that driver. It then performs the same
operations as when a driver is not loaded.
The driver then allocates handles and initializes itself.
To resolve the addresses of the ODBC functions exported by the driver, the Driver Manager checks if the driver exports a dummy function with the ordinal 199. If it does not,
the Driver Manager resolves the addresses by name. If it does, the Driver Manager
resolves the addresses of the ODBC functions by ordinal, which is faster. The ordinal
values of the ODBC functions must match the values of the fFunction argument in
SQLGetFunctions; all other exported functions must have ordinal values outside the
range 1199.
When the application calls SQLDisconnect, the Driver Manager calls SQLDisconnect in
the driver. However, it does not unload the driver. This keeps the driver in memory for
applications that repeatedly connect to and disconnect from a data source. When the
application calls SQLFreeConnect, the Driver Manager calls SQLFreeConnect and SQLFreeEnv in the driver and then unloads the driver.
127
128
Specify a connection string that contains a driver description. The Driver Manager
retrieves the full path of the driver shared library. To retrieve a list of driver descriptions,
an application calls SQLDrivers.
Specify a connection string that does not contain a data source name or a driver name.
The Driver Manager displays a dialog box from which the user selects a data source
name. The Driver Manager then retrieves the full path of the driver shared library associated with the data source.
The Driver Manager then loads the driver shared library and passes the SQLDriverConnect arguments to it.
The application may pass all the connection information the driver needs. It may also
request that the driver always prompt the user for connection information or only
prompts the user for information it needs. Finally, if a data source is specified, the driver
may read connection information from the appropriate section of the .odbc.ini file. (For
information on the structure of the .odbc.ini file, see Structure of the .odbc.ini File in Chapter
19, Configuring Data Sources.)
After the driver connects to the data source, it returns the connection information to the
application. The application may store this information for future use.
If the application specifies a data source name that is not in the .odbc.ini file, the Driver
Manager searches for the default data source specification. If it finds the default data
source, it loads the default driver shared library and passes the application-specified data
source name to it. If there is no default data source, the Driver Manager returns an error.
The Driver Manager displays the following dialog box if the application calls SQLDriverConnect and requests that the user be prompted for information.
129
The following diagram shows sample login dialog boxes. A driver displays a login
dialog box if the value of the SQLDriverConnect fDriverCompletion argument indicates
that such a dialog box is necessary.
OK
Cancel
130
Next, the application calls SQLBrowseConnect and specifies a data source name:
SQLBrowseConnect(hdbc, "DSN=MySybaseServer", SQL_NTS,
szBrowseResult, 100, &cb);
Because this is the first call to SQLBrowseConnect, the Driver Manager locates the data
source name (MySybaseServer) in the .odbc.ini file and loads the corresponding driver
shared library (sybdrvr.so). The Driver Manager then calls the drivers SQLBrowseConnect function with the same arguments it received from the application.
The driver determines that this is the first call to SQLBrowseConnect and returns the
second level of connection attributes: server, user name, password, and application
name. For the server attribute, it returns a list of valid server names. The return code from
SQLBrowseConnect is SQL_NEED_DATA. The browse result string is:
"SERVER:Server={red,blue,green,yellow};UID:Login ID=?;
PWD:Password=?" *APP:AppName=?;*WSID:WorkStation ID=?"
Note that each keyword in the browse result string is followed by a colon and one or
more words before the equal sign. These words are the user-friendly name that an application can use as a prompt in a dialog box. The driver may change the value of this string
for different languages and locales.
In its next call to SQLBrowseConnect, the application must supply a value for the
SERVER, UID, and PWD keywords. Because they are prefixed by an asterisk, the APP
and WSID keywords are optional and may be omitted. The value for the SERVER keyword may be one of the servers returned by SQLBrowseConnect or a user-supplied
name.
The application calls SQLBrowseConnect again, specifying the green server and omitting the APP keyword and the user-friendly names after each keyword:
SQLBrowseConnect(hdbc, "SERVER=green;UID=Smith;PWD=Sesame",
SQL_NTS,szBrowseResult, 100, &cb);
131
Translating Data
The driver attempts to connect to the green server. If there are any nonfatal errors, such
as a missing keyword-value pair, SQLBrowseConnect returns SQL_NEED_DATA and
remains in the same state as prior to the error. The application can call SQLError to
determine the error. If the connection is successful, the driver returns
SQL_NEED_DATA and returns the browse result string:
"*DATABASE:Database={master,model,pubs,tempdb}"
Since the attributes in this string are optional, the application can omit them. However,
the application must call SQLBrowseConnect again. If the application chooses to omit
the database name and language, it specifies an empty browse request string. In this
example, the application chooses the pubs database and calls SQLBrowseConnect a
final time:
SQLBrowseConnect(hdbc, "DATABASE=pubs", SQL_NTS,
szBrowseResult, 100, &cb);
Since the DATABASE attribute is the final connection attribute of the data source, the
browsing process is complete, the application is connected to the data source, and SQLBrowseConnect returns SQL_SUCCESS. SQLBrowseConnect also returns the complete
connection string as the browse result string:
"DSN=MySQLServer;SERVER=green;UID=Smith;PWD=Sesame;
DATABASE=pubs"
The final connection string returned by the driver does not contain the user-friendly
names after each keyword, nor does it contain optional keywords not specified by the
application. The application can use this string with SQLDriverConnect to reconnect to
the data source on the current hdbc (after disconnecting) or to connect to the data source
on a different hdbc:
SQLDriverConnect(hdbc, szBrowseResult, SQL_NTS, szConnStrOut, 100, &cb,
SQL_DRIVER_NOPROMPT);
Translating Data
An application and a data source can store data in different formats. For example, the
application might use a different character set than the data source. ODBC provides a
mechanism by which a driver can translate all data (data values, SQL statements, table
names, row counts, and so on) that passes between the driver and the data source.
To translate data, the driver calls the functions SQLDriverToDataSource and SQLDataSourceToDriver. These functions reside in a translation shared library. A default translation shared library may be specified for a data source in the .odbc.ini file. An
132
application may specify a new translation shared library at any time by calling SQLSetConnectOption. (For more information about specifying a default translation shared
library for a data source, see Specifying a Default Translator in Chapter 19, Configuring Data Sources.)
If an application specifies a translation shared library with SQLSetConnectOption
before the driver is connected to the data source, the driver stores the translation shared
library name.
As part of the connection process, the driver loads the translation shared library (if one
has been specified). The driver first checks for a translation shared library specified with
SQLSetConnectOption. If none is found, it checks for a default translation shared
library for the data source in the .odbc.ini file.
If an application specifies a translation shared library with SQLSetConnectOption after
the driver is connected to the data source, the driver frees the current translation shared
library (if one exists) and loads the new translation shared library.
Translation functions may support several different types of translation. For example, a
function that translates data from one character set to another might support a variety of
character sets. To specify a particular type of translation, an application can specify an
option flag by calling SQLSetConnectOption. The driver passes this flag in each call to
SQLDriverToDataSource and SQLDataSourceToDriver.
Description
SQLDataSources
Returns a list of available data sources. The Driver Manager retrieves this information from the
.odbc.ini file.
SQLDrivers
133
134
Function
Description
SQLGetFunctions
SQLGetInfo
SQLGetTypeInfo
Returns the SQL data types supported by a driver and data source.
SQLSetConnectOption
SQLGetConnectOption
Chapter 47
135
Initialize
Repeatable Execution?
No
Yes
SQLSetParam
SQLExecDirect
SQLPrepare
SQLSetParam
SQLExecute
Kind of Statement?
SELECT
statement
UPDATE, DELETE,
or INSERT statement
SQLNumResultCols
SQLDescribeCol
SQLBindCol
SQLRowCount
SQLFetch
More Rows?
Yes
No
SQLFreeStmt
if repeat
SQLTransact
if more processing
Terminate
136
Direct
Call SQLExecDirect.
These options are similar, though not identical to, the prepared and immediate options
in embedded SQL. For a comparison of the ODBC functions and embedded SQL, see
Appendix E, Comparison Between Embedded SQL and ODBC.
Prepared Execution
Preparing a statement before it is executed provides the following advantages:
It is the most efficient way to execute the statement more than once, especially if
the statement is complex. The data source compiles the statement, produces an
access plan, and returns an access plan identifier to the driver. The data source
minimizes processing time by using the access plan each time it executes the
statement.
137
Prepared Execution
It allows the driver to send an access plan identifier instead of an entire statement each time the statement is to be executed. This minimizes network traffic.
The driver can return information about a result set before executing the statement. For more information, see Returning Information About a Result Set, in
Chapter 15, Returning Results.
Prepared execution is supported with SQLPrepare and SQLExecute. When an application calls SQLPrepare, the driver:
1.
Modifies the statement to use the form of SQL supported by the data source, if
necessary. In particular, the driver modifies the escape clauses used to define
ODBC-specific SQL. These are discussed in Supporting ODBC Extensions to
SQL, later in this chapter.
2.
3.
Stores the returned access plan identifier for later execution (if the preparation
succeeded) or returns errors to the application (if the preparation failed).
Retrieves current parameter values, converts them as necessary, and sends them
to the data source. For more information, see Supporting Parameters later in
this chapter.
2.
Sends the access plan identifier to the data source for execution.
3.
Important: Some data sources delete the access plans for all hstmts on an hdbc when a transaction is committed or rolled back; transactions may be committed or rolled back with SQL Transit
or automatically committed with the SQL_AUTOCOMMIT connection option. A driver reports
this behavior with the SQL_CURSOR_COMMIT_BEHAVIOR and
SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
If the data source does not support statement preparation, the driver must emulate it to
the extent possible. For example, if the data source supports procedures, the driver
might place the statement in a procedure and submit it for compilation when SQLPrepare is called. When SQLExecute is called, it would submit the compiled procedure for
execution.
If the data source supports syntax checking without execution, the driver might submit
the statement for checking when SQLPrepare is called and submit the statement for execution when SQLExecute is called.
138
Direct Execution
If the driver cannot emulate statement preparation, it stores the statement when SQLPrepare is called and submits it for execution when SQLExecute is called. In this case,
SQLExecute can return the errors normally returned by SQLPrepare.
Direct Execution
Executing a statement directly is the most efficient way to execute a statement a single
time. Direct execution is supported through SQLExecDirect. When an application calls
SQLExecDirect, the driver:
1.
Modifies the statement to use the form of SQL supported by the data source, if
necessary. In particular, the driver modifies the escape clauses used to define
ODBC-specific SQL. These are discussed in Supporting ODBC Extensions to
SQL, later in this chapter.
2.
Retrieves current parameter values, converts them as necessary, and sends them
to the data source. For more information, see Supporting Parameters later in
this chapter.
3.
4.
Supporting Parameters
An SQL statement can contain parameter markers that indicate values that the driver
retrieves from the application at execution time. For example, an application might use
the following statement to insert a row of data into the EMPLOYEE table:
INSERT INTO EMPLOYEE (NAME, AGE, HIREDATE) VALUES (?, ?, ?)
At any time after an hstmt has been allocated, an application calls SQLBindParameter to
specify information about a parameter. (If the application has previously called SQLBindParameter for a parameter, the driver replaces the old values with the new values.)
The driver:
Associates the address of the storage area with the parameter marker.
Stores the data types of the storage location and the column associated with the
parameter, as well as the precision and scale of the parameter.
139
Supporting Transactions
Note: When an application calls SQLBindParameter, it specifies the number of the parameter for
which it is providing information. The driver stores the information without checking if a corresponding parameter marker exists in the statement. When the statement is executed, the driver
only retrieves parameter values for those parameters with corresponding markers in the statement.
When the application calls SQLExecute or SQLExecDirect to execute the statement, the
driver:
1.
Checks that SQLBindParameter has been called for each parameter marker in
the statement. If not, the driver returns an error.
2.
Retrieves the current value of each parameter from its associated storage area.
3.
Converts the value from the data type of the storage area to the data type of the
associated column, if needed.
4.
The driver releases information about parameters only when the application calls SQLFreeStmt with the SQL_RESET_PARAMS option or SQL_DROP option. Hence, parameter information persists after a statement has been executed.
Supporting Transactions
Drivers support two modes for transactions: auto-commit and manual-commit. In autocommit mode, each SQL statement is a single, complete transaction; the driver commits
one transaction for each statement. In manual-commit mode, a driver begins a transaction when an application submits an SQL statement and no transaction is open. It commits or rolls back the current transaction only when the application calls SQLTransact.
If a driver supports the SQL_AUTOCOMMIT connection option, the default transaction
mode is auto-commit; otherwise, it is manual-commit. Applications call SQLSetConnectOption to switch between auto-commit and manual-commit mode. Note that if an
application switches from manual-commit to auto-commit mode, the driver commits
any open transactions on the connection.
Applications should call SQLTransact, rather than submitting a COMMIT or ROLLBACK statement, to commit or roll back a transaction. The result of a COMMIT or
ROLLBACK statement depends on the driver and its associated data source.
140
Important: Some data sources delete the access plans and closethe cursors for all hstmts on an hdbc
when a transaction is committed or ralled back; transactions may be committed or rolled back with
SQLTransact or automatically committed with the SQL_CURSOR_COMMIT_BEHAVIOR
and SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
141
SQLStatistics returns statistics about a single table and the indexes associated with that
table.
SQLProcedures returns the names of procedures stored in a data source.
SQLProcedureColumns returns a list of the input and output parameters, as well as the
names of columns in the result set, for one or more procedures.
Each function returns the information as a result set. The application retrieves these
results by calling SQLBindCol and SQLFetch.
If the data source associated with a driver does not support catalog functions, the driver
can implement these functions.
142
When the driver processes a call to SQLExecute or SQLExecDirect and the statement
being executed includes a data-at-execution parameter, the driver returns
SQL_NEED_DATA. To send the parameter data, the application:
1.
Calls SQLParamData. The driver returns rgbValue (which it stored when SQLBindParameter was called) for the first data-at-execution parameter.
2.
Calls SQLPutData one or more times to send data for the parameter. (More than
one call will be needed if the data value is larger than the buffer; multiple calls
are allowed only if the C data type is character or binary and the SQL data type
is character, binary, or data sourcespecific.)
3.
Calls SQLParamData again to indicate that all data has been sent for the parameter. The driver finishes processing the parameter. If there is another data-at-execution parameter, the driver returns rgbValue for that parameter and
SQL_NEED_DATA for the function return code. Otherwise, it returns
SQL_SUCCESS for the function return code.
4.
143
SQLColumnPrivileges
SQLColumns
SQLDescribeCol
SQLDescribeParam
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLForeignKeys
SQLGetData
SQLGetTypeInfo
SQLMoreResults
SQLNumParams
SQLNumResultCols
SQLParamData
SQLPrepare
SQLPrimaryKeys
SQLProcedureColumn
SQLProcedures
SQLPutData
SQLSetPos
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
144
While a function is executing asynchronously, an application can call any function with
a different hstmt or an hdbc not associated with the original hstmt. With the original hstmt
or the hdbc associated with that hstmt, the application can only call the original function,
SQLAllocStmt, SQLCancel, or SQLGetFunctions. If it calls any other function with the
original hstmt or the hdbc associated with that hstmt, the Driver Manager returns an error.
If the application calls the asynchronously executing function with the original hstmt, the
driver ignores all arguments except the hstmt argument. It returns
SQL_STILL_EXECUTING if the function is still executing. Otherwise, it returns a different code, such as SQL_SUCCESS or SQL_ERROR. For information about canceling an
asynchronously execution, see Terminating Statement Processing in Chapter 17, Terminating Transactions and Connections.
For functions that cannot be executed asynchronously, the driver ignores whether asynchronous execution is enabled for the hstmt.
Scalar functions such as numeric, string, and data type conversion functions
Outer joins
Procedures
The syntax defined by ODBC for these extensions uses the escape clause provided by the
X/Open and SQL Access Group SQL CAE specification (1992) to cover vendor-specific
extensions to SQL. Its format is:
--(*vendor(vendor-name), product(product-name) extension *)--
For the ODBC extensions to SQL, product-name is always ODBC, since the product
defining them is ODBC. Vendor-name is always Microsoft, since ODBC is a Microsoft
product. ODBC also defines a shorthand syntax for these extensions:
{extension}
Most DBMSs provide the same extensions to SQL as does ODBC. Because of this, an
application may be able to submit an SQL statement using one of these extensions in
either of two ways:
145
Use the syntax defined by ODBC. The driver translates the extension to its
DBMS-specific syntax. An application that uses the ODBC syntax will be
interoperable among DBMSs.
Use the syntax defined by the DBMS. The driver does not translate the extension. An application that uses DBMS-specific syntax will not be interoperable
among DBMSs.
In either case, the driver does not check the validity of the syntax except as needed to
translate the ODBC syntax to the DBMS-specific syntax. For example, the driver does
not perform type checking of the arguments of a scalar function.
Due to the difficulty in implementing some ODBC extensions to SQL, such as outer
joins, a driver might only implement those ODBC extensions that are supported by its
associated DBMS. A driver returns whether it and its associated data source support all
the ODBC extensions to SQL through SQLGetInfo with the
SQL_ODBC_SQL_CONFORMANCE flag. For information about how a driver returns
whether a specific extension is supported, see the section that describes the extension.
Note: Many DBMSs provide extensions to SQL other than those defined by ODBC. To use one
of these extensions, an application uses the DBMS-specific syntax. The driver does not translate
the extension. The application will not be interoperable among DBMSs.
146
For example, each of the following statements updates the birthday of John Smith in the
EMPLOYEE table. The first statement uses the escape clause syntax. The second statement uses the shorthand syntax. The third statement uses the native syntax for a DATE
column in DECs Rdb and is not interoperable among DBMSs.
UPDATE EMPLOYEE
SET BIRTHDAY=--(*vendor(Microsoft),
product(ODBC) d 1967-01-15 *)-WHERE NAME=Smith, John
UPDATE EMPLOYEE
SET BIRTHDAY={d 1967-01-15}
WHERE NAME=Smith, John
UPDATE EMPLOYEE
SET BIRTHDAY=15-Jan-1967
WHERE NAME=Smith, John
The ODBC escape clauses for date, time, and timestamp literals can be used in parameters with a C data type of SQL_C_CHAR. For example, the following statement uses a
parameter to update the birthday of John Smith in the EMPLOYEE table:
UPDATE EMPLOYEE SET BIRTHDAY=? WHERE NAME=Smith, John
A storage location of type SQL_C_CHAR bound to the parameter might contain any of
the following values. The first value uses the escape clause syntax. The second value uses
the shorthand syntax. The third value uses the native syntax for a DATE column in DECs
Rdb and is not interoperable among DBMSs.
"--(*vendor(Microsoft),product(ODBC) d 1967-01-15 *)--"
"{d 1967-01-15}"
"15-Jan-1967"
An application can also send date, time, or timestamp values as parameters using the C
structures defined by the C data types SQL_C_DATE, SQL_C_TIME, and
SQL_C_TIMESTAMP.
To determine if a data source supports date, time, or timestamp data, an application calls
SQLGetTypeInfo. If a driver supports date, time, or timestamp data, it must also support the escape clauses for date, time, or timestamp literals.
Scalar Functions
Scalar functions such as string length, absolute value, or current date can be used on
columns of a result set and on columns that restrict rows of a result set. The escape clause
ODBC uses for scalar functions is:
147
where scalar-function is one of the functions listed in Appendix F, Scalar Functions. The
shorthand syntax for scalar functions is:
{fn scalar-function}
For example, each of the following statements creates the same result set of uppercase
employee names. The first statement uses the escape clause syntax. The second statement uses the shorthand syntax. The third statement uses the native syntax for Ingres
for UNIX and is not interoperable among DBMSs.
SELECT --(*vendor(Microsoft),product(ODBC) fn UCASE(NAME) *)-FROM EMPLOYEE
SELECT {fn UCASE(NAME)} FROM EMPLOYEE
SELECT uppercase(NAME) FROM EMPLOYEE
An application can mix scalar functions that use native syntax and scalar functions that
use ODBC syntax. For example, the following statement creates a result set of last names
of employees in the EMPLOYEE table. (Names in the EMPLOYEE table are stored as a
last name, a comma, and a first name.) The statement uses the ODBC scalar function
SUBSTRING and the SQL Server scalar function CHARINDEX and will only execute
correctly on SQL Server.
SELECT {fn SUBSTRING(NAME, 1, CHARINDEX(',', NAME) 1)} FROM EMPLOYEE
To determine which scalar functions are supported by a data source, an application calls
SQLGetInfo with the SQL_NUMERIC_FUNCTIONS, SQL_STRING_FUNCTIONS,
SQL_SYSTEM_FUNCTIONS, and SQL_TIMEDATE_FUNCTIONS flags.
where value_exp is a column name, the result of another scalar function, or a literal value,
and data_type is a keyword that matches the #define name used by an ODBC SQL data
type (as defined in Appendix D, Data Types). The shorthand syntax for the CONVERT function is:
{fn CONVERT(value_exp, data_type)}
148
For example, the following statement creates a result set of the names and ages of all
employees in their twenties. It uses the CONVERT function to convert each employees
age from type SQL_SMALLINT to type SQL_CHAR. Each resulting character string is
compared to the pattern 2% to determine if the employees age is in the twenties.
SELECT NAME, AGE FROM EMPLOYEE
WHERE {fn CONVERT(AGE,SQL_CHAR)} LIKE 2%
where escape-character is any character supported by the data source. The shorthand
syntax for the LIKE predicate escape character is:
{escape escape-character}
For example, each of the following statements creates the same result set of department
names that start with the characters %AAA. The first statement uses the escape clause
syntax. The second statement uses the shorthand syntax. The third statement uses the
native syntax for Ingres for UNIX and is not interoperable among DBMSs. Note that the
second percent character in each LIKE predicate is a wild-card character that matches
zero or more of any character.
SELECT NAME FROM DEPT WHERE NAME
LIKE \%AAA% --(*vendor(Microsoft),product(ODBC) escape \*)-SELECT NAME FROM DEPT WHERE NAME LIKE \%AAA% {escape \}
SELECT NAME FROM DEPT WHERE NAME LIKE \%AAA% ESCAPE \
To determine whether LIKE predicate escape characters are supported by a data source,
an application calls SQLGetInfo with the SQL_LIKE_ESCAPE_CLAUSE information
type.
149
Outer Joins
ODBC supports the ANSI SQL-92 left outer join syntax. The escape clause ODBC uses
for outer joins is:
--(*vendor(Microsoft),product(ODBC) oj outer-join *)--
table-reference specifies a table name, and search-condition specifies the join condition
between the table-references. The shorthand syntax for outer joins is:
{oj outer-join}
An outer join request must appear after the FROM keyword and before the WHERE
clause (if one exists). For complete syntax information, see Appendix C, SQL Grammar.
For example, each of the following statements creates the same result set of the names
and departments of employees working on project 544. The first statement uses the
escape clause syntax. The second statement uses the shorthand syntax. The third statement uses the native syntax for Oracle and is not interoperable among DBMSs.
SELECT EMPLOYEE.NAME, DEPT.DEPTNAME
FROM --(*vendor(Microsoft),product(ODBC) oj
EMPLOYEE LEFT OUTER JOIN DEPT ON EMPLOYEE.DEPTID=DEPT.DEPTID*)-WHERE EMPLOYEE.PROJID=544
SELECT EMPLOYEE.NAME, DEPT.DEPTNAME
FROM {oj EMPLOYEE LEFT OUTER JOIN DEPT
ON EMPLOYEE.DEPTID=DEPT.DEPTID}
WHERE EMPLOYEE.PROJID=544
SELECT EMPLOYEE.NAME, DEPT.DEPTNAME
FROM EMPLOYEE, DEPT
WHERE (EMPLOYEE.PROJID=544) AND (EMPLOYEE.DEPTID = DEPT.DEPTID (+))
To determine the level of outer joins a data source supports, an application calls
SQLGetInfo with the SQL_OUTER_JOINS flag. Data sources can support two-table
outer joins, partially support multi-table outer joins, fully support multi-table outer
joins, or not support outer joins.
150
Procedures
An application can call a procedure in place of an SQL statement. The escape clause
ODBC uses for calling a procedure is:
--(*vendor(Microsoft),product(ODBC)
[?=] call procedure-name[([parameter][,[parameter]]...)] *)--
where procedure-name specifies the name of a procedure stored on the data source and
parameter specifies a procedure parameter. A procedure can have zero or more parameters and can return a value. The shorthand syntax for procedure invocation is:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
For output parameters, parameter must be a parameter marker. For input and input/output parameters, parameter can be a literal, a parameter marker, or not specified. If parameter is a literal or is not specified for an input/output parameter, the driver discards the
output value. If parameter is not specified for an input or input/output parameter, the
procedure uses the default value of the parameter as the input value; the procedure also
uses the default value if parameter is a parameter marker and the pcbValue argument in
SQLBindParameter is SQL_DEFAULT_PARAM. If a procedure call includes parameter
markers (including the ?= parameter marker for the return value), the application must
bind each marker by calling SQLBindParameter prior to calling the procedure.
Note: For some data sources, parameter cannot be a literal value. For all data sources, it can be a
parameter marker. For maximum interoperability, applications should always use a parameter
marker for parameter.
If an application specifies a return value parameter for a procedure that does not return
a value, the driver sets the pcbValue buffer specified in SQLBindParameter for the
parameter to SQL_NULL_DATA. If the application omits the return value parameter for
a procedure returns a value, the driver ignores the value returned by the procedure.
If a procedure returns a result set, the application retrieves the data in the result set in the
same manner as it retrieves data from any other result set.
For example, each of the following statements uses the procedure EMPS_IN_PROJ to
create the same result set of names of employees working on a project. The first statement
uses the escape clause syntax. The second statement uses the shorthand syntax. For an
example of code that calls a procedure, see SQLProcedures in Chapter 21, ODBC Function Reference.
--(*vendor(Microsoft),product(ODBC) call EMPS_IN_PROJ(?)*)-{call EMPS_IN_PROJ(?)}
151
152
Function
Description
SQLDescribeParam
SQLNativeSql
SQLNumParams
SQLSetStmtOption
SQLSetConnectOption
SQLGetStmtOption
Chapter 48
Returning Results
A SELECT statement is used to retrieve data that meets a given set of specifications. For
example, SELECT * FROM EMPLOYEE WHERE EMPNAME = "Jones" is used to retrieve
all columns of all rows in EMPLOYEE where the employees name is Jones. ODBC extension functions can also return data. For example, SQLColumns returns data about columns
in the data source. These sets of data, called result sets, can contain zero or more rows.
Note that other SQL statements, such as GRANT or REVOKE, do not return result sets.
For these statements, the code returned by the driver from SQLExecute or SQLExecDirect
is usually the only source of information as to whether the statement was successful. (For
INSERT, UPDATE, and DELETE statements, an application can call SQLRowCount to
return the number of affected rows.)
An application may or may not know the form of an SQL statement prior to execution.
Therefore, drivers support functions that allow an application to request information about
the result set.
For functions and SQL statements that return a result set, an application calls ODBC functions to fetch the results.
153
Checks whether the pointers are null. If the rgbValue pointer is null, the driver
unbinds the column. If the pcbValue pointer is null, the driver does not return
length information to the application.
Stores information about the data type to which to convert the result data.
154
1.
2.
3.
Converts the data for each bound column to the form specified by the fCType
argument in SQLBindCol. The driver may truncate the data for some data type
conversions.
Supporting Cursors
4.
Places the converted data for each bound column in the storage pointed to by the
rgbValue argument in SQLBindCol. For some data types, the driver will truncate
the data if the storage location is too small.
If the driver truncates data, it returns SQL_SUCCESS_WITH_INFO. For more information on converting and truncating data, see Converting Data From SQL to C Data
Types in Appendix D, Data Types.
Supporting Cursors
To keep track of its position in the result set, a driver maintains a cursor. The cursor is so
named because it indicates the current position in the result set, just as the cursor on a
CRT screen indicates current position. Each time an application calls SQLFetch, the
driver moves the cursor to the next row and returns that row. The cursor supported by
core ODBC functions only scrolls forward, one row at a time.
Important: Some data sources close the cursors for all hstmts on an hdbc when a transaction is
committed or rolled back; transactions may be committed or rolled back with SQLTransact or automatically committed with the SQL_AUTOCOMMIT connection option. A driver reports this
behavior with the SQL_CURSOR_COMMIT_BEHAVIOR and
SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
155
SQLGetData can return data from each column in a row of a result set. The
application must call SQLFetch or SQLExtendedFetch to move from row to
row.
The driver can return data from both bound and unbound columns in the same
row. SQLBindCol is used to bind as many columns as desired. SQLFetch or
SQLExtendedFetch positions the cursor on the next row of the result set and
returns data for all bound columns. SQLGetData can then return data for
unbound columns.
SQLGetData can be called more than once for the same column, as long as the
type of the column is character, binary, or data sourcespecific and the data is
being transferred to a buffer of type SQL_C_CHAR or SQL_C_BINARY. Each
time it is called, it returns the next unreturned part of the data. For example, an
application may need to retrieve data of the SQL_LONGVARCHAR and
SQL_LONGVARBINARY types in several parts.
Column-Wise Binding
To support column-wise binding of results, SQLBindCol performs the following tasks
for each column:
nAccepts the address of an array of data storage buffers and the size of one element of
the data array. When returning data, the driver will use the array element size to determine where to store successive rows of data in the array. If this address is null, the driver
unbinds the column.
156
Accepts the address of a second array. For each row, the driver will return the number of
bytes of data available to return in an element in this array. If this address is null, the
driver does not return the number of bytes of available data to the application.
Associates the arrays with a column.
Stores information about whether the data is to be converted to a different data type.
Row-Wise Binding
An application defines a structure in which to store row-wise bound results. For each
column to be bound, this structure contains one field in which to return data and one
field in which to return the number of bytes of data available to return.
To support row-wise binding of results, SQLBindCol performs the following tasks for
each column:
Accepts the address of the data field for the column in the first element of an
array of these structures. If this address is null, the driver unbinds the column.
Accepts the address of the number-of-bytes field for the column in the first element of the array of structures. If this address is null, the driver does not return
the number of bytes of available data to the application.
SQLSetStmtOption accepts the size of the structure. When returning data, the driver
uses the addresses and the size of the structure to determine where each successive row
of data is stored.
157
2.
3.
Stores the converted data in the calculated location. If the size of the converted
data is larger than the size of the data storage buffer (as specified in SQLBindCol), the driver truncates the data and returns SQL_SUCCESS_WITH_INFO or
stops the processing and returns SQL_ERROR.
4.
Calculates the location in the application where the number of available bytes
to return is to be stored.
For column-wise bound data, it uses the current row number, the pointer to the
number-of-bytes array, and the size of an array element. The pointer to the number-of-bytes array is specified with SQLBindCol.
For row-wise bound data, it uses the current row number, the pointer to the
number-of-bytes field in the first element of the array of structures, and the size
of the structure. The pointer to the number-of-bytes field is specified with SQLBindCol. The size of the structure is specified with SQLSetStmtOption.
5.
Note: Drivers are not required to support the use of SQLGetData with blocks (more than one row)
of data. A driver returns whether it supports the use of SQLGetData with blocks of data through
the SQL_GETDATA_EXTENSIONS option in SQLGetInfo.
158
Block Cursors
An application calls SQLSetStmtOption with the SQL_ROWSET_SIZE option to specify
the rowset size. The application can call SQLSetStmtOption to change the rowset size at
any time. Each time the application calls SQLExtendedFetch, the driver returns the next
rowset size rows of data. After the data is returned, the cursor points to the first row in the
rowset. By default, the rowset size is one.
Scrollable Cursors
Applications have different needs in their ability to sense changes in the tables underlying a result set. For example, when balancing financial data, an accountant needs data
that appears static; it is impossible to balance books when the data is continually changing. When selling concert tickets, a clerk needs up-to-the minute, or dynamic, data on
which tickets are still available. Various cursor models are designed to meet these needs,
each of which requires different sensitivities to changes in the tables underlying the
result set.
Static Cursors
At one extreme are static cursors, to which the data in the underlying tables appears to
be static. The membership, order, and values in the result set used by a static cursor are
generally fixed when the cursor is opened. Rows updated, deleted, or inserted by other
users (including other cursors in the same application) are not detected by the cursor
until it is closed and then reopened; the SQL_STATIC_SENSITIVITY information type
returns whether the cursor can detect rows it has updated, deleted, or inserted.
159
Static cursors are commonly implemented by taking a snapshot of the data or locking
the result set. Note that in the former case, the cursor diverges from the underlying
tables as other users make changes; in the latter case, other users are prohibited from
changing the data.
Dynamic Cursors
At the other extreme are dynamic cursors, to which the data appears to be dynamic. The
membership, order, and values in the result set used by a dynamic cursor are everchanging. Rows updated, deleted, or inserted by all users (the cursor, other cursors in
the same application, and other applications) are detected by the cursor when data is
next fetched. Although ideal for many situations, dynamic cursors are difficult to implement.
Keyset-Driven Cursors
Between static and dynamic cursors are keyset-driven cursors, which have some of the
attributes of each. Like static cursors, the membership and ordering of the result set of a
keyset-driven cursor is generally fixed when the cursor is opened. Like dynamic cursors, most changes to the values in the underlying result set are visible to the cursor
when data is next fetched.
When a keyset-driven cursor is opened, the driver saves the keys for the entire result set,
thus fixing the membership and order of the result set. As the cursor scrolls through the
result set, the driver uses the keys in this keyset to retrieve the current data values for
each row in the rowset. Because data values are retrieved only when the cursor scrolls
to a given row, updates to that row by other users (including other cursors in the same
application)after the cursor was opened are visible to the cursor.
If the cursor scrolls to a row of data that has been deleted by other users (including other
cursors in the same application), the row appears as a hole in the result set, since the key
is still in the keyset but the row is no longer in the result set. Updating the key values in
a row is considered to be deleting the existing row and inserting a new row; therefore,
rows of data for which the key values have been changed also appear as holes. When the
driver encounters a hole in the result set, it returns a status code of
SQL_ROW_DELETED for the row.
Rows of data inserted into the result set by other users (including other cursors in the
same application) after the cursor was opened are not visible to the cursor, since the keys
for those rows are not in the keyset.
160
The SQL_STATIC_SENSITIVITY information type returns whether the cursor can detect
rows it has deleted or inserted. Because updating key values in a keyset-driven cursor is
considered to be deleting the existing row and inserting a new row, keyset-driven cursors
can always detect rows they have updated.
161
162
Using Bookmarks
Using Bookmarks
A bookmark is a 32-bit value that an application uses to return to a row. The application
does not request that the driver places a bookmark on a row; instead, the application
requests a bookmark that it can use to return to a row. For example, if a bookmark is a
row number, an application requests the row number of a row and stores it. Later, the
application passes this row number back to the driver and requests that the driver return
to the row.
Before opening the cursor, an application must call SQLSetStmtOption with the
SQL_USE_BOOKMARKS option to inform the driver it will use bookmarks. After opening the cursor, the application retrieves bookmarks either from column 0 of the result set
or by calling SQLGetStmtOption with the SQL_GET_BOOKMARK option. To retrieve
a bookmark from the result set, the application either binds column 0 and calls SQLExtendedFetch or calls SQLGetData; in either case, the fCType argument must be set to
SQL_C_BOOKMARK. To return to the row specified by a bookmark, the application calls
SQLExtendedFetch with a fetch type of SQL_FETCH_BOOKMARK.
If a bookmark requires more than 32 bits, such as when it is a key value, the driver maps
the bookmarks requested by the application to 32-bit binary values. The 32-bit values are
then returned to the application. Because this mapping may require considerable memory, applications should only bind column 0 of the result set if they will actually use
bookmarks for most rows. Otherwise, they should call SQLGetStmtOption with the
SQL_GET_BOOKMARK statement option or call SQLGetData for column 0.
163
164
The SELECT statement that creates the result set has a FOR UPDATE clause.
The cursor name used in the UPDATE or DELETE statement is the same as the
cursor name associated with the SELECT statement.
Different hstmts are used for the SELECT statement and the UPDATE or
DELETE statement.
The hstmts for the SELECT statement and the UPDATE or DELETE statement
are on the same connection.
If the data source does not support positioned update and delete statements, the driver
can support them by saving the keys for the entire rowset. (If the application requested
a keyset-driven cursor, the driver may already have done this.) When the application
executes a positioned update or delete statement, the action of the driver depends on the
cursor concurrency:
Read Only
Locked
Optimistic Concurrency
Control Comparing Row
Versions
Optimistic Concurrency
Control Comparing
Values
A driver returns whether it supports positioned update and delete statements with the
SQL_POSITIONED_STATEMENTS option in SQLGetInfo. For an example of code that
performs a positioned update statement, see SQLSetCursorName in Chapter 21, ODBC
Function Reference.
165
SQLSetPos retrieves the data to update or add from the rowset buffers. It only updates
those columns in a row that have been bound with SQLBindCol and do not have a
length of SQL_IGNORE. However, it cannot add a new row of data unless all of the columns in the row are bound, are nullable, or have a default value.
To add a new row of data to the result set, a driver or data source:
1.
All unbound columns or bound columns for which the specified length is
SQL_IGNORE accept NULL values or have default values.
Retrieves the data from array index irow1 of each bound buffer for which the
specified length is not SQL_IGNORE, converts the data as necessary, and adds
the data to the new row in the data source. For information about how a driver
retrieves data for data-at-execution columns, see SQLSetPos in Chapter 21,
ODBC Function Reference..
3.
Leaves the row locked in accordance with the fLock argument and the
SQL_CONCURRENCY statement option.
4.
5.
If irow is less than or equal to the rowset size, including when irow is 0, sets the
corresponding value in the rgfRowStatus array to SQL_ROW_ADDED.
166
1.
Checks the value of the irow argument. If it is greater than the number of rows
in the rowset, the driver returns an error.
2.
3.
Retrieves the data from array index irow1 of each bound buffer for which the
specified length is not SQL_IGNORE, converts the data as necessary, and
updates the corresponding row in the data source. For information about how
a driver retrieves data for data-at-execution columns, see SQLSetPos in Chapter
21, ODBC Function Reference.
4.
Leaves the row locked in accordance with the fLock argument and the
SQL_CONCURRENCY statement option.
5.
6.
Checks the value of the irow argument. If it is greater than the number of rows in
the rowset, the driver returns an error.
2.
3.
4.
5.
Note: The application cannot perform any positioned operations, such as executing a positioned
update or delete statement or calling SQLGetData, on a deleted row.
167
168
Chapter 49
Responsibility for setting ODBC SQLSTATE based on the native error code.
Description
SQL_SUCCESS
SQL_SUCCESS_WITH_INFO
SQL_NO_DATA_FOUND
169
Return code
Description
SQL_ERROR
SQL_INVALID_HANDLE
Function failed due to an invalid environment handle, connection handle, or statement handle. This
indicates a programming error. No additional information is available from SQLError.
SQL_STILL_EXECUTING
SQL_NEED_DATA
While processing a statement, the driver determined that the application needs to send parameter
data values.
170
For a list of error codes and the functions that return them, see Appendix A, ODBC Error
Codes.
171
For errors that occur in a data source, the error text must use the format:
[vendor-identifier][ODBC-component-identifier][data-source-identifier]data-source-supplied-text
Meaning
vendor-identifier
ODBC-component-identifier
Identifies the component in which the error occurred or that received the error directly from the
data source.
data-source-identifier
component-supplied-text
data-source-supplied-text
1.In this case, the driver is acting as both the driver and the data source.
Note that the brackets ([ ]) must be included in the error text; they do not indicate
optional items.
Must not replace, alter, or mask errors received from another component.
May add an additional message to the error message queue when they receive
an error message from another component. The added message must add real
information value to the original message.
172
Must prefix its vendor identifier, its component identifier, and the data sources
identifier to the error text it receives from the data source.
Must prefix its vendor identifier and its component identifier to the error text.
Must format and return the error information as output arguments of SQLError
when that function is called.
One component other than the Driver Manager: must set the ODBC SQLSTATE based on
the native error. For one and two-tier drivers, the driver must set the ODBC SQLSTATE.
For three-tier drivers, either the driver or a gateway that supports ODBC may set the
ODBC SQLSTATE.
173
SQLCA Fields
szSQLState
pfNativeError
szErrorMsg
pcbErrorMsg
ers
As another example, the dbmsghandle function in Microsofts SQL Server installs a user
function to handle SQL Server messages. An ODBC driver for SQL Server might call
dbmsghandle to install a message handler, then use the msgno and msgtext arguments
of the handler to set the arguments of SQLError. Its documentation might include the
following table:
SQLError Argument
szSQLState
pfNativeError
msgno
szErrorMsg
pcbErrorMsg
174
Single-Tier Driver
A single-tier driver acts both as an ODBC driver and as a data source. It can therefore
generate errors both as a component in an ODBC connection and as a data source.
Because it also is the component that interfaces with the Driver Manager, it formats and
returns arguments for SQLError.
For example, if a Visigenic driver for text files could not allocate sufficient memory, it
might return the following arguments for SQLError:
szSQLState="S1001"
pfNativeError=NULL
szErrorMsg="[Visigenic][ODBC Text Driver]Unable to
allocate sufficient memory."
pcbErrorMsg=67
Because this error was not related to the data source, the driver only added prefixes to
the error text for the vendor ([Visigenic]) and the driver ([ODBC Text Driver]).
If the driver could not find the file EMPLOYEE.DBF, it might return the following arguments for SQLError:
szSQLState="S0002"
pfNativeError=NULL
szErrorMsg="[Visigenic][ODBC Text Driver][Text]Invalid file
name; file EMPLOYEE.DBF not found."
pcbErrorMsg=83
Because this error was related to the data source, the driver added the file format of the
data source ([Text]) as a prefix to the error text. Because the driver was also the component that interfaced with the data source, it added prefixes for the vendor ([Visigenic])
and the driver ([ODBC Text Driver]).
Multiple-Tier Driver
A two-tier driver sends requests to a DBMS and returns information to the application
through the Driver Manager. Because it is the component that interfaces with the Driver
Manager, it formats and returns arguments for SQLError.
For example, if a Visigenic driver for Sybases SQL Server encountered a duplicate cursor
name, it might return the following arguments for SQLError:
szSQLState="3C000"
pfNativeError=NULL
szErrorMsg="[Visigenic][ODBC Sybase SQL Server Driver]
Duplicate cursor name: EMPLOYEE_CURSOR."
pcbErrorMsg=67
175
Because the error occurred in the driver, it added prefixes to the error text for the vendor
([Visigenic]) and the driver ([ODBC Sybase SQL Server Driver]).
If the DBMS could not find the table EMPLOYEE, the driver might format and return
the following arguments for SQLError:
szSQLState="S0002"
pfNativeError=-1
szErrorMsg="[Visigenic][ODBC Sybase SQL Server Driver]
[SQL Server] %SQL-F-RELNOTDEF, Table EMPLOYEE
is not defined in schema."
pcbErrorMsg=92
Because the error occurred in the data source, the driver added a prefix for the data
source identifier ([SQL Server]) to the error text. Because the driver was the component
that interfaced with the data source, it added prefixes for its vendor ([Visigenic]) and
identifier ([ODBC Sybase SQL Server Driver]) to the error text.
Gateways
In a gateway architecture, a driver sends requests to a gateway that supports ODBC. The
gateway sends the requests to a DBMS. Because it is the component that interfaces with
the Driver Manager, the driver formats and returns arguments for SQLError.
For example, if DEC based a gateway to Rdb on Microsoft Open Data Services, and Rdb
could not find the table EMPLOYEE, the gateway might generate the error text:
"[S0002][-1][DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF, Table EMPLOYEE is
not defined in schema."
Because the error occurred in the data source, the gateway added a prefix for the data
source identifier ([Rdb]) to the error text. Because the gateway was the component that
interfaced with the data source, it added prefixes for its vendor ([DEC]) and identifier
([ODS Gateway]) to the error text. Note that it also added the SQLSTATE value and the
Rdb error code to the beginning of the error text. This permitted it to preserve the semantics of its own message structure and still supply the ODBC error information to the
driver.
Because the gateway driver is the component that interfaces with the Driver Manager, it
would use the preceding error text to format and return the following arguments for
SQLError:
szSQLState="S0002"
pfNativeError=-1
szErrorMsg="[DEC][ODS Gateway][Rdb]%SQL-F-RELNOTDEF, Table
EMPLOYEE is not defined in schema."
pcbErrorMsg=81
176
Driver Manager
The Driver Manager can also generate error messages. For example, if an application
passed an invalid argument value to SQLDataSources, the Driver Manager might
format and return the following arguments for SQLError:
szSQLState="S1009"
pfNativeError=NULL
szErrorMsg="[Visigenic][ODBC lib]Invalid argument value:
SQLDataSources."
pcbErrorMsg=60
Because the error occurred in the Driver Manager, it added prefixes to the error text for
its vendor ([Visigenic]) and its identifier ([ODBC lib]).
177
178
Chapter 50
SQL_DROP
SQL_UNBIND
SQL_RESET_PARAMS
Frees all parameter buffers requested by SQLBindParameter for the statement handle.
SQLCancel requests that the currently executing statement be canceled. When and if the statement
is actually canceled is driver- and data sourcedependent. If the application calls the function that
was executing the statement after the statement has been canceled, the driver returns
179
Terminating Transactions
Terminating Transactions
The SQLTransact function requests a commit or rollback operation for the current transaction.
The driver must submit a commit or rollback request for all operations associated with the specified hdbc; this includes operations for all hstmts associated with the hdbc.
Terminating Connections
To allow an application to terminate the connection to a driver and the data source, the driver
supports the following three functions:
180
SQLDisconnect
SQLFreeConnect
SQLFreeEnv
Chapter 51
ODBC Component
Files to be Distributed
Driver Manager
libodbc.so
odbc.m
Cursor Library
odbccurs.so
odbccurs.m
Connection Dialog
vscnctdlg.so
Copy your driver(s) to the drivers subdirectory in the odbc root directory on the
users system.
Copy the appropriate ODBC components to the users lib and messages subdirectories in the odbc root directory.
Create (or update) the odbcinst.ini file that is located in the odbc root directory.
Create (or update) the odbc.ini file that is located in the odbc root directory.
The odbcinst.ini and odbc.ini files are initialization files. The odbcinst.ini file is used
by the Driver Manager to determine which drivers and translators are currently
installed. The structure and format of this file is described in the next section. odbc.ini
is a template file which contains the users data source configuration information. The
structure and format of this file is described in Chapter 19, Configuring Data Sources.
Important: The odbc.ini file that you provide must be copied to each users home
directory and renamed .odbc.ini. The user must customize this file to reflect appropriate data source configuration information.
182
The [ODBC Drivers] section lists the description of each available driver.
For each driver described in the [ODBC Drivers] section, there is a section that
lists the driver shared library and any driver attribute keywords.
The [ODBC Translators] section lists the description of each available translator.
For each translator described in the [ODBC Translators] section, there is a section that lists the translator shared library.
For example, suppose a user has installed drivers for Sybase SQL Server and Oracle
Database Server. The [ODBC Drivers] section might contain the following entries:
[ODBC Drivers]
Sybase SQL Server=Installed
Oracle=Installed
183
184
Keyword
Usage
APILevel
ConnectFunctions
DriverODBCVer
Keyword
Usage
FileUsage
185
Keyword
Usage
FileExtns
SQLLevel
For example, suppose the driver for a Sybase SQL Server database has a driver shared
library named vssyb.so and a server named SYB10. Suppose also that a driver for an
Oracle database has a driver shared library named vsorac.so. The specification sections
for these drivers might be:
[Sybase10]
Driver=/opt/odbc/vssyb.so
SQLLevel=1
APILevel=1
[Oracle]
Driver=/opt/odbc/vsorac.so
APILevel=1
186
For example, if the Sybase SQL Server driver is the default driver, the default driver specification section might be:
[Default]
Driver=Sybase SQL Server
For example, suppose a user has installed the Microsoft Code Page Translator and a
custom EBCDIC to ASCII translator. The [ODBC Translators] section might contain the
following entries:
[ODBC Translators]
MS Code Page Translator=Installed
EBCDIC to ASCII =Installed
187
For example, suppose the Microsoft Code Page Translator has a translation shared
library named mscpxlt.so, which contains the setup function. Suppose also that a
custom EBCDIC to ASCII translator has a translation shared library named ebcasc.so.
The specification sections for these translators might be:
[MS Code Page Translator]
Translator=/opt/odbc/lib/mscpxlt.so
[ASCII to EBCDIC]
Translator=/opt/odbc/lib/ebcasc.so
188
Chapter 52
Create a script that edits the users copy of the odbc.ini file (called .odbc.ini).
Instruct the user on the changes that must be made to the users .odbc.ini file.
189
To add, modify, or delete the default translator and default translation option specified
in the odbc.ini file, you must specify the TranslationName, TranslationSharedLibrary,
and TranslationOption keywords. These keywords have the following values:
Keyword
Value
TranslationName
TranslationSharedLibrary
TranslationOption
190
For each data source listed in the [ODBC Data Sources] section, there is a section
that lists additional information about that data source.
For example, suppose a user has three data sources: Personnel and Inventory, which use
formatted text files, and Payroll, which uses a Sybase SQL Server. The [ODBC Data
Sources] section might contain the following entries:
[ODBC Data Sources]
Personnel=Text
Inventory=Text
Payroll=Sybase SQL Server
192
Keyword
Meaning
InstallDir
Trace
TraceFile
Keyword
Meaning
TraceAutoStop
193
194
Chapter 53
Function Summary
This chapter summarizes the functions used by ODBC-enabled applications and related
software:
ODBC functions
195
Conformance
Purpose
SQLAllocEnv
Core
Obtains an environment handle. One environment handle is used for one or more connections.
SQLAllocConnect
Core
SQLConnect
Core
SQLDriverConnect
Level 1
SQLBrowseConnect
Level 2
196
Function Name
Conformance
Purpose
SQLDataSources
Level 2
SQLDrivers
Level 2
SQLGetInfo
Level 1
SQLGetFunctions
Level 1
SQLGetTypeInfo
Level 1
Conformance
Purpose
SQLSetConnectOption
Level 1
SQLGetConnectOption
Level 1
SQLSetStmtOption
Level 1
SQLGetStmtOption
Level 1
Function Name
Conformance
Purpose
SQLAllocStmt
Core
SQLPrepare
Core
SQLBindParameter
Level 1
SQLParamOptions
Level 2
SQLGetCursorName
Core
SQLSetCursorName
Core
SQLSetScrollOptions
Level 2
197
Conformance
Purpose
SQLExecute
Core
SQLExecDirect
Core
Executes a statement.
SQLNativeSql
Level 2
SQLDescribeParam
Level 2
SQLNumParams
Level 2
SQLParamData
Level 1
SQLPutData
Level 1
Send part or all of a data value for a parameter. (Useful for long data values.)
198
Function Name
Conformance
Purpose
SQLRowCount
Core
SQLNumResultCols
Core
SQLDescribeCol
Core
SQLColAttributes
Core
SQLBindCol
Core
SQLFetch
Core
SQLExtendedFetch
Level 2
Function Name
Conformance
Purpose
SQLGetData
Level 1
SQLSetPos
Level 2
SQLMoreResults
Level 2
Determines whether there are more result sets available and, if so, initializes
processing for the next result set.
SQLError
Core
Conformance
Purpose
SQLColumnPrivileges
Level 2
SQLColumns
Level 1
SQLForeignKeys
Level 2
SQLPrimaryKeys
Level 2
SQLProcedureColumns
Level 2
Returns the list of input and output parameters, as well as the columns that
make up the result set for the specified
procedures.
SQLProcedures
Level 2
199
200
Function Names
Conformance
Purpose
SQLSpecialColumns
Level 1
SQLStatistics
Level 1
SQLTablePrivileges
Level 2
SQLTables
Level 1
Terminating a Statement
Function Name
Conformance
Purpose
SQLFreeStmt
Core
SQLCancel
Core
SQLTransact
Core
Function Name
Conformance
Purpose
SQLDisconnect
Core
SQLFreeConnect
Core
SQLFreeEnv
Core
Terminating a Connection
Function Name
Purpose
ConfigDSN
ConfigTranslator
201
202
Task
Function name
Purpose
Translating
data
SQLDriverToDataSource
SQLDataSourceToDriver
Chapter 54
Purpose
ODB version
Conformance level
Syntax
Arguments
Return values
Diagnostics
Comments
Code example
Related functions
Error handling is described in the SQLError function description. The text associated with
SQLSTATE values is included to provide a description of the condition, but is not intended
to prescribe specific text.
Arguments
All function arguments use a naming convention of the following form:
[[prefix]...]tag[qualifier][suffix]
203
Arguments
Optional elements are enclosed in square brackets ([]). The following prefixes are used:
Prefix
Description
Count of
Handle of
Index of
Pointer to
rg
Range (array) of
204
Tag
Description
Byte
col
dbc
Database connection
env
Environment
par
row
stmt
Statement
sz
Arguments
Prefixes and tags combine to correspond roughly to the ODBC C types listed below. Flags
(f) and byte counts (cb) do not distinguish between SWORD, UWORD, SDWORD, and
UDWORD.
Combined
Prefix
Tag
ODBC C Type(s)
Description
cb
SWORD, SDWORD,
UDWORD
Count of bytes
crow
row
SDWORD,
UDWORD,
UWORD
Count of rows
SWORD, UWORD
Flag
hdbc
dbc
HDBC
Connection handle
henv
env
HENV
Environment handle
hstmt
stmt
HSTMT
Statement handle
hwnd
wnd
HWND
Widget
ib
SWORD
Byte index
icol
col
UWORD
Column index
ipar
par
UWORD
Parameter index
irow
row
pcb
pc
SWORD FAR *,
SDWORD FAR *,
UDWORD FAR *
pccol
pc
col
SWORD FAR *
pcpar
pc
par
SWORD FAR *
pcrow
pc
row
SDWORD FAR *,
UDWORD FAR *
pf
SWORD, SDWORD,
UWORD
Pointer to flag
phdbc
ph
dbc
HDBC FAR *
205
Arguments
Combined
Prefix
Tag
ODBC C Type(s)
Description
phenv
ph
env
HENV FAR *
Pointer to environment
handle
phstmt
ph
stmt
HSTMT FAR *
pib
pi
SWORD FAR *
pirow
pi
row
UDWORD FAR *
prgb
prg
PTR FAR *
pv
PTR
Pointer to value of
unspecified type
rgb
rg
PTR
rgf
rg
UWORD FAR *
sz
sz
UCHAR FAR *
UDWORD
Qualifiers are used to distinguish specific variables of the same type. Qualifiers consist
of the concatenation of one or more capitalized English words or abbreviations.
ODBC defines one value for the suffix Max, which denotes that the variable represents
the largest value of its type for a given situation.
For example, the argument cbErrorMsgMax contains the largest possible byte count for
an error message; in this case, the argument corresponds to the size in bytes of the argument szErrorMsg, a character string buffer. The argument pcbErrorMsg is a pointer to the
count of bytes available to return in the argument szErrorMsg, not including the null termination character.
Important: Because characters are signed in many UNIX implementations
and string arguments in ODBC functions are unsigned, applications that
pass string objects to ODBC functions without casting them will receive
compiler warnings.
206
Diagnostics
The diagnostics provided with each function list the SQLSTATEs that may be returned
for the function by the Driver Manager or a driver. Drivers can, however, return additional SQLSTATEs arising out of implementation-specific situations.
The character string value returned for an SQLSTATE consists of a two-character class
value followed by a three-character subclass value. A class value of 01 indicates a
warning and is accompanied by a return code of SQL_SUCCESS_WITH_INFO. Class
values other than 01, except for the class IM, indicate an error and are accompanied
by a return code of SQL_ERROR. The class IM is specific to warnings and errors that
derive from the implementation of ODBC itself. The subclass value 000 in any class is
for implementation-defined conditions within the given class. The assignment of class
and subclass values is defined by ANSI SQL-92.
Catalog Functions
ODBC supports a set of functions that return information about the data sources system
tables or catalog. These are sometimes referred to collectively as the catalog functions. For
more information about catalog functions, see Retrieving Information About the Data
207
Sources Catalog in Chapter 6, Executing an SQL Statement, and Returning Information About the Data Sources Catalog in Chapter 14, Processing an SQL Statement.
The catalog functions are:
SQLColumnPrivileges
SQLColumns
SQLForeignKeys
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
208
SQLAllocConnect
named ABC%. If the search pattern for a table name is \\%, the function
will return all tables with names that start with a backslash. Failing to precede a
metacharacter used as a literal with an escape character may return more results
than expected. For example, if a table identifier, MY_TABLE was returned as
the result of a call to SQLTables and an application wanted to retrieve a list of
columns for MY_TABLE using SQLColumns would return all of the tables
that matched MY_TABLE, such as MY_TABLE, MY1TABLE, MY2TABLE, and so
on, unless the escape character precedes the underscore.
A zero length search pattern matches the empty string. A search pattern argument that is a null pointer means the search will not be constrained for the
argument. (A null pointer and a search string of % should return the same
values.)
SQLAllocConnect
Core
SQLAllocConnect allocates memory for a connection handle within the environment
identified by henv.
Syntax
RETCODE SQLAllocConnect(henv, phdbc)
Argument
Use
Description
HENV
henv
Input
Environment handle.
HDBC FAR *
phdbc
Output
209
SQLAllocConnect
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
If SQLAllocConnect returns SQL_ERROR, it will set the hdbc referenced by phdbc to
SQL_NULL_HDBC. To obtain additional information, the application can call SQLError
with the specified henv and with hdbc and hstmt set to SQL_NULL_HDBC and
SQL_NULL_HSTMT, respectively.
Diagnostics
When SQLAllocConnect returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLAllocConnect and explains each
one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
.
210
SQLSTATE
Error
Description
01000
General warning
S1000
General error
S1001
Memory allocation
failure
S1009
Invalid argument
value
SQLAllocConnect
Comments
A connection handle references information such as the valid statement handles on the
connection and whether a transaction is currently open. To request a connection handle,
an application passes the address of an hdbc to SQLAllocConnect. The driver allocates
memory for the connection information and stores the value of the associated handle in
the hdbc. On operating systems that support multiple threads, applications can use the
same hdbc on different threads and drivers must therefore support safe, multithreaded
access to this information. The application passes the hdbc value in all subsequent calls
that require an hdbc.
The Driver Manager processes the SQLAllocConnect function and calls the drivers
SQLAllocConnect function when the application calls SQLConnect, SQLBrowseConnect, or SQLDriverConnect. (For more information, see the description of the SQLConnect function.)
If the application calls SQLAllocConnect with a pointer to a valid hdbc, the driver overwrites the hdbc without regard to its previous contents.
Code Example
See SQLBrowseConnect and SQLConnect.
211
SQLAllocEnv
Related Functions
For information about
See
SQLConnect
SQLFreeConnect
SQLAllocEnv
Core
SQLAllocEnv allocates memory for an environment handle and initializes the ODBC
call level interface for use by an application. An application must call SQLAllocEnv
prior to calling any other ODBC function.
Syntax
RETCODE SQLAllocEnv(phenv)
Argument
Use
Description
HENV FAR *
phenv
Output
Returns
SQL_SUCCESS or SQL_ERROR.
If SQLAllocEnv returns SQL_ERROR, it will set the henv referenced by phenv to
SQL_NULL_HENV. In this case, the application can assume that the error was a
memory allocation error.
212
SQLAllocEnv
Diagnostics
A driver cannot return SQLSTATE values directly after the call to SQLAllocEnv, since no
valid handle will exist with which to call SQLError.
There are two levels of SQLAllocEnv functions, one within the Driver Manager and one
within each driver. The Driver Manager does not call the driver-level function until the
application calls SQLConnect, SQLBrowseConnect, or SQLDriverConnect. If an error
occurs in the driver-level SQLAllocEnv function, then the Driver Manager level SQLConnect, SQLBrowseConnect, or SQLDriverConnect function returns SQL_ERROR. A
subsequent call to SQLError with henv, SQL_NULL_HDBC, and SQL_NULL_HSTMT
returns SQLSTATE IM004 (Drivers SQLAllocEnv failed), followed by one of the following errors from the driver:
Comments
An environment handle references global information such as valid connection handles
and active connection handles. To request an environment handle, an application passes
the address of an henv to SQLAllocEnv. The driver allocates memory for the environment information and stores the value of the associated handle in the henv. On operating
systems that support multiple threads, applications can use the same henv on different
threads and drivers must therefore support safe, multithreaded access to this information. The application passes the henv value in all subsequent calls that require an henv.
There should never be more than one henv allocated at one time and the application
should not call SQLAllocEnv when there is a current valid henv. If the application calls
SQLAllocEnv with a pointer to a valid henv, the driver overwrites the henv without
regard to its previous contents.
When the Driver Manager processes the SQLAllocEnv function, it checks the Trace .keyword in the [ODBC] section of the odbc.ini. If it is set to 1, the Driver Manager enables
tracing for all applications.
213
SQLAllocStmt
Code Example
See SQLBrowseConnect and SQLConnect.
Related Functions
For information about
See
SQLAllocConnect
SQLConnect
SQLFreeEnv
SQLAllocStmt
Core
SQLAllocStmt allocates memory for a statement handle and associates the statement
handle with the connection specified by hdbc.
An application must call SQLAllocStmt prior to submitting SQL statements.
Syntax
RETCODE SQLAllocStmt(hdbc, phstmt)
214
Type
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
HSTMT FAR *
phstmt
Output
SQLAllocStmt
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_INVALID_HANDLE, or
SQL_ERROR.
If SQLAllocStmt returns SQL_ERROR, it will set the hstmt referenced by phstmt to
SQL_NULL_HSTMT. The application can then obtain additional information by calling
SQLError with the hdbc and SQL_NULL_HSTMT.
Diagnostics
When SQLAllocStmt returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLAllocStmt and explains each one in the
context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08003
Connection not
open
IM001
S1000
General error
215
SQLAllocStmt
SQLSTATE
Error
Description
S1001
Memory allocation
failure
S1009
Invalid argument
value
Comments
A statement handle references statement information, such as network information,
SQLSTATE values and error messages, cursor name, number of result set columns, and
status information for SQL statement processing.
To request a statement handle, an application connects to a data source and then passes
the address of an hstmt to SQLAllocStmt. The driver allocates memory for the statement
information and stores the value of the associated handle in the hstmt. On operating systems that support multiple threads, applications can use the same hstmt on different
threads and drivers must therefore support safe, multithreaded access to this information. The application passes the hstmt value in all subsequent calls that require an hstmt.
If the application calls SQLAllocStmt with a pointer to a valid hstmt, the driver overwrites the hstmt without regard to its previous contents.
Code Example
See SQLBrowseConnect, SQLConnect, and SQLSetCursorName.
216
SQLBindCol
Related Functions
For information about
See
SQLExecDirect
SQLExecute
SQLFreeStmt
SQLPrepare
SQLBindCol
Core
SQLBindCol assigns the storage and data type for a column in a result set, including:
A storage location that will receive the actual length of the column of data
returned by the fetch operation
Syntax
RETCODE SQLBindCol(hstmt, icol, fCType, rgbValue, cbValueMax, pcbValue)
217
SQLBindCol
218
Type
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
icol
Input
SQLBindCol
Type
Argument
Use
Description
SQLSMALLINT
fCType
Input
219
SQLBindCol
Type
Argument
Use
SQLPOINTER
rgbValue
Input
Description
Pointer to storage for the data. If rgbValue is
a null pointer, the driver unbinds the column.
(To unbind all columns, an application calls
SQLFreeStmt with the SQL_UNBIND
option.)
If a null pointer was passed for rgbValue in
ODBC 1.0, the driver returned SQLSTATE
S1009 (Invalid argument value); individual
columns could not be unbound.
220
SQLBindCol
Type
Argument
Use
Description
SQLLEN
cbValueMax
Input
SQLLEN*
pcbValue
Input
221
SQLBindCol
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLBindCol returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLBindCol and explains each one in the
context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
222
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
S1001
Memory allocation
failure
S1002
Invalid column
number
SQLBindCol
SQLSTATE
Error
Description
S1003
S1009
Invalid argument
value
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1C00
Comments
The ODBC interface provides two ways to retrieve a column of data:
SQLBindCol assigns the storage location for a column of data before the data is
retrieved. When SQLFetch or SQLExtendedFetch is called, the driver places the data for
all bound columns in the assigned locations.
223
SQLBindCol
SQLGetData (an extended function) assigns a storage location for a column of data after
SQLFetch or SQLExtendedFetch has been called. It also places the data for the
requested column in the assigned location. Because it can retrieve data from a column in
parts, SQLGetData can be used to retrieve long data values.
An application may choose to bind every column with SQLBindCol, to do no binding
and retrieve data only with SQLGetData, or to use a combination of the two. However,
unless the driver provides extended functionality, SQLGetData can only be used to
retrieve data from columns that occur after the last bound column.
An application calls SQLBindCol to pass the pointer to the storage buffer for a column
of data to the driver and to specify how or if the data will be converted. It is the applications responsibility to allocate enough storage for the data. If the buffer will contain
variable length data, the application must allocate as much storage as the maximum
length of the bound column or the data may be truncated. For a list of valid data conversion types, see Converting Data from SQL to C Data Types in Appendix D, Data
Types.
At fetch time, the driver processes the data for each bound column according to the
arguments specified in SQLBindCol. First, it converts the data according to the argument fCType. Next, it fills the buffer pointed to by rgbValue. Finally, it stores the available
number of bytes in pcbValue; this is the number of bytes available prior to calling
SQLFetch or SQLExtendedFetch.
Note: The SQL_MAX_LENGTH statement option is intended to reduce network traffice and
may not be supported by all drivers. To guarantee that data is truncated, an application should
allocate a buffer of the desired size and specify this size in the cbValueMax argument.
224
If the data value for a column is NULL, the driver sets pcbValue to
SQL_NULL_DATA.
SQLBindCol
When an application uses SQLExtendedFetch to retrieve more than one row of data, it
only needs to call SQLBindCol once for each column of the result set (just as when it
binds a column in order to retrieve a single row of data with SQLFetch). The SQLExtendedFetch function coordinates the placement of each row of data into subsequent locations in the rowset buffers. For additional information about binding rowset buffers, see
the Comments topic for SQLExtendedFetch.
An application can call SQLBindCol to bind a column to a new storage location, regardless of whether data has already been fetched. The new binding replaces the old binding.
Note that the new binding does not apply to data already fetched; the next time data is
fetched, the data will be placed in the new storage location.
To unbind a single bound column, an application calls SQLBindCol and specifies a null
pointer for rgbValue; if rgbValue is a null pointer and the column is not bound, SQLBindCol returns SQL_SUCCESS. To unbind all bound columns, an application calls SQLFreeStmt with the SQL_UNBIND option.
Code Example
In the following example, an application executes a SELECT statement to return a result
set of the employee names, ages, and birthdays, which is sorted by birthday. It then calls
SQLBindCol to bind the columns of data to local storage locations. Finally, the application fetches each row of data with SQLFetch and prints each employees name, age, and
birthday.
For more code examples, see SQLColumns, SQLExtendedFetch, and SQLSetPos.
#define NAME_LEN 30
#define BDAY_LEN 11
UCHAR szName[NAME_LEN], szBirthday[BDAY_LEN];
SWORD sAge;
SQLLEN cbName, cbAge, cbBirthday;
retcode = SQLExecDirect(hstmt,
"SELECT NAME, AGE, BIRTHDAY FROM EMPLOYEE ORDER BY 3, 2, 1",
SQL_NTS);
if (retcode == SQL_SUCCESS) {
/* Bind columns 1, 2, and 3 */
SQLBindCol(hstmt, 1, SQL_C_CHAR, szName, NAME_LEN, &cbName);
SQLBindCol(hstmt, 2, SQL_C_SSHORT, &sAge, 0, &cbAge);
SQLBindCol(hstmt, 3, SQL_C_CHAR, szBirthday, BDAY_LEN, &cbBirthday);
225
SQLBindParameter
Related Functions
For information about
See
SQLDescribeCol
SQLExtendedFetch (extension)
SQLFetch
SQLFreeStmt
SQLGetData (extension)
SQLNumResultCols
SQLBindParameter
ODBC Version 2.0
Level 1
SQLBindParameter binds a buffer to a parameter marker in an SQL statement.
226
SQLBindParameter
Note that this function replaces the ODBC 1.0 function SQLSetParam. For more information, see Comments.
Syntax
RETCODE SQLBIND (hstmt, ipar, fParamType, fCType, FSqlType, cbColDef, ibScale, rgbValue,
cbValueMax, pcbValue)
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
ipar
Input
SQLSMALLINT
fParamType
Input
SQLSMALLINT
fCType
Input
SQLSMALLINT
fSqlType
Input
SQLULEN
cbColDef
Input
227
SQLBindParameter
Type
Argument
Use
Description
SQLSMALLINT
ibScale
Input
SQLPOINTER
rgbValue
Input
Output
SQLLEN
cbValueMax
Input
SQLLEN*
pcbValue
Input/
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLBindParameter returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLBindParameter and explains
228
SQLBindParameter
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
07006
IM001
S1000
General error
S1001
Memory allocation
failure
S1003
S1004
S1009
Invalid argument
value
229
SQLBindParameter
230
SQLSTATE
Error
Description
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1093
Invalid parameter
number
S1094
S1104
Invalid precision
value
SQLBindParameter
SQLSTATE
Error
Description
S1105
Invalid parameter
type
S1C00
Comments
An application calls SQLBindParameter to bind each parameter marker in an SQL statement. Bindings remain in effect until the application calls SQLBindParameter again or
until the application calls SQLFreeStmt with the SQL_DROP or SQL_RESET_PARAMS
option.
231
SQLBindParameter
For more information concerning parameter data types and parameter markers, see
Parameter Data Types and Parameter Markers in Appendix C, SQL Grammar.
fParamType Argument
The fParamType argument specifies the type of the parameter. All parameters in SQL
statements that do not call procedures, such as INSERT statements, are input parameters. Parameters in procedure calls can be input, input/output, or output parameters.
(An application calls SQLProcedureColumns to determine the type of a parameter in a
procedure call; parameters in procedure calls whose type cannot be determined are
assumed to be input parameters.)
The fParamType argument is one of the following values:
232
SQLBindParameter
source does not return a value for an input/output parameter, the driver sets the
pcbValue buffer to SQL_NULL_DATA.
Note that when an ODBC 1.0 application calls SQLSetParam in an ODBC 2.0
driver, the Driver Manager converts this to a call to SQLBindParameter in which
the fParamType argument is set to SQL_PARAM_INPUT_OUTPUT.
fCType Argument
The C data type of the parameter. This must be one of the following values:
SQL_C_BINARY
SQL_C_BIT
SQL_C_CHAR
SQL_C_DATE
SQL_C_DEFAULT
SQL_C_DOUBLE
SQL_C_FLOAT
SQL_C_SLONG
SQL_C_SSHORT
SQL_C_STINYINT
SQL_C_TIME
SQL_C_TIMESTAMP
SQL_C_ULONG
SQL_C_USHORT
SQL_C_UTINYINT
SQL_C_DEFAULT specifies that the parameter value be transferred from the default C
data type for the SQL data type specified with fSqlType.
Important: Drivers must also support the following values of fCType from ODBC 1.0. Applications must use these values, instead of the ODBC 2.0 values, when calling an ODBC 1.0 driver:
SQL_C_LONG
233
SQLBindParameter
SQL_C_SHORT
SQL_C_TINYINT
For more information, see Default C Data Types and Converting Data from C to SQL
Data Types and Converting Data from SQL to C Data Types in Appendix D, Data
Types.
fSqlType Argument
This must be one of the following values:
SQL_BIGINT
SQL_BINARY
SQL_BIT
SQL_CHAR
SQL_DATE
SQL_DECIMAL
SQL_DOUBLE
SQL_FLOAT
SQL_INTEGER
SQL_LONGVARBINARY
SQL_LONGVARCHAR
SQL_NUMERIC
SQL_REAL
SQL_SMALLINT
SQL_TIME
SQL_TIMESTAMP
SQL_TINYINT
SQL_VARBINARY
SQL_VARCHAR
cbColDef Argument
The cbColDef argument specifies the precision of the column or expression corresponding to the parameter marker, unless all of the following are true:
234
SQLBindParameter
rgbValue Argument
The rgbValue argument points to a buffer that, when SQLExecute or SQLExecDirect is
called, contains the actual data for the parameter. The data must be in the form specified
by the fCType argument.
If rgbValue points to a character string that contains a literal quote character ( ' ), the driver
ensures that each literal quote is translated into the form required by the data source. For
example, if the data source required that embedded literal quotes be doubled, the driver
would replace each quote character ( ' ) with two quote characters ( ' ' ).
If pcbValue is the result of the SQL_LEN_DATA_AT_EXEC(length) macro or
SQL_DATA_AT_EXEC, then rgbValue is an application-defined 32-bit value that is associated with the parameter. It is returned to the application through
SQLParamData. For example, rgbValue might be a token such as a parameter number, a
pointer to data, or a pointer to a structure that the application used to bind input parameters. Note, however, that if the parameter is an input/output parameter, rgbValue must
be a pointer to a buffer where the output value will be stored. If SQLParamOptions was
called to specify multiple values for the parameter, the application can use the value of
the pirow argument in SQLParamOptions in conjunction with the rgbValue. For example,
rgbValue might point to an array of values and the application might use pirow to retrieve
the correct value from the array. For more information, see Passing Parameter Values.
If the fParamType argument is SQL_PARAM_INPUT_OUTPUT or
SQL_PARAM_OUTPUT, rgbValue points to a buffer in which the driver returns the
output value. If the procedure returns one or more result sets, the rgbValue buffer is not
guaranteed to be set until all results have been fetched. (If fParamType is
SQL_PARAM_OUTPUT and rgbValue and pcbValue are both null pointers, the driver discards the output value.)
235
SQLBindParameter
If the application calls SQLParamOptions to specify multiple values for each parameter,
rgbValue points to an array. A single SQL statement processes the entire array of input
values for an input or input/output parameter and returns an array of output values for
an input/output or output parameter.
cbValueMax Argument
For character and binary C data, the cbValueMax argument specifies the length of the rgbValue buffer (if it is a single element) or the length of an element in the rgbValue array (if
the application calls SQLParamOptions to specify multiple values for each parameter).
If the application specifies multiple values, cbValueMax is used to determine the location
of values in the rgbValue array, both on input and on output. For input/output and
output parameters, it is used to determine whether to truncate character and binary C
data on output:
For character C data, if the number of bytes available to return is greater than or equal
to cbValueMax, the data in rgbValue is truncated to cbValueMax 1 bytes and is null-terminated by the driver.
For binary C data, if the number of bytes available to return is greater than cbValueMax,
the data in rgbValue is truncated to cbValueMax bytes.
For all other types of C data, the cbValueMax argument is ignored. The length of the rgbValue buffer (if it is a single element) or the length of an element in the rgbValue array (if
the application calls SQLParamOptions to specify multiple values for each parameter)
is assumed to be the length of the C data type.
When an ODBC 1.0 application calls SQLSetParam in an ODBC 2.0 driver, the Driver
Manager converts this to a call to SQLBindParameter in which the cbValueMax argument is always SQL_SETPARAM_VALUE_MAX. Because the Driver Manager returns
an error if an ODBC 2.0 application sets cbValueMax to
SQL_SETPARAM_VALUE_MAX, an ODBC 2.0 driver can use this to determine when it
is called by an ODBC 1.0 application.
When an ODBC 2.0 application calls SQLBindParameter in an ODBC 1.0 driver, the
Driver Manager converts this to a call to SQLSetParam and discards the cbValueMax
argument.
In SQLSetParam, the way in which an application specifies the length of the rgbValue
buffer so that the driver can return character or binary data and the way in which an
application sends an array of character or binary parameter values to the driver are
driver-defined. If an ODBC 2.0 application uses this functionality in an ODBC 1.0 driver,
236
SQLBindParameter
it must use the semantics defined by that driver. If an ODBC 2.0 driver supported this
functionality as an ODBC 1.0 driver, it must continue to support this functionality for
ODBC 1.0 applications.
pcbValue Argument
The pcbValue argument points to a buffer that, when SQLExecute or SQLExecDirect is
called, contains one of the following:
The length of the parameter value stored in rgbValue. This is ignored except for character
or binary C data.
SQL_NTS. The parameter value is a null-terminated string.
SQL_NULL_DATA. The parameter value is NULL.
SQL_DEFAULT_PARAM. A procedure is to use the default value of a parameter, rather
than a value retrieved from the application. This value is valid only in a procedure call,
and then only if the fParamType argument is SQL_PARAM_INPUT or
SQL_PARAM_INPUT_OUTPUT. When pcbValue is SQL_DEFAULT_PARAM, the fCType,
fSqlType, cbColDef, ibScale, cbValueMax and rgbValue arguments are ignored for input
parameters and are used only to define the output parameter value for input/output
parameters.
Note that this value was introduced in ODBC 2.0.
iThe result of the SQL_LEN_DATA_AT_EXEC(length) macro. The data for the parameter
will be sent with SQLPutData. If the fSqlType argument is SQL_LONGVARBINARY,
SQL_LONGVARCHAR, or a long, data sourcespecific data type and the driver returns
Y for the SQL_NEED_LONG_DATA_LEN information type in SQLGetInfo, length is
the number of bytes of data to be sent for the parameter; otherwise, length must be a nonnegative value and is ignored. For more information, see Passing Parameter Values.
For example, to specify that 10,000 bytes of data will be sent with SQLPutData for an
SQL_LONGVARCHAR parameter, an application sets pcbValue to
SQL_LEN_DATA_AT_EXEC(10000).
Note that this macro was introduced in ODBC 2.0.
SQL_DATA_AT_EXEC. The data for the parameter will be sent with SQLPutData. This
value is used by ODBC 2.0 applications when calling ODBC 1.0 drivers and by ODBC 1.0
applications when calling ODBC 2.0 drivers. For more information, see Passing Parameter Values.
237
SQLBindParameter
If pcbValue is a null pointer, the driver assumes that all input parameter values are nonNULL and that character and binary data are null-terminated. If fParamType is
SQL_PARAM_OUTPUT and rgbValue and pcbValue are both null pointers, the driver discards the output value.
Important: Application developers are strongly discouraged from specifying a null
pointer for pcbValue when the data type of the parameter is SQL_C_BINARY. For
SQL_C_BINARY data, a driver sends only the data preceding an occurrence of the
null-termination character, 0x00. To ensure that a driver does not unexpectedly
truncate SQL_C_BINARY data, pcbValue should contain a pointer to a valid
length value.
If the fParamType argument is SQL_PARAM_INPUT_OUTPUT or
SQL_PARAM_OUTPUT, pcbValue points to a buffer in which the driver returns
tSQL_NULL_DATA, the number of bytes available to return in rgbValue (excluding the
null termination byte of character data), or SQL_NO_TOTAL if the number of bytes
available to return cannot be determined. If the procedure returns one or more result
sets, the pcbValu buffer is not guaranteed to be set until all results have been fetched.
If the application calls SQLParamOptions to specify multiple values for each parameter,
pcbValue points to an array of SDWORD values. These can be any of the values listed earlier in this section and are processed with a single SQL statement.
238
Calls SQLBindParameter for each parameter to bind buffers for the parameters value (rgbValue argument) and length (pcbValue argument). For data-atexecution parameters, rgbValue is an application-defined 32-bit value such as a
SQLBindParameter
parameter number or a pointer to data. The value will be returned later and can
be used to identify the parameter.
2.
3.
4.
Places values for input and input/output parameters in the rgbValue and pcbValue buffers:
For normal parameters, the application places the parameter value in the
rgbValue buffer and the length of that value in the pcbValue buffer.
Note: Although data-at-execution parameters aare similar to data-at-execution columns, the value
returned by SQLParamData is different for each.
Data-at-execution parameters are parameters in an SQL statement for which data will be sent
with SQLPutData when the statement is executed with SQLExecDirect or SQLExecute. They are
bound with SQLBindParameter. The value returned by SQLParamData is a 32-bit value passed
to SQLBindParameter in the rgbValue argument.
Data-at-execution columns are columns in a rowset for which data will be sent with SQLPutData
when a row is updated or added with SQLSetPos. They are bound with SQLBindCol. The value
returned by SQLParamData is the address of the row in the rgbValue buffer that is being processed.
5.
Calls SQLPutData one or more times to send data for the parameter. More than
one call is needed if the data value is larger than the rgbValue buffer specified in
SQLPutData; note that multiple calls to SQLPutData for the same parameter are
allowed only when sending character C data to a column with a character,
binary, or data sourcespecific data type or when sending binary C data to a column with a character, binary, or data sourcespecific data type.
239
SQLBindParameter
6.
Calls SQLParamData again to signal that all data has been sent for the parameter.
240
SQLBindParameter
When an ODBC 2.0 application calls SQLBindParameter in an ODBC 1.0 driver, the
ODBC 2.0 Driver Manager maps the calls as follows:
Call by ODBC 2.0 Application
SQLBindParameter(
hstmt, ipar, fParamType,
fCType, fSqlType,
RcbColDef, ibScale,
rgbValue, cbValueMax,
pcbValue);
Code Example
In the following example, an application prepares an SQL statement to insert data into
the EMPLOYEE table. The SQL statement contains parameters for the NAME, AGE, and
BIRTHDAY columns. For each parameter in the statement, the application calls SQLBindParameter to specify the ODBC C data type and the SQL data type of the parameter
and to bind a buffer to each parameter. For each row of data, the application assigns data
values to each parameter and calls SQLExecute to execute the statement.
241
SQLBindParameter
Related Functions
242
See
SQLDescribeParam (extension)
SQLExecDirect
SQLBrowseConnect
See
SQLExecute
SQLNumParams (extension)
SQLParamData (extension)
SQLParamOptions (extension)
SQLPutData (extension)
SQLBrowseConnect
Extension Level 2
SQLBrowseConnect supports an iterative method of discovering and enumerating the
attributes and attribute values required to connect to a data source. Each call to SQLBrowseConnect returns successive levels of attributes and attribute values. When all
levels have been enumerated, a connection to the data source is completed and a complete connection string is returned by SQLBrowseConnect. A return code of
SQL_SUCCESS or SQL_SUCCESS_WITH_INFO indicates that all connection information has been specified and the application is now connected to the data source.
Syntax
RETCODE SQLBrowseConnect(hdbc, szConnStrIn, cbConnStrIn, szConnStrOut, cbConnStrOutMax,
pcbConnStrOut)
243
SQLBrowseConnect
Type
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
UCHAR FAR *
szConnStrIn
Input
SWORD
cbConnStrIn
Input
Length of szConnStrIn.
UCHAR FAR *
szConnStrOut
Output
SWORD
cbConnStrOutMax
Input
SWORD FAR *
pcbConnStrOut
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLBrowseConnect returns SQL_ERROR, SQL_SUCCESS_WITH_INFO, or
SQL_NEED_DATA, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists the SQLSTATE values commonly returned by SQLBrow-
244
SQLBrowseConnect
seConnect and explains each one in the context of this function; the notation (DM)
precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return
code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
01S00
Invalid connection
string attribute
08001
Unable to connect to
data source
08002
Connection in use
08004
08S01
Communication link
failure
245
SQLBrowseConnect
246
SQLSTATE
Error
Description
28000
Invalid authorization
specification
IM001
IM002
IM003
IM004
Drivers
SQLAllocEnv failed
IM005
Drivers
SQLAllocConnect
failed
IM006
Drivers
SQLSetConnectOptio
n failed
IM009
Unable to load
translation shared
library
SQLBrowseConnect
SQLSTATE
Error
Description
IM010
IM011
IM012
DRIVER keyword
syntax error
S1000
General error
S1001
Memory allocation
failure
S1090
Invalid string or
buffer length
S1T00
Timeout expired
247
SQLBrowseConnect
Comments
szConnStrIn Argument
A browse request connection string has the following syntax:
connection-string ::= attribute[;] | attribute; connection-string
attribute ::= attribute-keyword=attribute-value | DRIVER={attribute-value}
(The braces are literal; the application must specify them.)
attribute-keyword ::= DSN | UID | PWD
| driver-defined-attribute-keyword
attribute-value ::= character-string
driver-defined-attribute-keyword ::= identifier
where character-string has zero or more characters; identifier has one or more characters;
attribute-keyword is case insensitive; attribute-value may be case sensitive; and the value
of the DSN keyword does not consist solely of blanks. Because of connection string and
initialization file grammar, keywords and attribute values that contain the characters
[]{}(),;?*=!@\ should be avoided.
Important: The Driver keyword was introduced in ODBC 2.0 and is not supported by ODBC 1.0
drivers.
If any keywords are repeated in the browse request connection string, the driver uses the
value associated with the first occurrence of the keyword. If the DSN and DRIVER keywords are included in the same browse request connection string, the Driver Manager
and driver use whichever keyword appears first.
szConnStrOut Argument
The browse result connection string is a list of connection attributes. A connection
attribute consists of an attribute keyword and a corresponding attribute value. The
browse result connection string has the following syntax:
connection-string ::= attribute[;] | attribute; connection-string
attribute ::= [*]attribute-keyword=attribute-value
attribute-keyword ::= ODBC-attribute-keyword
| driver-defined-attribute-keyword
ODBC-attribute-keyword = {UID | PWD}[:localized-identifier]
driver-defined-attribute-keyword ::= identifer[:localized-identifier]
attribute-value ::= {attribute-value-list} | ?
(The braces are literal; they are returned by the driver.)
attribute-value-list ::= character-string | character-string, attribute-value-list
248
SQLBrowseConnect
where character-string has zero or more characters; identifier and localized-identifier have
one or more characters;attribute-keyword is case insensitive; and attribute-value may be
case sensitive. Because of connection string and initialization file grammar, keywords,
localized identifiers, and attribute values that contain the characters []{}(),;?*=!@\ should
be avoided.
The browse result connection string syntax is used according to the following semantic
rules:
The attribute keywords UID and PWD have the same meaning as defined in
SQLDriverConnect.
}The {attribute-value-list} is an enumeration of actual values valid for the corresponding attribute-keyword. Note that the braces ({}) do not indicate a list of
choices; they are returned by the driver. For example, it might be a list of server
names or a list of database names.
Using SQLBrowseConnect
SQLBrowseConnect requires an allocated hdbc. The Driver Manager loads the driver
that was specified in or that corresponds to the data source name specified in the initial
browse request connection string; for information on when this occurs, see the Comments section in SQLConnect. It may establish a connection with the data source
during the browsing process. If SQLBrowseConnect returns SQL_ERROR, outstanding
connections are terminated and the hdbc is returned to an unconnected state.
249
SQLBrowseConnect
When SQLBrowseConnect is called for the first time on an hdbc, the browse request connection string must contain the DSN keyword or the DRIVER keyword. If the browse
request connection string contains the DSN keyword, the Driver Manager locates a corresponding data source specification in the odbc.ini file:
If the Driver Manager finds the corresponding data source specification, it loads
the associated driver shared library; the driver can retrieve information about
the data source from the odbc.ini file.
If the Driver Manager cannot find the corresponding data source specification,
it locates the default data source specification and loads the associated driver
shared library; the driver can retrieve information about the default data source
from the odbc.ini file.
If the Driver Manager cannot find the corresponding data source specification
and there is no default data source specification, it returns SQL_ERROR with
SQLSTATE IM002 (Data source not found and no default driver specified).
If the browse request connection string contains the DRIVER keyword, the Driver Manager loads the specified driver; it does not attempt to locate a data source in the odbc.ini
file. Because the DRIVER keyword does not use information from the odbc.ini file, the
driver must define enough keywords so that a driver can connect to a data source using
only the information in the browse request connection strings.
On each call to SQLBrowseConnect, the application specifies the connection attribute
values in the browse request connection string. The driver returns successive levels of
attributes and attribute values in the browse result connection string; it returns
SQL_NEED_DATA as long as there are connection attributes that have not yet been
enumerated in the browse request connection string. The application uses the contents
of the browse result connection string to build the browse request connection string for
the next call to SQLBrowseConnect. Note that the application cannot use the contents
of previous browse result connection strings when building the current browse request
connection string; that is, it cannot specify different values for attributes set in previous
levels.
When all levels of connection and their associated attributes have been enumerated, the
driver returns SQL_SUCCESS, the connection to the data source is complete, and a
complete connection string is returned to the application.
The connection string is suitable to use in conjunction with SQLDriverConnect with the
SQL_DRIVER_NOPROMPT option to establish another connection.
250
SQLBrowseConnect
Code Example
In the following example, an application calls SQLBrowseConnect repeatedly. Each time
SQLBrowseConnect returns SQL_NEED_DATA, it passes back information about the
data it needs in szConnStrOut. The application passes szConnStrOut to its routine GetUserInput (not shown). GetUserInput parses the information, builds and displays a
dialog box, and returns the information entered by the user in szConnStrIn. The application passes the users information to the driver in the next call to SQLBrowseConnect.
After the application has provided all necessary information for the driver to connect to
the data source, SQLBrowseConnect returns SQL_SUCCESS and the application proceeds.
For example, to connect to the data source My Source, the following actions might occur.
First, the application passes the following string to SQLBrowseConnect:
"DSN=My Source"
The Driver Manager loads the driver associated with the data source My Source. It then
calls the drivers SQLBrowseConnect function with the same arguments it received
from the application. The driver returns the following string in szConnStrOut.
"HOST:Server={red,blue,green};UID:ID=?;PWD:Password=?"
251
SQLBrowseConnect
The application passes this string to its GetUserInput routine, which builds a dialog box
that asks the user to select the red, blue, or green server, and to enter a user ID and
password. The routine passes the following user-specified information back in
szConnStrIn, which the application passes to SQLBrowseConnect:
"HOST=red;UID=Smith;PWD=Sesame"
SQLBrowseConnect uses this information to connect to the red server as Smith with the
password Sesame, then returns the following string in szConnStrOut:
"*DATABASE:Database={master,model,empdata}"
The application passes this string to its GetUserInput routine, which builds a dialog box
that asks the user to select a database. The user selects empdata and the application calls
SQLBrowseConnect a final time with the string:
"DATABASE=empdata"
252
SQLBrowseConnect
This is the final piece of information the driver needs to connect to the data source; SQLBrowseConnect returns SQL_SUCCESS and szConnStrOut contains the completed connection string:
"DSN=My Source;HOST=red;UID=Smith;PWD=Sesame;DATABASE=empdata"
#define BRWS_LEN 100
HENV henv;
HDBC hdbc;
HSTMT hstmt;
RETCODE retcode;
UCHAR szConnStrIn[BRWS_LEN], szConnStrOut[BRWS_LEN];
SWORD cbConnStrOut;
retcode = SQLAllocEnv(&henv);
/* Environment handle */
if (retcode == SQL_SUCCESS) {
retcode = SQLAllocConnect(henv, &hdbc); /* Connection handle */
if (retcode == SQL_SUCCESS) {/* Call SQLBrowseConnect until it returns a value other than */
/* SQL_NEED_DATA (pass the data source name the first time). */
/* If SQL_NEED_DATA is returned, call GetUserInput (not */
/* shown) to build a dialog from the values in szConnStrOut. */
/* The user-supplied values are returned in szConnStrIn, */
/* which is passed in the next call to SQLBrowseConnect. */
lstrcpy(szConnStrIn, "DSN=MyServer");
do {
retcode = SQLBrowseConnect(hstmt, szConnStrIn, SQL_NTS,
szConnStrOut, BRWS_LEN, &cbConnStrOut)
if (retcode == SQL_NEED_DATA)
GetUserInput(szConnStrOut, szConnStrIn);
} while (retcode == SQL_NEED_DATA);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Process data after successful connection */
retcode = SQLAllocStmt(hdbc, &hstmt);
if (retcode == SQL_SUCCESS) {
...;
...;
...;
SQLFreeStmt(hstmt, SQL_DROP);
}
SQLDisconnect(hdbc);
}
}
SQLFreeConnect(hdbc);
}
SQLFreeEnv(henv);
253
SQLCancel
Related Functions
For information about
See
SQLAllocConnect
SQLConnect
SQLDisconnect
SQLDriverConnect (extension)
SQLDrivers (extension)
SQLFreeConnect
SQLCancel
Core
SQLCancel cancels the processing on an hstmt.
Syntax
RETCODE SQLCancel(hstmt)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
254
SQLCancel
Diagnostics
When SQLCancel returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated
SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLCancel and explains each one in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
70100
Operation aborted
IM001
S1000
General error
S1001
Memory allocation
failure
Comments
SQLCancel can cancel the following types of processing on an hstmt:
255
SQLCancel
If an application calls SQLCancel when no processing is being done on the hstmt, SQLCancel has the same effect as SQLFreeStmt with the SQL_CLOSE option; this behavior
is defined only for completeness and applications should call SQLFreeStmt to close cursors.
256
SQLCancel
Related Functions
For information about
See
SQLBindParameter
SQLExecDirect
SQLExecute
SQLFreeStmt
SQLSetPos (extension)
SQLParamData (extension)
SQLPutData (extension)
257
SQLCancel
258
SQLColAttributes
SQLColAttributes
Core
SQLColAttributes returns descriptor information for a column in a result set; it cannot
be used to return information about the bookmark column (column 0). Descriptor information is returned as a character string, a 32-bit descriptor-dependent value, or an integer value.
Syntax
RETCODE SQLColAttributes(hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc)
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
icol
Input
SQLUSMALLINT
fDescType
Input
SQLPOINTER
rgbDesc
Output
SQLSMALLINT
cbDescMax
Input
259
SQLColAttributes
Type
Argument
Use
Description
SQLSMALLINT*
pcbDesc
Output
SQLLEN*
pfDesc
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLColAttributes returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO,
an associated SQLSTATE value may be obtained by calling SQLError. The following
table lists the SQLSTATE values commonly returned by SQLColAttributes and explains
260
SQLColAttributes
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
24000
Invalid cursor state The statement associated with the hstmt did
not return a result set. There were no columns
to describe.
IM001
S1000
General error
S1001
Memory allocation
failure
S1002
Invalid column
number
261
SQLColAttributes
262
SQLSTATE
Error
Description
S1008
Operation
canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1091
Descriptor type
out of range
S1C00
S1T00
Timeout expired
SQLColAttributes
Comments
SQLColAttributes returns information either in pfDesc or in rgbDesc. Integer information
is returned in pfDesc as a 32-bit, signed value; all other formats of information are
returned in rgbDesc. When information is returned in pfDesc, the driver ignores rgbDesc,
cbDescMax, and pcbDesc. When information is returned in rgbDesc, the driver ignores
pfDesc.
The currently defined descriptor types, the version of ODBC in which they were introduced, and the arguments in which information is returned for them are shown below;
it is expected that more descriptor types will be defined to take advantage of different
data sources. Descriptor types from 0 to 999 are reserved by ODBC; driver developers
must reserve values greater than or equal to SQL_COLUMN_DRIVER_START for
driver-specific use. For more information, see Driver-Specific Data Types, Descriptor
Types, Information Types, and Options in Chapter 11, Guidelines for Implementing
ODBC Functions.
A driver must return a value for each of the descriptor types defined in the following
table. If a descriptor type does not apply to a driver or data source, then, unless otherwise
stated, the driver returns 0 in pcbDesc or an empty string in rgbDesc.
fDescType
Information
returned in
Description
SQL_COLUMN_
AUTO_INCREMENT
(ODBC 1.0)
pfDesc
SQL_COLUMN_
CASE_SENSITIVE
(ODBC 1.0)
pfDesc
263
SQLColAttributes
fDescType
264
Information
returned in
Description
SQL_COLUMN_
COUNT
(ODBC 1.0)
pfDesc
SQL_COLUMN_
DISPLAY_SIZE
(ODBC 1.0)
pfDesc
SQL_COLUMN_
LABEL
(ODBC 2.0)
rgbDesc
SQL_COLUMN_
LENGTH
(ODBC 1.0)
pfDesc
SQL_COLUMN_
MONEY
(ODBC 1.0)
pfDesc
SQL_COLUMN_
NAME
(ODBC 1.0)
rgbDesc
SQL_COLUMN_
NULLABLE
(ODBC 1.0)
pfDesc
SQLColAttributes
fDescType
Information
returned in
Description
SQL_COLUMN_
OWNER_NAME
(ODBC 2.0)
rgbDesc
SQL_COLUMN_
PRECISION
(ODBC 1.0)
pfDesc
SQL_COLUMN_
QUALIFIER_NAME
(ODBC 2.0)
rgbDesc
SQL_COLUMN_
SCALE
(ODBC 1.0)
pfDesc
SQL_COLUMN_
SEARCHABLE
(ODBC 1.0)
pfDesc
265
SQLColAttributes
fDescType
266
Information
returned in
Description
SQL_COLUMN_
TABLE_NAME
(ODBC 2.0)
rgbDesc
SQL_COLUMN_
TYPE
(ODBC 1.0)
pfDesc
SQL_COLUMN_
TYPE_NAME
(ODBC 1.0)
rgbDesc
SQL_COLUMN_
UNSIGNED
(ODBC 1.0)
pfDesc
SQL_COLUMN_
UPDATABLE
(ODBC 1.0)
pfDesc
SQLColumnPrivileges
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLDescribeCol
SQLExtendedFetch (extension)
SQLFetch
SQLColumnPrivileges
SQLColumnPrivileges returns a list of columns and associated privileges for the specified table. The driver returns the information as a result set on the specified hstmt.
Syntax
RETCODE SQLColumnPrivileges(hstmt, szTableQualifier, cbTableQualifier, szTableOwner,
cbTableOwner, szTableName, cbTableName, szColumnName, cbColumnName)
267
SQLColumnPrivileges
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szTableQualifier
Input
SWORD
cbTableQualifier
Input
Length of szTableQualifier.
UCHAR FAR *
szTableOwner
Input
SWORD
cbTableOwner
Input
Length of szTableOwner.
UCHAR FAR *
szTableName
Input
Table name.
SWORD
cbTableName
Input
Length of szTableName.
UCHAR FAR *
szColumnName
Input
SWORD
cbColumnName
Input
Length of szColumnName.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
268
SQLColumnPrivileges
Diagnostics
When SQLColumnPrivileges returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLColumnPrivileges and explains
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
S1000
General error
S1001
Memory allocation
failure
269
SQLColumnPrivileges
270
SQLSTATE
Error
Description
S1008
Operation
canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1C00
S1T00
Timeout expired
SQLColumnPrivileges
Comments
SQLColumnPrivileges returns the results as a standard result set, ordered by
TABLE_QUALIFIER, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, and PRIVILEGE. The following table lists the columns in the result set.
Note that SQLColumnPrivileges returns the results as a standard result set, ordered by
TABLE_QUALFIER, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, and PRIVILEGE. The following table lists the columns in the result set.
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the TABLE_QUALIFIER,
TABLE_OWNER, TABLE_NAME, and COLUMN_NAME columns, an application can
call SQLGetInfo with the SQL_MAX_QUALIFIER_NAME_LEN,
SQL_MAX_OWNER_NAME_LEN, SQL_MAX_TABLE_NAME_LEN, and
SQL_MAX_COLUMN_NAME_LEN options.
Column Name
Data Type
Comments
TABLE_QUALIFIER
Varchar(128)
TABLE_OWNER
Varchar(128)
TABLE_NAME
Varchar(128)
not NULL
Table identifier.
COLUMN_NAME
Varchar(128)
not NULL
Column identifier.
GRANTOR
Varchar(128)
271
SQLColumnPrivileges
Column Name
Data Type
Comments
GRANTEE
Varchar(128)
not NULL
PRIVILEGE
Varchar(128)
not NULL
IS_GRANTABLE
Varchar(3)
The szColumnName argument accepts a search pattern. For more information about valid
search patterns, see Search Pattern Arguments earlier in this chapter.
Code Example
For a code example of a similar function, see SQLColumns.
272
SQLColumns
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLColumns (extension)
SQLExtendedFetch (extension)
SQLFetch
SQLTablePrivileges (extension)
SQLTables (extension)
SQLColumns
Extension Level 1
SQLColumns returns the list of column names in specified tables. The driver returns this
information as a result set on the specified hstmt.
Syntax
RETCODE SQLColumns(hstmt, szTableQualifier, cbTableQualifier, szTableOwner, cbTableOwner,
szTableName, cbTableName, szColumnName, cbColumnName)
273
SQLColumns
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szTableQualifier
Input
SWORD
cbTableQualifier
Input
Length of szTableQualifier.
UCHAR FAR *
szTableOwner
Input
SWORD
cbTableOwner
Input
Length of szTableOwner.
UCHAR FAR *
szTableName
Input
SWORD
cbTableName
Input
Length of szTableName.
UCHAR FAR *
szColumnName
Input
SWORD
cbColumnName
Input
Length of szColumnName.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
274
SQLColumns
Diagnostics
When SQLColumns returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLColumns and explains each one in the
context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
IM001
S1000
General error
S1001
Memory allocation
failure
275
SQLColumns
276
SQLSTATE
Error
Description
S1008
Operation canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
SQLColumns
SQLSTATE
Error
Description
S1C00
S1T00
Timeout expired
Comments
This function is typically used before statement execution to retrieve information about
columns for a table or tables from the data sources catalog. Note by contrast, that the
functions SQLColAttributes and SQLDescribeCol describe the columns in a result set
and that the function SQLNumResultCols returns the number of columns in a result set.
Note: SQLColumns might not return all columns. For example, a driver might not return information about pseudo-columns. Applications can use any valid column, regardless of whether it is
returned by SQLColumns.
SQLColumns returns the results as a standard result set, ordered by
TABLE_QUALIFIER, TABLE_OWNER, and TABLE_NAME. The following table lists the
columns in the result set. Additional columns beyond column 12 (REMARKS) can be
defined by the driver.
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the TABLE_QUALIFIER,
TABLE_OWNER, TABLE_NAME, and COLUMN_NAME columns, an application can
277
SQLColumns
278
Column Name
Data Type
Comments
TABLE_QUALIFIER
Varchar(128)
TABLE_OWNER
Varchar(128)
TABLE_NAME
Varchar(128) not
NULL
Table identifier.
COLUMN_NAME
Varchar(128) not
NULL
Column identifier.
DATA_TYPE
TYPE_NAME
Varchar(128) not
NULL
SQLColumns
Column Name
Data Type
Comments
PRECISION
Integer
LENGTH
Integer
SCALE
Smallint
279
SQLColumns
Column Name
Data Type
Comments
RADIX
Smallint
NULLABLE
REMARKS
Varchar(254)
280
SQLColumns
Code Example
In the following example, an application declares storage locations for the result set
returned by SQLColumns. It calls SQLColumns to return a result set that describes each
column in the EMPLOYEE table. It then calls SQLBindCol to bind the columns in the
result set to the storage locations. Finally, the application fetches each row of data with
SQLFetch and processes it.
#define STR_LEN 128+1
#define REM_LEN 254+1
/* Declare storage locations for result set data */
UCHAR szQualifier[STR_LEN], szOwner[STR_LEN];
UCHAR szTableName[STR_LEN], szColName[STR_LEN];
UCHAR szTypeName[STR_LEN], szRemarks[REM_LEN];
SDWORD Precision, Length;
SWORD DataType, Scale, Radix, Nullable;
/* Declare storage locations for bytes available to return */
SQLLEN cbQualifier, cbOwner, cbTableName, cbColName;
SQLLEN cbTypeName, cbRemarks, cbDataType, cbPrecision;
SQLLEN cbLength, cbScale, cbRadix, cbNullable;
retcode = SQLColumns(hstmt,
NULL, 0,
/* All qualifiers */
NULL, 0,
/* All owners
*/
"EMPLOYEE", SQL_NTS, /* EMPLOYEE table */
NULL, 0);
/* All columns */
if (retcode == SQL_SUCCESS) {
/* Bind columns in result set to storage locations */
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
SQLBindCol(hstmt,
while(TRUE) {
281
SQLColumns
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
show_error( );
}
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
...; /* Process fetched data */
} else {
break;
}
}
}
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLColumnPrivileges (extension)
SQLExtendedFetch (extension)
SQLFetch
SQLStatistics (extension)
SQLTables (extension)
SQLTablePrivileges (extension)
ODBC 1.0
282
SQLConnect
SQLConnect
Core
SQLConnect loads a driver and establishes a connection to a data source. The connection
handle references storage of all information about the connection, including status, transaction state, and error information.
Syntax
RETCODE SQLConnect(hdbc, szDSN, cbDSN, szUID, cbUID, szAuthStr, cbAuthStr)
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
UCHAR FAR *
szDSN
Input
SWORD
cbDSN
Input
Length of szDSN.
UCHAR FAR *
szUID
Input
User identifier.
SWORD
cbUID
Input
Length of szUID.
UCHAR FAR *
szAuthStr
Input
Authentication string
(typically the password).
SWORD
cbAuthStr
Input
Length of szAuthStr.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
283
SQLConnect
Diagnostics
When SQLConnect returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLConnect and explains each one in the
context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
284
SQLSTATE
Error
Description
01000
General warning
08001
Unable to connect
to data source
08002
Connection in use
08004
Data source
rejected
establishment of
connection
08S01
Communication
link failure
28000
Invalid
authorization
specification
IM001
SQLConnect
SQLSTATE
Error
Description
IM002
IM003
Specified driver
could not be
loaded
IM004
Drivers
SQLAllocEnv
failed
IM005
Drivers
SQLAllocConnect
failed
IM006
Drivers
SQLSetConnectOp
tion failed
IM009
Unable to load
translation shared
library
S1000
General error
S1001
Memory allocation
failure
285
SQLConnect
SQLSTATE
Error
Description
S1090
Invalid string or
buffer length
S1T00
Timeout expired
Comments
The Driver Manager does not load a driver until the application calls a function (SQLConnect, SQLDriverConnect, or SQLBrowseConnect) to connect to the driver. Until
that point, the Driver Manager works with its own handles and manages connection
information. When the application calls a connection function, the Driver Manager
checks if a driver is currently loaded for the specified hdbc:
If a driver is not loaded, the Driver Manager loads the driver and calls SQLAllocEnv, SQLAllocConnect, SQLSetConnectOption (if the application specified
any connection options), and the connection function in the driver. The Driver
Manager returns SQLSTATE IM006 (Drivers SQLSetConnectOption failed) and
SQL_SUCCESS_WITH_INFO for the connection function if the driver returned
an error for SQLSetConnectOption.
If the specified driver is already loaded on the hdbc, the Driver Manager only
calls the connection function in the driver. In this case, the driver must ensure
that all connection options for the hdbc maintain their current settings.
SQLConnect
When the application calls SQLDisconnect, the Driver Manager calls SQLDisconnect in
the driver. However, it does not unload the driver. This keeps the driver in memory for
applications that repeatedly connect to and disconnect from a data source. When the
application calls SQLFreeConnect, the Driver Manager calls SQLFreeConnect and SQLFreeEnv in the driver and then unloads the driver.
An ODBC application can establish more than one connection.
287
SQLConnect
Code Example
In the following example, an application allocates environment and connection handles.
It then connects to the EmpData data source with the user ID JohnS and the password
Sesame and processes data. When it has finished processing data, it disconnects from the
data source and frees the handles.
HENV henv;
HDBC hdbc;
HSTMT hstmt;
RETCODE retcode;
retcode = SQLAllocEnv(&henv);
/* Environment handle */
if (retcode == SQL_SUCCESS) {
retcode = SQLAllocConnect(henv, &hdbc); /* Connection handle */
if (retcode == SQL_SUCCESS) {
/* Set login timeout to 5 seconds. */
SQLSetConnectOption(hdbc, SQL_LOGIN_TIMEOUT, 5);
/* Connect to data source */
retcode = SQLConnect(hdbc, "EmpData", SQL_NTS,
"JohnS", SQL_NTS,
"Sesame", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Process data after successful connection */
retcode = SQLAllocStmt(hdbc, &hstmt); /* Statement handle */
if (retcode == SQL_SUCCESS) {
...;
...;
...;
SQLFreeStmt(hstmt, SQL_DROP);
}
SQLDisconnect(hdbc);
}
SQLFreeConnect(hdbc);
}
SQLFreeEnv(henv);
}
288
SQLDataSources
Related Functions
For information about
See
SQLAllocConnect
SQLAllocStmt
SQLBrowseConnect (extension)
SQLDisconnect
SQLDriverConnect (extension)
SQLSetConnectOption (extension)
SQLDataSources
Extension Level 2
SQLDataSources lists data source names. This function is implemented solely by the
Driver Manager.
Syntax
RETCODE SQLDataSources(henv, fDirection, szDSN, cbDSNMax, pcbDSN, szDescription,
cbDescriptionMax, pcbDescription)
289
SQLDataSources
290
Type
Argument
Use
Description
HENV
henv
Input
Environment handle.
UWORD
fDirection
Input
UCHAR FAR *
szDSN
Output
SWORD
cbDSNMax
Input
SWORD FAR *
pcbDSN
Output
UCHAR FAR *
szDescription
Output
SQLDataSources
Type
Argument
Use
Description
SWORD
cbDescriptionMax
Input
SWORD FAR *
pcbDescription
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLDataSources returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLDataSources and explains each
one in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
291
SQLDataSources
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
S1000
General error
S1001
Memory
allocation failure
S1090
Invalid string or
buffer length
S1103
Direction option
out of range
Comments
Because SQLDataSources is implemented in the Driver Manager, it is supported for all
drivers regardless of a particular drivers conformance level.
292
SQLDescribeCol
An application can call SQLDataSources multiple times to retrieve all data source
names. The Driver Manager retrieves this information from the odbc.ini file. When there
are no more data source names, the Driver Manager returns SQL_NO_DATA_FOUND.
If SQLDataSources is called with SQL_FETCH_NEXT immediately after it returns
SQL_NO_DATA_FOUND, it will return the first data source name.
If SQL_FETCH_NEXT is passed to SQLDataSources the very first time it is called, it will
return the first data source name.
The driver determines how data source names are mapped to actual data sources.
Related Functions
For information about
See
SQLBrowseConnect (extension)
SQLConnect
SQLDriverConnect (extension)
SQLDrivers (extension)
SQLDescribeCol
Core
SQLDescribeCol returns the result descriptor column name, type, precision, scale,
and nullability for one column in the result set; it cannot be used to return information
about the bookmark column (column 0).
Syntax
RETCODE SQLDescribeCol(hstmt, icol, szColName, cbColNameMax, pcbColName, pfSqlType,
pcbColDef, pibScale, pfNullable)
293
SQLDescribeCol
294
Type
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
icol
Input
SQLCHAR*
szColName
Output
SQLSMALLINT
cbColNameMax
Input
SQLSMALLINT*
pcbColName
Output
SQLDescribeCol
Type
Argument
Use
Description
SQLSMALLINT*
pfSqlType
Output
SQLULEN*
pcbColDef
Output
295
SQLDescribeCol
Type
Argument
Use
Description
SQLSMALLINT*
pibScale
Output
SQLSMALLINT*
pfNullable
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLDescribeCol returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO,
an associated SQLSTATE value may be obtained by calling SQLError. The following
table lists the SQLSTATE values commonly returned by SQLDescribeCol and explains
296
SQLDescribeCol
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
24000
Invalid cursor
state
IM001
S1000
General error
S1001
Memory
allocation failure
S1002
Invalid column
number
297
SQLDescribeCol
SQLSTATE
Error
Description
S1008
Operation
canceled
S1010
Function
sequence error
S1090
Invalid string or
buffer length
S1T00
Timeout expired
Comments
An application typically calls SQLDescribeCol after a call to SQLPrepare and before or
after the associated call to SQLExecute. An application can also call SQLDescribeCol
after a call to SQLExecDirect.
298
SQLDescribeParam
SQLDescribeCol retrieves the column name, type, and length generated by a SELECT
statement. If the column is an expression, szColName is either an empty string or a driverdefined name.
Important: ODBC supports SQL_NULLABLE_UNKNOWN as an extension, even
though the X/Open and SQL Access Group Call Level Interface specification does
not specifiy the option for SQLDescribeCol.
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLColAttributes
SQLFetch
SQLPrepare
SQLDescribeParam
Extension Level 2
SQLDescribeParam returns the description of a parameter marker associated with a prepared SQL statement.
Syntax
RETCODE SQLDescribeParam(hstmt, ipar, pfSqlType, pcbColDef, pibScale, pfNullable)
299
SQLDescribeParam
300
Type
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
ipar
Input
SQLSMALLINT*
pfSqlType
Output
SQLDescribeParam
Type
Argument
Use
Description
SQLULEN*
pcbColDef
Output
SQLSMALLINT*
pibScale
Output
SQLSMALLINT*
pfNullable
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLDescribeParam returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLDescribeParam and explains
301
SQLDescribeParam
each one in the context of this function; the notation (DM) precedes the descriptions
of SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
302
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
S1001
Memory allocation
error
S1008
Operation
canceled
S1010
Function sequence
error
SQLDescribeParam
SQLSTATE
Error
Description
S1093
Invalid parameter
number
S1T00
Timeout expired
Comments
Parameter markers are numbered from left to right in the order they appear in the SQL
statement.
SQLDescribeParam does not return the type (input, input/output, or output) of a
parameter in an SQL statement. Except in calls to procedures, all parameters in SQL
statements are input parameters. To determine the type of each parameter in a call to a
procedure, an application calls SQLProcedureColumns.
Related Functions
For information about
See
SQLCancel
SQLExecute
SQLPrepare
SQLBindParameter
303
SQLDisconnect
SQLDisconnect
Core
SQLDisconnect closes the connection associated with a specific connection handle.
Syntax
RETCODE SQLDisconnect(hdbc)
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLDisconnect returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLDisconnect and explains each one in
304
SQLDisconnect
the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01002
Disconnect error
08003
Connection not
open
25000
Invalid transaction
state
IM001
S1000
General error
305
SQLDisconnect
SQLSTATE
Error
Description
S1001
Memory allocation
failure
S1010
Function sequence
error
Comments
If an application calls SQLDisconnect after SQLBrowseConnect returns
SQL_NEED_DATA and before it returns a different return code, the driver cancels the
connection browsing process and returns the hdbc to an unconnected state.
If an application calls SQLDisconnect while there is an incomplete transaction associated with the connection handle, the driver returns SQLSTATE 25000 (Invalid transaction state), indicating that the transaction is unchanged and the connection is open. An
incomplete transaction is one that has not been committed or rolled back with SQLTransact.
If an application calls SQLDisconnect before it has freed all hstmts associated with the
connection, the driver frees those hstmts after it successfully disconnects from the data
source. However, if one or more of the hstmts associated with the connection are still executing asynchronously, SQLDisconnect will return SQL_ERROR with a SQLSTATE
value of S1010 (Function sequence error).
Code Example
See SQLBrowseConnect and SQLConnect.
306
SQLDisconnect
Related Functions
For information about
See
SQLAllocConnect
SQLConnect
SQLDriverConnect (extension)
SQLFreeConnect
SQLTransact
307
SQLDisconnect
308
SQLDriverConnect
SQLDriverConnect
Extension Level 1
SQLDriverConnect is an alternative to SQLConnect. It supports data sources that
require more connection information than the three arguments in SQLConnect; dialog
boxes to prompt the user for all connection information; and data sources that are not
defined in the .odbc.ini file.
SQLDriverConnect provides the following connection options:
Establish a connection using a connection string that contains the data source
name, one or more user IDs, one or more passwords, and other information
required by the data source.
Establish a connection using a partial connection string or no additional information; in this case, the Driver Manager and the driver can each prompt the user
for connection information.
Establish a connection to a data source that is not defined in the .odbc.ini file. If
the application supplies a partial connection string, the driver can prompt the
user for connection information.
Syntax
RETCODE SQLDriverConnect(hdbc, hwnd, szConnStrIn, cbConnStrIn, szConnStrOut,
cbConnStrOutMax, pcbConnStrOut, fDriverCompletion)
309
SQLDriverConnect
310
Type
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
HWND
hwnd
Input
UCHAR FAR *
szConnStrIn
Input
SWORD
cbConnStrIn
Input
Length of szConnStrIn.
UCHAR FAR
*szConnStrOut
Output
SWORD
cbConnStrOutMax
Input
SQLDriverConnect
Type
Argument
Use
Description
SWORD FAR *
pcbConnStrOut
Output
UWORD
fDriverCompletion
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLDriverConnect returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO,
an associated SQLSTATE value may be obtained by calling SQLError. The following
table lists the SQLSTATE values commonly returned by SQLDriverConnect and
311
SQLDriverConnect
explains each one in the context of this function; the notation (DM) precedes the
descriptions of SQLSTATEs returned by the Driver Manager. The return code associated
with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
312
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
01S00
Invalid connection
string attribute
08001
Unable to connect
to data source
08002
Connection in use
08004
Data source
rejected
establishment of
connection
08S01
Communication
link failure
28000
Invalid
authorization
specification
SQLDriverConnect
SQLSTATE
Error
Description
IM001
IM002
IM003
Specified driver
could not be
loaded
IM004
Drivers
SQLAllocEnv
failed
IM005
Drivers
SQLAllocConnect
failed
IM006
Drivers
SQLSetConnectOp
tion failed
IM007
No data source or
driver specified;
dialog prohibited
IM008
Dialog failed
IM009
Unable to load
translation shared
library
313
SQLDriverConnect
314
SQLSTATE
Error
Description
IM010
IM011
IM012
DRIVER keyword
syntax error
S1000
General error
S1001
Memory allocation
failure
S1090
Invalid string or
buffer length
S1110
Invalid driver
completion
S1T00
Timeout expired
SQLDriverConnect
Comments
Connection Strings
A connection string has the following syntax:
connection-string ::= empty-string[;] | attribute[;] | attribute; connection-string
empty-string ::=
attribute ::= attribute-keyword=attribute-value | DRIVER={attribute-value}
(The braces ({}) are literal; the application must specify them.)
attribute-keyword ::= DSN | UID | PWD
| driver-defined-attribute-keyword
attribute-value ::= character-string
driver-defined-attribute-keyword ::= identifier
where character-string has zero or more characters; identifier has one or more characters;
attribute-keyword is case insensitive; attribute-value may be case sensitive; and the value of
the DSN keyword does not consist solely of blanks. Because of connection string and initialization file grammar, keywords and attribute values that contain the characters
[]{}(),;?*=!@\ should be avoided
Important: The DRIVER keyword was introduced in ODBC 2.0 and is not supported by ODBC
1.0 drivers.
.The connection string may include any number of driver-defined keywords. Because the
DRIVER keyword does not use information from the .odbc.ini file, the driver must
define enough keywords so that a driver can connect to a data source using only the
information in the connection string. (For more information, see Driver Guidelines,
later in this section.) The driver defines which keywords are required in order to connect
to the data source.
If any keywords are repeated in the connection string, the driver uses the value associated with the first occurrence of the keyword. If the DSN and DRIVER keywords are
included in the same connection string, the Driver Manager and the driver use whichever keyword appears first. The following table describes the attribute values of the
DSN, DRIVER, UID, and PWD keywords.
Keyword
DSN
DRIVER
315
SQLDriverConnect
Keyword
UID
A user ID.
PWD
If the connection string specified by the application contains the DRIVER keyword, the
Driver Manager copies the connection string specified by the application.
Using the connection string it has constructed, the Driver Manager determines which
driver to use, loads that driver, and passes the connection string it has constructed to the
driver; for more information about the interaction of the Driver Manager and the driver,
316
SQLDriverConnect
see the Comments section in SQLConnect. If the connection string contains the DSN
keyword or does not contain either the DSN or the DRIVER keyword, the Driver Manager determines which driver to use as follows:
1.
If the connection string contains the DSN keyword, the Driver Manager
retrieves the driver associated with the data source from the .odbc.ini file.
2.
If the connection string does not contain the DSN keyword or the data source is
not found, the Driver Manager retrieves the driver associated with the Default
data source from the .odbc.ini file. However, the Driver Manager does not
change the value of the DSN keyword in the connection string.
3.
If the data source is not found and the Default data source is not found, the
Driver Manager returns SQL_ERROR with SQLSTATE IM002 (Data source not
found and no default driver specified).
Driver Guidelines
The driver checks if the connection string passed to it by the Driver Manager contains the
DSN or DRIVER keyword. If the connection string contains the DRIVER keyword, the
driver cannot retrieve information about the data source from the .odbc.ini file. If the
connection string contains the DSN keyword or does not contain either the DSN or the
DRIVER keyword, the driver can retrieve information about the data source from the
.odbc.ini file as follows:
1.
If the connection string contains the DSN keyword, the driver retrieves the information for the specified data source.
2.
If the connection string does not contain the DSN keyword or the specified data
source is not found, the driver retrieves the information for the Default data
source.
The driver uses any information it retrieves from the .odbc.ini file to augment the information passed to it in the connection string. If the information in the .odbc.ini file duplicates information in the connection string, the driver uses the information in the
connection string.
Based on the value of fDriverCompletion, the driver prompts the user for connection information, such as the user ID and password, and connects to the data source:
317
SQLDriverConnect
SQL_DRIVER_PROMPT: The driver displays a dialog box, using the values from the
connection string and .odbc.ini file as initial values. When the user exits the dialog box,
the driver connects to the data source. It also constructs a connection string from the
value of the DSN or DRIVER keyword in szConnStrIn and the information returned
from the dialog box. It places this connection string in the buffer referenced by
szConnStrOut.
SQL_DRIVER_COMPLETE or SQL_DRIVER_COMPLETE_REQUIRED: If the connection string contains enough information, and that information is correct, the driver connects to the data source and copies szConnStrIn to szConnStrOut. If any information is
missing or incorrect, the driver takes the same actions as it does when fDriverCompletion
is SQL_DRIVER_PROMPT, except that if fDriverCompletion is
SQL_DRIVER_COMPLETE_REQUIRED, the driver disables the controls for any information not required to connect to the data source.
SQL_DRIVER_NOPROMPT: If the connection string contains enough information, the
driver connects to the data source and copies szConnStrIn to szConnStrOut. Otherwise,
the driver returns SQL_ERROR for SQLDriverConnect.
On successful connection to the data source, the driver also sets pcbConnStrOut to the
length of szConnStrOut.
If the user cancels a dialog box presented by the Driver Manager or the driver, SQLDriverConnect returns SQL_NO_DATA_FOUND.
For information about how the Driver Manager and the driver interact during the connection process, see SQLConnect.
If a driver supports SQLDriverConnect, the driver keyword section of the file for the
driver must contain the ConnectFunctions keyword with the second character set to
Y. For more information, see Chapter 18, Redistributing ODBC Components.
Connection Options
The SQL_LOGIN_TIMEOUT connection option, set using SQLSetConnectOption,
defines the number of seconds to wait for a login request to complete before returning
to the application. If the user is prompted to complete the connection string, a waiting
period for each login request begins after the user has dismissed each dialog box.
The driver opens the connection in SQL_MODE_READ_WRITE access mode by default.
To set the access mode to SQL_MODE_READ_ONLY, the application must call SQLSetConnectOption with the SQL_ACCESS_MODE option prior to calling SQLDriverConnect.
318
SQLDrivers
If a default translation shared library is specified in the .odbc.ini file for the data source,
the driver loads it. A different translation shared library can be loaded by calling
SQLSetConnectOption with the SQL_TRANSLATE_DLL option. A translation option
can be specified by calling SQLSetConnectOption with the
SQL_TRANSLATE_OPTION option.
Related Functions
For information about
See
SQLAllocConnect
SQLBrowseConnect (extension)
SQLConnect
SQLDisconnect
SQLDrivers (extension)
SQLFreeConnect
SQLSetConnectOption (extension)
SQLDrivers
Extension Level 2
SQLDrivers lists driver descriptions and driver attribute keywords. This function is
implemented solely by the Driver Manager.
Syntax
RETCODE SQLDrivers(henv, fDirection, szDriverDesc, cbDriverDescMax, pcbDriverDesc,
szDriverAttributes, cbDrvrAttrMax, pcbDrvrAttr)
319
SQLDrivers
320
Type
Argument
Use
Description
HENV
henv
Input
Environment handle.
UWORD
fDirection
Input
UCHAR
FAR *
szDriverDesc
Output
SWORD
cbDriverDescMax
Input
SWORD
FAR *
pcbDriverDesc
Output
UCHAR
FAR *
szDriverAttributes
Output
SQLDrivers
Type
Argument
Use
Description
SWORD
cbDrvrAttrMax
Input
SWORD
FAR *
pcbDrvrAttr
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLDrivers returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLDrivers and explains each one in
the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
321
SQLDrivers
322
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
S1000
General error
S1001
Memory allocation
failure
S1090
Invalid string or
buffer length
S1103
Direction option
out of range
SQLDrivers
Comments
SQLDrivers returns the driver description in the szDriverDesc argument. It returns additional information about the driver in the szDriverAttributes argument as a list of keyword-value pairs. Each pair is terminated with a null byte, and the entire list is
terminated with a null byte (that is, two null bytes mark the end of the list). For example,
a Text driver might return the following list of attributes (\0 represents a null byte):
FileUsage=1\0FileExtns=*.dbf\0\0
If szDriverAttributes is not large enough to hold the entire list, the list is truncated, SQLDrivers returns SQLSTATE 01004 (Data truncated), and the length of the list (excluding the
final null termination byte) is returned in pcbDrvrAttr.
Driver attribute keywords are added during the installation procedure. For more information, see Structure of the odbcinst.ini File in Chapter 18, Redistributing ODBC
Components.
An application can call SQLDrivers multiple times to retrieve all driver descriptions. The
Driver Manager retrieves this information from the odbcinst.ini file. When there are no
more driver descriptions, SQLDrivers returns SQL_NO_DATA_FOUND. If SQLDrivers
is called with SQL_FETCH_NEXT immediately after it returns
SQL_NO_DATA_FOUND, it returns the first driver description.
If SQL_FETCH_NEXT is passed to SQLDrivers the very first time it is called, SQLDrivers returns the first data source name.
Because SQLDrivers is implemented in the Driver Manager, it is supported for all drivers regardless of a particular drivers conformance level.
323
SQLError
Related Functions
For information about
See
SQLBrowseConnect (extension)
SQLConnect
SQLDataSources (extension)
SQLDriverConnect (extension)
SQLError
Core
SQLError returns error or status information.
Syntax
RETCODE SQLError(henv, hdbc, hstmt, szSqlState, pfNativeError, szErrorMsg, cbErrorMsgMax,
pcbErrorMsg)
324
Type
Argument
Use
Description
HENV
henv
Input
Environment handle or
SQL_NULL_HENV.
HDBC
hdbc
Input
Connection handle or
SQL_NULL_HDBC.
HSTMT
hstmt
Input
Statement handle or
SQL_NULL_HSTMT.
SQLError
Type
Argument
Use
Description
UCHAR
FAR *
szSqlState
Output
SQLSTATE as null-terminated
string. For a list of SQLSTATEs, see
Appendix A, ODBC Error Codes.
SDWORD
FAR *
pfNativeError
Output
UCHAR
FAR *
szErrorMsg
Output
SWORD
cbErrorMsgMax
Input
SWORD
FAR *
pcbErrorMsg
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
SQLError does not post error values for itself. SQLError returns
SQL_NO_DATA_FOUND when it is unable to retrieve any error information, (in which
case szSqlState equals 00000). If SQLError cannot access error values for any reason that
would normally return SQL_ERROR, SQLError returns SQL_ERROR but does not post
any error values. If the buffer for the error message is too short, SQLError returns
SQL_SUCCESS_WITH_INFO but, again, does not return a SQLSTATE value for SQLError.
325
SQLError
To determine that a truncation occurred in the error message, an application can compare cbErrorMsgMax to the actual length of the message text written to pcbErrorMsg.
Comments
An application typically calls SQLError when a previous call to an ODBC function
returns SQL_ERROR or SQL_SUCCESS_WITH_INFO. However, any ODBC function
can post zero or more errors each time it is called, so an application can call SQLError
after any ODBC function call.
SQLError retrieves an error from the data structure associated with the rightmost nonnull handle argument. An application requests error information as follows:
To retrieve errors associated with a connection, the application passes the corresponding hdbc plus an hstmt equal to SQL_NULL_HSTMT. In such a case, the
driver ignores the henv argument. The driver returns the error status of the
ODBC function most recently called with the hdbc.
To retrieve errors associated with a statement, an application passes the corresponding hstmt. If the call to SQLError contains a valid hstmt, the driver ignores
the hdbc and henv arguments. The driver returns the error status of the ODBC
function most recently called with the hstmt.
When there is no additional information for the rightmost non-null handle, SQLError
returns SQL_NO_DATA_FOUND. In this case, szSqlState equals 00000 (Success), pfNativeError is undefined, pcbErrorMsg equals 0, and szErrorMsg contains a single null termination byte (unless cbErrorMsgMax equals 0).
The Driver Manager stores error information in its henv, hdbc, and hstmt structures. Similarly, the driver stores error information in its henv, hdbc, and hstmt structures. When the
application calls SQLError, the Driver Manager checks if there are any errors in its structure for the specified handle. If there are errors for the specified handle, it returns the
first error; if there are no errors, it calls SQLError in the driver.
326
SQLExecDirect
The Driver Manager can store up to 64 errors with an henv and its associated hdbcs and
hstmts. When this limit is reached, the Driver Manager discards any subsequent errors
posted on the Driver Managers henv, hdbcs, or hstmts. The number of errors that a driver
can store is driver-dependent.
An error is removed from the structure associated with a handle when SQLError is called
for that handle and returns that error. All errors stored for a given handle are removed
when that handle is used in a subsequent function call. For example, errors on an hstmt
that were returned by SQLExecDirect are removed when SQLExecDirect or SQLTables
is called with that hstmt. The errors stored on a given handle are not removed as the result
of a call to a function using an associated handle of a different type. For example, errors
on an hdbc that were returned by SQLNativeSql are not removed when SQLError or
SQLExecDirect is called with an hstmt associated with that hdbc.
For more information about error codes, see Appendix A, ODBC Error Codes.
Related Functions
None.
SQLExecDirect
Core
SQLExecDirect executes a preparable statement, using the current values of the parameter marker variables if any parameters exist in the statement. SQLExecDirect is the fastest way to submit an SQL statement for one-time execution.
Syntax
RETCODE SQLExecDirect(hstmt, szSqlStr, cbSqlStr)
327
SQLExecDirect
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szSqlStr
Input
SDWORD
cbSqlStr
Input
Length of szSqlStr.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA,
SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLExecDirect returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLExecDirect and explains each
one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
328
SQLExecDirect
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
01006
Privilege not
revoked
01S03
No rows updated
or deleted
01S04
07001
Wrong number of
parameters
08S01
Communication
link failure
329
SQLExecDirect
330
SQLSTATE
Error
Description
21S01
21S02
Degree of
derived table
does not match
column list
22003
Numeric value
out of range
22005
Error in
assignment
22008
Datetime field
overflow
22012
Division by zero
23000
Integrity
constraint
violation
SQLExecDirect
SQLSTATE
Error
Description
24000
Invalid cursor
state
34000
Invalid cursor
name
37000
Syntax error or
access violation
40001
Serialization
failure
42000
Syntax error or
access violation
IM001
S0001
Base table or
view already
exists
331
SQLExecDirect
332
SQLSTATE
Error
Description
S0002
S0011
Index already
exists
S0012
S0021
Column already
exists
SQLExecDirect
SQLSTATE
Error
Description
S0022
Column not
found
S1000
General error
S1001
Memory
allocation failure
S1008
Operation
canceled
S1009
Invalid argument
value
333
SQLExecDirect
334
SQLSTATE
Error
Description
S1010
Function
sequence error
S1090
Invalid string or
buffer length
S1109
Invalid cursor
position
S1C00
Driver not
capable
S1T00
Timeout expired
SQLExecDirect
Comments
The application calls SQLExecDirect to send an SQL statement to the data source. The
driver modifies the statement to use the form of SQL used by the data source, then submits it to the data source. In particular, the driver modifies the escape clauses used to
define ODBC-specific SQL. For a description of SQL statement grammar, see Supporting ODBC Extensions to SQL in Chapter 14 and Appendix C, SQL Grammar.
The application can include one or more parameter markers in the SQL statement. To
include a parameter marker, the application embeds a question mark (?) into the SQL
statement at the appropriate position.
If the SQL statement is a SELECT statement, and if the application called SQLSetCursorName to associate a cursor with an hstmt, then the driver uses the specified cursor. Otherwise, the driver generates a cursor name.
If the data source is in manual-commit mode (requiring explicit transaction initiation),
and a transaction has not already been initiated, the driver initiates a transaction before
it sends the SQL statement.
If an application uses SQLExecDirect to submit a COMMIT or ROLLBACK statement,
it will not be interoperable between DBMS products. To commit or roll back a transaction,
call SQLTransact.
If SQLExecDirect encounters a data-at-execution parameter, it returns
SQL_NEED_DATA. The application sends the data using SQLParamData and SQLPutData. See SQLBindParameter, SQLParamOptions, SQLParamData, and SQLPutData
for more information.
Code Example
See SQLBindCol, SQLExtendedFetch, SQLGetData, and SQLProcedures.
335
SQLExecute
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExecute
SQLExtendedFetch (extension)
SQLFetch
SQLGetCursorName
SQLGetData (extension)
SQLPrepare
SQLPutData (extension)
SQLSetCursorName
SQLSetStmtOption (extension)
SQLTransact
SQLExecute
Core
SQLExecute executes a prepared statement, using the current values of the parameter
marker variables if any parameter markers exist in the statement.
Syntax
RETCODE SQLExecute(hstmt)
336
SQLExecute
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA,
SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLExecute returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLExecute and explains each one in
the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
337
SQLExecute
338
SQLSTATE
Error
Description
01006
Privilege not
revoked
01S03
No rows updated
or deleted
01S04
More than one row The prepared statement associated with the
updated or deleted hstmt was a positioned update or delete
statement and more than one row was updated
or deleted. (Function returns
SQL_SUCCESS_WITH_INFO.)
07001
Wrong number of
parameters
08S01
Communication
link failure
22003
22005
Error in
assignment
22008
Datetime field
overflow
SQLExecute
SQLSTATE
Error
Description
22012
Division by zero
23000
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
The prepared statement associated with the
hstmt contained a positioned update or delete
statement and the cursor was positioned
before the start of the result set or after the end
of the result set.
40001
Serialization
failure
42000
Syntax error or
access violation
IM001
S1000
General error
339
SQLExecute
340
SQLSTATE
Error
Description
S1001
Memory allocation
failure
S1008
Operation
canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
SQLExecute
SQLSTATE
Error
Description
S1109
Invalid cursor
position
S1C00
S1T00
Timeout expired
SQLExecute can return any SQLSTATE that can be returned by SQLPrepare based on
when the data source evaluates the SQL statement associated with the hstmt.
Comments
SQLExecute executes a statement prepared by SQLPrepare. Once the application processes or discards the results from a call to SQLExecute, the application can call SQLExecute again with new parameter values.
To execute a SELECT statement more than once, the application must call SQLFreeStmt
with the SQL_CLOSE parameter before reissuing the SELECT statement.
If the data source is in manual-commit mode (requiring explicit transaction initiation),
and a transaction has not already been initiated, the driver initiates a transaction before
it sends the SQL statement.
If an application uses SQLPrepare to prepare and SQLExecute to submit a COMMIT or
ROLLBACK statement, it will not be interoperable between DBMS products. To commit
or roll back a transaction, call SQLTransact.
341
SQLExecute
Code Example
See SQLBindParameter, SQLParamOptions, SQLPutData, and SQLSetPos.
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExecDirect
SQLExtendedFetch (extension)
SQLFetch
SQLFreeStmt
SQLGetCursorName
SQLGetData (extension)
342
SQLPrepare
SQLPutData (extension)
SQLSetCursorName
SQLSetStmtOption (extension)
SQLTransact
SQLExtendedFetch
SQLExtendedFetch
Extension Level 2
SQLExtendedFetch extends the functionality of SQLFetch in the following ways:
It returns rowset data (one or more rows), in the form of an array, for each bound
column.
It scrolls through the result set according to the setting of a scroll-type argument.
Syntax
RETCODE SQLExtendedFetch(hstmt, fFetchType, irow, pcrow, rgfRowStatus)
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
fFetchType
Input
SQLROWOFFSET
irow
Input
343
SQLExtendedFetch
Type
Argument
Use
Description
SQLROWSETSIZE*
pcrow
Output
SQLUSMALLINT*
rgfRowStatus
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLExtendedFetch returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO,
an associated SQLSTATE value may be obtained by calling SQLError. The following
table lists the SQLSTATE values commonly returned by SQLExtendedFetch and
explains each one in the context of this function; the notation (DM) precedes the
descriptions of SQLSTATEs returned by the Driver Manager. The return code associated
with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
344
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
01S01
Error in row
SQLExtendedFetch
SQLSTATE
Error
Description
07006
Restricted data
type attribute
violation
08S01
Communication
link failure
22003
22012
Division by zero
24000
40001
Serialization
failure
IM001
S1000
General error
S1001
Memory allocation
failure
345
SQLExtendedFetch
346
SQLSTATE
Error
Description
S1002
Invalid column
number
S1008
Operation
canceled
S1010
Function sequence
error
S1106
SQLExtendedFetch
SQLSTATE
Error
Description
S1107
S1111
Invalid bookmark
value
S1C00
S1T00
Timeout expired
Comments
SQLExtendedFetch returns one rowset of data to the application. An application cannot
mix calls to SQLExtendedFetch and SQLFetch for the same cursor.
An application specifies the number of rows in the rowset by calling SQLSetStmtOption
with the SQL_ROWSET_SIZE statement option.
347
SQLExtendedFetch
Binding
If any columns in the result set have been bound with SQLBindCol, the driver converts
the data for the bound columns as necessary and stores it in the locations bound to those
columns. The result set can be bound in a column-wise (the default) or row-wise fashion.
Column-Wise Binding
To bind a result set in column-wise fashion, an application specifies
SQL_BIND_BY_COLUMN for the SQL_BIND_TYPE statement option. (This is the
default value.) For each column to be bound, the application:
1.
Allocates an array of data storage buffers. The array has as many elements as
there are rows in the rowset, plus an additional element if the application will
search for key values or append new rows of data. Each buffers size is the maximum size of the C data that can be returned for the column. For example, when
the C data type is SQL_C_DEFAULT, each buffers size is the column length.
When the C data type is SQL_C_CHAR, each buffers size is the display size of
the data. For more information, see Converting Data from SQL to C Data
Types and Precision, Scale, Length, and Display Size in Appendix D, Data
Types.
2.
3.
Calls SQLBindCol:
The rgbValue argument specifies the address of the data storage array.
The cbValueMax argument specifies the size of each buffer in the data storage array.
When the application calls SQLExtendedFetch, the driver retrieves the data and the
number of bytes available to return and stores them in the buffers allocated by the application:
For each bound column, the driver stores the data in the rgbValue buffer bound to the
column. It stores the first row of data at the start of the buffer and each subsequent row
of data at an offset of cbValueMax bytes from the data for the previous row.
348
SQLExtendedFetch
For each bound column, the driver stores the number of bytes available to return in the
pcbValue buffer bound to the column. This is the number of bytes available prior to calling
SQLExtendedFetch. (If the number of bytes available to return cannot be determined in
advance, the driver sets pcbValue to SQL_NO_TOTAL. If the data for the column is
NULL, the driver sets pcbValue to SQL_NULL_DATA.) It stores the number of bytes
available to return for the first row at the start of the buffer and the number of bytes available to return for each subsequent row at an offset of sizeof(SDWORD) from the value
for the previous row.
Row-Wise Binding
To bind a result set in row-wise fashion, an application:
1.
Declares a structure that can hold a single row of retrieved data and the associated data lengths. For each bound column, the structure contains one field for the
data and one SDWORD field for the number of bytes available to return. The
data fields size is the maximum size of the C data that can be returned for the
column.
2.
3.
Allocates an array of these structures. The array has as many elements as there
are rows in the rowset, plus an additional element if the application will search
for key values or append new rows of data.
4.
The rgbValue argument specifies the address of the columns data field in the
first array element.
The cbValueMax argument specifies the size of the columns data field.
The pcbValue argument specifies the address of the columns number-ofbytes field in the first array element.
When the application calls SQLExtendedFetch, the driver retrieves the data and the
number of bytes available to return and stores them in the buffers allocated by the application:
For each bound column, the driver stores the first row of data at the address
specified by rgbValue for the column and each subsequent row of data at an offset
of vParam bytes from the data for the previous row.
349
SQLExtendedFetch
For each bound column, the driver stores the number of bytes available to
return for the first row at the address specified by pcbValue and the number of
bytes available to return for each subsequent row at an offset of vParam bytes
from the value for the previous row. This is the number of bytes available prior
to calling SQLExtendedFetch. (If the number of bytes available to return cannot
be determined in advance, the driver sets pcbValue to SQL_NO_TOTAL. If the
data for the column is NULL, the driver sets pcbValue to SQL_NULL_DATA.)
Calls to SQLGetData.
An application can specify a cursor position when it calls SQLSetPos. Before it executes
a positioned update or delete statement or calls SQLGetData, the application must position the cursor by calling SQLExtendedFetch to retrieve a rowset; the cursor points to
the first row in the rowset. To position the cursor to a different row in the rowset, the
application calls SQLSetPos.
The following table shows the rowset and return code returned when the application
requests different rowsets.
350
Requested
Rowset
Return Code
Cursor Position
Returned Rowset
Before start
of result set
SQL_NO_DATA_
FOUND
Before start of
result set
Overlaps
start of result
set
SQL_SUCCESS
Row 1 of
rowset
Within result
set
SQL_SUCCESS
Row 1 of
rowset
Requested rowset.
SQLExtendedFetch
Requested
Rowset
Return Code
Cursor Position
Returned Rowset
Overlaps
end of result
set
SQL_SUCCESS
Row 1 of
rowset
After end of
result set
SQL_NO_DATA_
FOUND
After end of
result set
For example, suppose a result set has 100 rows and the rowset size is 5. The following
table shows the rowset and return code returned by SQLExtendedFetch for different
values of irow when the fetch type is SQL_FETCH_RELATIVE:
Current
Rowset
irow
Return Code
New Rowset
1 to 5
SQL_NO_DATA_FOUND
None.
1 to 5
SQL_SUCCESS
1 to 5
96 to 100
SQL_NO_DATA_FOUND
None.
96 to 100
SQL_SUCCESS
Before SQLExtendedFetch is called the first time, the cursor is positioned before the start
of the result set.
351
SQLExtendedFetch
For the purpose of moving the cursor, deleted rows (that is, rows with an entry in the
rgfRowStatus array of SQL_ROW_DELETED) are treated no differently than other rows.
For example, calling SQLExtendedFetch with fFetchType set to
SQL_FETCH_ABSOLUTE and irow set to 15 returns the rowset starting at row 15, even
if the rgfRowStatus array for row 15 is SQL_ROW_DELETED.
Processing Errors
If an error occurs that pertains to the entire rowset, such as SQLSTATE S1T00 (Timeout
expired), the driver returns SQL_ERROR and the appropriate SQLSTATE. The contents
of the rowset buffers are undefined and the cursor position is unchanged.
If an error occurs that pertains to a single row, the driver:
Sets the element in the rgfRowStatus array for the row to SQL_ROW_ERROR.
Posts zero or more additional SQLSTATEs for the error after SQLSTATE 01S01
(Error in row) in the error queue.
After it has processed the error or warning, the driver continues the operation for the
remaining rows in the rowset and returns SQL_SUCCESS_WITH_INFO. Thus, for each
error that pertains to a single row, the error queue contains SQLSTATE 01S01 (Error in
row) followed by zero or more additional SQLSTATEs.
After it has processed the error, the driver fetches the remaining rows in the rowset and
returns SQL_SUCCESS_WITH_INFO. Thus, for each row that returned an error, the
error queue contains SQLSTATE 01S01 (Error in row) followed by zero or more additional SQLSTATEs.
If the rowset contains rows that have already been fetched, the driver is not required to
return SQLSTATEs for errors that occurred when the rows were first fetched. It is, however, required to return SQLSTATE 01S01 (Error in row) for each row in which an error
originally occurred and to return SQL_SUCCESS_WITH_INFO. For example, a static
cursor that maintains a cache might cache row status information (so it can determine
which rows contain errors) but might not cache the SQLSTATE associated with those
errors.
Error rows do not affect relative cursor movements. For example, suppose the result set
size is 100 and the rowset size is 10. If the current rowset is rows 11 through 20 and the
element in the rgfRowStatus array for row 11 is SQL_ROW_ERROR, calling SQLExtendedFetch with the SQL_FETCH_NEXT fetch type still returns rows 21 through 30.
352
SQLExtendedFetch
If the driver returns any warnings, such as SQLSTATE 01004 (Data truncated), it returns
warnings that apply to the entire rowset or to unknown rows in the rowset before it
returns error information applying to specific rows. It returns warnings for specific rows
along with any other error information about those rows.
fFetchType Argument
The fFetchType argument specifies how to move through the result set. It is one of the following values:
SQL_FETCH_NEXT
SQL_FETCH_FIRST
SQL_FETCH_LAST
SQL_FETCH_PRIOR
SQL_FETCH_ABSOLUTE
SQL_FETCH_RELATIVE
SQL_FETCH_BOOKMARK
353
SQLExtendedFetch
Action
SQL_FETCH_NEXT
SQL_FETCH_PRIOR
SQL_FETCH_RELATIVE
It supports the following values of the fFetchType argument to move to an absolute position in the result set:
354
fFetchType Argument
Action
SQL_FETCH_FIRST
SQLExtendedFetch
fFetchType Argument
Action
SQL_FETCH_LAST
SQL_FETCH_ABSOLUTE
Positioning to a Bookmark
When an application calls SQLExtendedFetch with the SQL_FETCH_BOOKMARK
fetch type, the driver retrieves the rowset starting with the row specified by the bookmark in the irow argument.
To inform the driver that it will use bookmarks, the application calls SQLSetStmtOption
with the SQL_USE_BOOKMARKS option before opening the cursor. To retrieve the
bookmark for a row, the application either positions the cursor on the row and calls
SQLGetStmtOption with the SQL_GET_BOOKMARK option, or retrieves the
bookmark from column 0 of the result set. If the application retrieves a bookmark from
column 0 of the result set, it must set fCType in SQLBindCol or SQLGetData to
SQL_C_BOOKMARK. The application stores the bookmarks for those rows in each
rowset to which it will return later.
Bookmarks are 32-bit binary values; if a bookmark requires more than 32 bits, such as
when it is a key value, the driver maps the bookmarks requested by the application to 32bit binary values. The 32-bit binary values are then returned to the application. Because
this mapping may require considerable memory, applications should only bind column
0 of the result set if they will actually use bookmarks for most rows. Otherwise, applications should call SQLGetStmtOption with the SQL_GET_BOOKMARK statement
option or call SQLGetData for column 0.
355
SQLExtendedFetch
irow Argument
For the SQL_FETCH_ABSOLUTE fetch type, SQLExtendedFetch returns the rowset
starting at the row number specified by the irow argument.
For the SQL_FETCH_RELATIVE fetch type, SQLExtendedFetch returns the rowset
starting irow rows from the first row in the current rowset.
For the SQL_FETCH_BOOKMARK fetch type, the irow argument specifies the bookmark that marks the first row in the requested rowset.
The irow argument is ignored for the SQL_FETCH_NEXT, SQL_FETCH_PRIOR,
SQL_FETCH_FIRST, and SQL_FETCH_LAST, fetch types.
rgfRowStatus Argument
In the rgfRowStatus array, SQLExtendedFetch returns any changes in status to each row
since it was last retrieved from the data source. Rows may be unchanged
(SQL_ROW_SUCCESS), updated (SQL_ROW_UPDATED), deleted
(SQL_ROW_DELETED), added (SQL_ROW_ADDED), or were unretrievable due to an
error (SQL_ROW_ERROR). For static cursors, this information is available for all rows.
For keyset, mixed, and dynamic cursors, this information is only available for rows in
the keyset; the driver does not save data outside the keyset and therefore cannot compare the newly retrieved data to anything.
Important: Some drivers cannot detect changes to data. To determine whether a driver can detect
changes to refetched rows, an application calls SQLGetInfo with the SQL_ROW_UPDATES
option.
The number of elements must equal the number of rows in the rowset (as defined by the
SQL_ROWSET_SIZE statement option). If the number of rows fetched is less than the
number of elements in the status array, the driver sets remaining status elements to
SQL_ROW_NOROW.
When an application calls SQLSetPos with fOption set to SQL_DELETE or
SQL_UPDATE, SQLSetPos changes the rgfRowStatus array for the changed row to
SQL_ROW_DELETED or SQL_ROW_UPDATED.
Note that for keyset, mixed, and dynamic cursors, if a key value is updated, the row of
data is considered to have been deleted and a new row added.
356
SQLExtendedFetch
Code Example
The following two examples show how an application could use column-wise or rowwise binding to bind storage locations to the same result set.
For more code examples, see SQLSetPos.
Column-Wise Binding
In the following example, an application declares storage locations for column-wise
bound data and the returned numbers of bytes. Because column-wise binding is the
default, there is no need, as in the row-wise binding example, to request column-wise
binding with SQLSetStmtOption. However, the application does call SQLSetStmtOption to specify the number of rows in the rowset.
The application then executes a SELECT statement to return a result set of the employee
names and birthdays, which is sorted by birthday. It calls SQLBindCol to bind the columns of data, passing the addresses of storage locations for both the data and the
returned numbers of bytes. Finally, the application fetches the rowset data with SQLExtendedFetch and prints each employees name and birthday.
357
SQLExtendedFetch
358
SQLExtendedFetch
Row-Wise Binding
In the following example, an application declares an array of structures to hold row-wise
bound data and the returned numbers of bytes. Using SQLSetStmtOption, it requests
row-wise binding and passes the size of the structure to the driver. The driver will use
this size to find successive storage locations in the array of structures. Using SQLSetStmtOption, it specifies the size of the rowset.
The application then executes a SELECT statement to return a result set of the employee
names and birthdays, which is sorted by birthday. It calls SQLBindCol to bind the columns of data, passing the addresses of storage locations for both the data and the
returned numbers of bytes. Finally, the application fetches the rowset data with SQLExtendedFetch and prints each employees name and birthday.
#define ROWS 100
#define NAME_LEN 30
#define BDAY_LEN 11
typedef struct {
UCHAR szName[NAME_LEN];
SQLLEN cbName;
SWORD sAge;
SQLLEN cbAge;
UCHAR szBirthday[BDAY_LEN];
SQLLEN cbBirthday;
}
EmpTable;
EmpTable rget[ROWS];
SQLROWSETSIZE crow;
SQLROWSETSIZE irow;
UWORD rgfRowStatus[ROWS];
SQLSetStmtOption(hstmt, SQL_BIND_TYPE, sizeof(EmpTable));
SQLSetStmtOption(hstmt, SQL_CONCURRENCY, SQL_CONCUR_READ_ONLY);
SQLSetStmtOption(hstmt, SQL_CURSOR_TYPE, SQL_CURSOR_KEYSET_DRIVEN);
SQLSetStmtOption(hstmt, SQL_ROWSET_SIZE, ROWS);
retcode = SQLExecDirect(hstmt,
"SELECT NAME, AGE, BIRTHDAY FROM EMPLOYEE ORDER BY 3, 2, 1",
SQL_NTS);
if (retcode == SQL_SUCCESS) {
SQLBindCol(hstmt, 1, SQL_C_CHAR, rget[0].szName, NAME_LEN,
&rget[0].cbName);
SQLBindCol(hstmt, 2, SQL_C_SSHORT, &rget[0].sAge, 0,
&rget[0].cbAge);
SQLBindCol(hstmt, 3, SQL_C_CHAR, rget[0].szBirthday, BDAY_LEN,
&rget[0].cbBirthday);
/* Fetch the rowset data and print each row. */
/* On an error, display a message and exit. */
while (TRUE) {
359
SQLExtendedFetch
Related Functions
For information about
See
360
SQLCancel
SQLDescribeCol
SQLExecDirect
SQLExecute
SQLNumResultCols
SQLSetPos (extension)
SQLSetStmtOption (extension)
SQLFetch
SQLFetch
Core
SQLFetch fetches a row of data from a result set. The driver returns data for all columns
that were bound to storage locations with SQLBindCol.
Syntax
RETCODE SQLFetch(hstmt)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLFetch returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLFetch and explains each one in the context
of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned
by the Driver Manager. The return code associated with each SQLSTATE value is
SQL_ERROR, unless noted otherwise.
361
SQLFetch
362
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
07006
Restricted data
type attribute
violation
08S01
Communication
link failure
22003
22012
Division by zero
24000
40001
Serialization
failure
IM001
SQLFetch
SQLSTATE
Error
Description
S1000
General error
S1001
Memory allocation
failure
S1002
Invalid column
number
S1008
Operation
canceled
363
SQLFetch
SQLSTATE
Error
Description
S1010
Function sequence
error
S1C00
S1T00
Timeout expired
Comments
SQLFetch positions the cursor on the next row of the result set. Before SQLFetch is
called the first time, the cursor is positioned before the start of the result set. When the
cursor is positioned on the last row of the result set, SQLFetch returns
SQL_NO_DATA_FOUND and the cursor is positioned after the end of the result set. An
application cannot mix calls to SQLExtendedFetch and SQLFetch for the same cursor.
364
SQLFetch
If the application called SQLBindCol to bind columns, SQLFetch stores data into the
locations specified by the calls to SQLBindCol. If the application does not call SQLBindCol to bind any columns, SQLFetch doesnt return any data; it just moves the cursor to
the next row. An application can call SQLGetData to retrieve data that is not bound to a
storage location.
The driver manages cursors during the fetch operation and places each value of a bound
column into the associated storage. The driver follows these guidelines when performing
a fetch operation:
If rgbValue is not large enough to hold the entire result, the driver stores part of
the value and returns SQL_SUCCESS_WITH_INFO. A subsequent call to
SQLError indicates that a truncation occurred. The application can compare pcbValue to cbValueMax (specified in SQLBindCol) to determine which column or
columns were truncated. If pcbValue is greater than or equal to cbValueMax, then
truncation occurred.
If the data value for the column is NULL, the driver stores SQL_NULL_DATA in
pcbValue.
Code Example
See SQLBindCol, SQLColumns, SQLGetData, and SQLProcedures.
365
SQLForeignKeys
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLDescribeCol
SQLExecDirect
SQLExecute
SQLExtendedFetch (extension)
SQLFreeStmt
SQLGetData (extension)
SQLNumResultCols
SQLPrepare
SQLForeignKeys
Extension Level 2
SQLForeignKeys can return:
A list of foreign keys in the specified table (columns in the specified table that refer to
primary keys in other tables).
A list of foreign keys in other tables that refer to the primary key in the specified table.
The driver returns each list as a result set on the specified hstmt.
366
SQLForeignKeys
Syntax
RETCODE SQLForeignKeys(hstmt, szPkTableQualifier, cbPkTableQualifier, szPkTableOwner,
cbPkTableOwner, szPkTableName, cbPkTableName, szFkTableQualifier, cbFkTableQualifier,
szFkTableOwner, cbFkTableOwner, szFkTableName, cbFkTableName)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szPkTableQualifier
Input
SWORD
cbPkTableQualifier
Input
Length of szPkTableQualifier.
UCHAR FAR *
szPkTableOwner
Input
SWORD
cbPkTableOwner
Input
Length of szPkTableOwner.
UCHAR FAR *
szPkTableName
Input
SWORD
cbPkTableName
Input
Length of szPkTableName.
UCHAR FAR *
szFkTableQualifier
Input
SWORD
cbFkTableQualifier
Input
Length of szFkTableQualifier.
367
SQLForeignKeys
Type
Argument
Use
Description
UCHAR FAR *
szFkTableOwner
Input
SWORD
cbFkTableOwner
Input
Length of szFkTableOwner.
UCHAR FAR *
szFkTableName
Input
SWORD
cbFkTableName
Input
Length of szFkTableName.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLForeignKeys returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLForeignKeys and explains each one
in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
368
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
SQLForeignKeys
SQLSTATE
Error
Description
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
S1009
Invalid argument
value
S1010
Function sequence
error
369
SQLForeignKeys
SQLSTATE
Error
Description
S1090
Invalid string or
buffer length
S1C00
S1T00
Timeout expired
Comments
If szPkTableName contains a table name, SQLForeignKeys returns a result set containing
the primary key of the specified table and all of the foreign keys that refer to it.
If szFkTableName contains a table name, SQLForeignKeys returns a result set containing
all of the foreign keys in the specified table and the primary keys (in other tables) to
which they refer.
If both szPkTableName and szFkTableName contain table names, SQLForeignKeys returns
the foreign keys in the table specified in szFkTableName that refer to the primary key of
the table specified in szPkTableName. This should be one key at most.
SQLForeignKeys returns results as a standard result set. If the foreign keys associated
with a primary key are requested, the result set is ordered by FKTABLE_QUALIFIER,
FKTABLE_OWNER, FKTABLE_NAME, and KEY_SEQ. If the primary keys associated
with a foreign key are requested, the result set is ordered by PKTABLE_QUALIFIER,
PKTABLE_OWNER, PKTABLE_NAME, and KEY_SEQ. The following table lists the
columns in the result set.
370
SQLForeignKeys
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the TABLE_QUALIFIER,
TABLE_OWNER, TABLE_NAME, and COLUMN_NAME columns, an application can
call SQLGetInfo with the SQL_MAX_QUALIFIER_NAME_LEN,
SQL_MAX_OWNER_NAME_LEN, SQL_MAX_TABLE_NAME_LEN, and
SQL_MAX_COLUMN_NAME_LEN options.
Column Name
Data Type
Comments
PKTABLE_QUALIFIER Varchar(128)
PKTABLE_OWNER
Varchar(128)
PKTABLE_NAME
Varchar(128)
not NULL
PKCOLUMN_NAME
Varchar(128)
not NULL
FKTABLE_QUALIFIER Varchar(128)
371
SQLForeignKeys
372
Column Name
Data Type
Comments
FKTABLE_OWNER
Varchar(128)
FKTABLE_NAME
Varchar(128)
not NULL
FKCOLUMN_NAME
Varchar(128)
not NULL
KEY_SEQ
Smallint
not NULL
UPDATE_RULE
Smallint
DELETE_RULE
Smallint
FK_NAME
Varchar(128)
PK_NAME
Varchar(128)
SQLForeignKeys
Important: The FK_NAME and PK_NAME columns were added in ODBC 2.0.
ODBC 1.0 drivers may return different, driver-specific columns with the same column numbers.
Code Example
This example uses four tables.:
SALES_ORDER
SALES_ID
CUSTOMER_ID
EMPLOYEE_ID
TOTAL_PRICE
SALES_LINE
SALES_ID
LINE_NUMBER
PART_ID
QUANTITY
PRICE
CUSTOMER
CUSTOMER_ID
CUST_NAME
ADDRESS
PHONE
EMPLOYEE
EMPLOYEE_ID
NAME
AGE
BIRTHDAY
In the SALES_ORDER table, CUSTOMER_ID identifies the customer to whom the sale
has been made. It is a foreign key that refers to CUSTOMER_ID in the CUSTOMER table.
EMPLOYEE_ID identifies the employee who made the sale. It is a foreign key that refers
to EMPLOYEE_ID in the EMPLOYEE table.
In the SALES_LINE table, SALES_ID identifies the sales order with which the line item
is associated. It is a foreign key that refers to SALES_ID in the SALES_ORDER table.
This example calls SQLPrimaryKeys to get the primary key of the SALES_ORDER table.
The result set will have one row and the significant columns areas follows::
TABLE_NAME
SALES_ORDER
COLUMN_NAME
SALES_ID
KEY_SEQ
1
Next, the example calls SQLForeignKeys to get the foreign keys in other tables that reference the primary key of the SALES_ORDER table. The result set will have one row and
the significant columns are as follows::
PKTABLE_
NAME
SALES_ORDER
PKCOLUMN_
NAME
SALES_ID
FKTABLE_
NAME
SALES_LINE
FKCOLUMN_
NAME
SALES_ID
KEY_SEQ
1
373
SQLForeignKeys
Finally, the example calls SQLForeignKeys to get the foreign keys in the
SALES_ORDER table the refer to the primary keys of other tables. The result set will
have two rows and the significant columns are as follows::
PKTABLE_
NAME
CUSTOMER
EMPLOYEE
PKCOLUMN_
NAME
CUSTOMER_ID
EMPLOYEE_ID
FKTABLE_
NAME
SALES_ORDER
SALES_ORDER
FKCOLUMN_
NAME
CUSTOMER_ID
EMPLOYEE_ID
/* Table to display
*/
*/
*/
retcode = SQLFetch(hstmt);
if (retcode == SQL_SUCCESS || retcode != SQL_SUCCESS_WITH_INFO)
fprintf(out, "Column: %s Key Seq: %hd \n", szPkCol, iKeySeq);
}
/* Close the cursor (the hstmt is still allocated).
*/
SQLFreeStmt(hstmt, SQL_CLOSE);
/* Get all the foreign keys that refer to SALES_ORDER primary key. */
374
KEY_SEQ
1
1
SQLForeignKeys
retcode = SQLForeignKeys(hstmt,
NULL, 0,
/* Primary qualifier */
NULL, 0,
/* Primary owner
*/
szTable, SQL_NTS, /* Primary table
*/
NULL, 0,
/* Foreign qualifier */
NULL, 0,
/* Foreign owner
*/
NULL, 0);
/* Foreign table
*/
while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) {
/* Fetch and display the result set. This will be all of the */
/* foreign keys in other tables that refer to the SALES_ORDER */
/* primary key.
*/
retcode = SQLFetch(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
fprintf(out, "%-s ( %-s ) <-- %-s ( %-s )\n", szPkTable,
szPkCol, szFkTable, szFkCol);
}
/* Close the cursor (the hstmt is still allocated).
*/
SQLFreeStmt(hstmt, SQL_CLOSE);
/* Get all the foreign keys in the SALES_ORDER table.
*/
retcode = SQLForeignKeys(hstmt,
NULL, 0,
/* Primary qualifier */
NULL, 0,
/* Primary owner
*/
NULL, 0,
/* Primary table
*/
NULL, 0,
/* Foreign qualifier */
NULL, 0,
/* Foreign owner
*/
szTable, SQL_NTS); /* Foreign table
*/
while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) {
/* Fetch and display the result set. This will be all of the */
/* primary keys in other tables that are referred to by foreign */
/* keys in the SALES_ORDER table.
*/
retcode = SQLFetch(hstmt);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
fprintf(out, "%-s ( %-s )--> %-s ( %-s )\n", szFkTable, szFkCol,
szPkTable, szPkCol);
}
/* Free the hstmt. */
SQLFreeStmt(hstmt, SQL_DROP);
375
SQLFreeConnect
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExtendedFetch (extension)
SQLFetch
SQLPrimaryKeys (extension)
SQLStatistics (extension)
SQLFreeConnect
Core
SQLFreeConnect releases a connection handle and frees all memory associated with the
handle.
Syntax
RETCODE SQLFreeConnect(hdbc)
376
Type
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
SQLFreeConnect
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLFreeConnect returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLFreeConnect and explains each one in
the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
S1000
General error
S1010
Function sequence
error
Comments
Prior to calling SQLFreeConnect, an application must call SQLDisconnect for the hdbc.
Otherwise, SQLFreeConnect returns SQL_ERROR and the hdbc remains valid. Note that
SQLDisconnect automatically drops any hstmts open on the hdbc.
377
SQLFreeEnv
Code Example
See SQLBrowseConnect and SQLConnect.
Related Functions
For information about
See
SQLAllocConnect
SQLConnect
SQLDisconnect
SQLDriverConnect (extension)
SQLFreeEnv
SQLFreeStmt
SQLFreeEnv
Core
SQLFreeEnv frees the environment handle and releases all memory associated with the
environment handle.
Syntax
RETCODE SQLFreeEnv(henv)
378
Type
Argument
Use
Description
HENV
henv
Input
Environment handle.
SQLFreeEnv
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLFreeEnv returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated
SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLFreeEnv and explains each one in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
S1000
General error
S1010
Function
sequence error
Comments
Prior to calling SQLFreeEnv, an application must call SQLFreeConnect for any hdbc allocated under the henv. Otherwise, SQLFreeEnv returns SQL_ERROR and the henv and
any active hdbc remains valid.
When the Driver Manager processes the SQLFreeEnv function, it checks the TraceAutoStop keyword in the [ODBC] section of the .odbc.ini file. If it is set to 1, the Driver Manager disables tracing for all applications and sets the Trace keyword in the [ODBC]
section of the .odbc.ini file to 0.
379
SQLFreeStmt
Code Example
See SQLBrowseConnect and SQLConnect.
Related Functions
For information about
See
SQLAllocEnv
SQLFreeConnect
SQLFreeStmt
Core
SQLFreeStmt stops processing associated with a specific hstmt, closes any open cursors
associated with the hstmt, discards pending results, and, optionally, frees all resources
associated with the statement handle.
Syntax
RETCODE SQLFreeStmt(hstmt, fOption)
380
SQLFreeStmt
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle
UWORD
fOption
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLFreeStmt returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLFreeStmt and explains each one
381
SQLFreeStmt
in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
382
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
S1001
Memory allocation
failure
S1010
Function sequence
error
S1092
SQLGetConnectOption
Comments
An application can call SQLFreeStmt to terminate processing of a SELECT statement
with or without canceling the statement handle.
The SQL_DROP option frees all resources that were allocated by the SQLAllocStmt
function.
Code Example
See SQLBrowseConnect and SQLConnect.
Related Functions
For information about
See
SQLAllocStmt
SQLCancel
SQLSetCursorName
SQLGetConnectOption
Extension Level 1
SQLGetConnectOption returns the current setting of a connection option.
Syntax
RETCODE SQLGetConnectOption(hdbc, fOption, pvParam)
383
SQLGetConnectOption
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
UWORD
fOption
Input
Option to retrieve.
PTR
pvParam
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLGetConnectOption returns SQL_ERROR or SQL_SUCCESS_WITH_INFO,
an associated SQLSTATE value may be obtained by calling SQLError. The following
table lists the SQLSTATE values commonly returned by SQLGetConnectOption and
explains each one in the context of this function; the notation (DM) precedes the
descriptions of SQLSTATEs returned by the Driver Manager. The return code associated
with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
384
SQLSTATE
Error
Description
01000
General warning
08003
Connection not
open
IM001
SQLGetConnectOption
SQLSTATE
Error
Description
S1000
General error
S1001
Memory allocation
failure
S1010
Function sequence
error
S1092
S1C00
Comments
For a list of options, see SQLSetConnectOption.
Important: When fOption specifies an option that returns a string, pvParam must
be a pointer to storage for the string. The maximum length of the string will be
SQL_MAX_OPTION_STRING_LENGTH bytes (excluding the null termination
byte).
385
SQLGetCursorName
Depending on the option, an application does not need to establish a connection prior
to calling SQLGetConnectOption. However, if SQLGetConnectOption is called and
the specified option does not have a default and has not been set by a prior call to
SQLSetConnectOption, SQLGetConnnectOption will return
SQL_NO_DATA_FOUND.
While an application can set statement options using SQLSetConnectOption, an application cannot use SQLGetConnectOption to retrieve statement option values; it must
call SQLGetStmtOption to retrieve the setting of statement options.
Related Functions
For information about
See
SQLGetStmtOption (extension)
SQLSetConnectOption (extension)
SQLSetStmtOption (extension)
SQLGetCursorName
Core
SQLGetCursorName returns the cursor name associated with a specified hstmt.
Syntax
RETCODE SQLGetCursorName(hstmt, szCursor, cbCursorMax, pcbCursor)
386
SQLGetCursorName
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szCursor
Output
SWORD
cbCursorMax
Input
Length of szCursor.
SWORD FAR *
pcbCursor
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLGetCursorName returns either SQL_ERROR or
SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists the SQLSTATE values commonly returned by
SQLGetCursorName and explains each one in the context of this function; the notation
387
SQLGetCursorName
(DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The
return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
388
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
IM001
S1000
General error
S1001
Memory allocation
failure
S1010
Function sequence
error
SQLGetCursorName
SQLSTATE
Error
Description
S1015
No cursor name
available
S1090
Invalid string or
buffer length
Comments
The only ODBC SQL statements that use a cursor name are positioned update and delete
(for example, UPDATE table-name ...WHERE CURRENT OF cursor-name). If the application does not call SQLSetCursorName to define a cursor name, on execution of a
SELECT statement the driver generates a name that begins with the letters SQL_CUR
and does not exceed 18 characters in length.
SQLGetCursorName returns the name of a cursor regardless of whether the name was
created explicitly or implicitly.
A cursor name that is set either explicitly or implicitly remains set until the hstmt with
which it is associated is dropped, using SQLFreeStmt with the SQL_DROP option.
389
SQLGetData
Related Functions
For information about
See
SQLExecDirect
SQLExecute
SQLPrepare
SQLSetCursorName
SQLSetScrollOptions (extension)
SQLGetData
Extension Level 1
SQLGetData returns result data for a single unbound column in the current row. The
application must call SQLFetch, or SQLExtendedFetch and (optionally) SQLSetPos to
position the cursor on a row of data before it calls SQLGetData. It is possible to use SQLBindCol for some columns and use SQLGetData for others within the same row. This
function can be used to retrieve character or binary data values in parts from a column
with a character, binary, or data sourcespecific data type (for example, data from
SQL_LONGVARBINARY or SQL_LONGVARCHAR columns).
Syntax
RETCODE SQLGetData(hstmt, icol, fCType, rgbValue, cbValueMax, pcbValue)
390
SQLGetData
Type
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
icol
Input
SQLSMALLINT
fCType
Input
391
SQLGetData
Type
Argument
Use
Description
SQLPOINTER
rgbValue
Output
SQLLEN
cbValueMax
Input
SQLLEN*
pcbValue
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA_FOUND,
SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.
392
SQLGetData
Diagnostics
When SQLGetData returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLGetData and explains each one
in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
07006
Restricted data
type attribute
violation
08S01
Communication
link failure
22003
393
SQLGetData
394
SQLSTATE
Error
Description
22005
Error in
assignment
22008
Datetime field
overflow
24000
Invalid cursor state (DM) The hstmt was in an executed state but no
result set was associated with the hstmt.
(DM) A cursor was open on the hstmt but
SQLFetch or SQLExtendedFetch had not been
called.
A cursor was open on the hstmt and SQLFetch
or SQLExtendedFetch had been called, but the
cursor was positioned before the start of the
result set or after the end of the result set.
IM001
S1000
General error
S1001
Memory allocation
failure
SQLGetData
SQLSTATE
Error
Description
S1002
Invalid column
number
S1003
395
SQLGetData
396
SQLSTATE
Error
Description
S1008
Operation
canceled
S1009
Invalid argument
value
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1109
Invalid cursor
position
SQLGetData
SQLSTATE
Error
Description
S1C00
S1T00
Timeout expired
Comments
With each call, the driver sets pcbValue to the number of bytes that were available in the
result column prior to the current call to SQLGetData. (If SQL_MAX_LENGTH has been
set with SQLSetStmtOption, and the total number of bytes available on the first call is
greater than SQL_MAX_LENGTH, the available number of bytes is set to
SQL_MAX_LENGTH.
Note that he SQL_MAX_LENGTH statement option is intended to reduce network traffic
and may not be supported by all drivers. To guarantee that data is truncated, an application should allocate a buffer of the desired size and specify this size in the cbValueMax
397
SQLGetData
argument.) If the total number of bytes in the result column cannot be determined in
advance, the driver sets pcbValue to SQL_NO_TOTAL. If the data value for the column
is NULL, the driver stores SQL_NULL_DATA in pcbValue.
SQLGetData can convert data to a different data type. The result and success of the conversion is determined by the rules for assignment specified in Converting Data from
SQL to C Data Types in Appendix D, Data Types.
If more than one call to SQLGetData is required to retrieve data from a single column
with a character, binary, or data sourcespecific data type, the driver returns
SQL_SUCCESS_WITH_INFO. A subsequent call to SQLError returns SQLSTATE 01004
(Data truncated). The application can then use the same column number to retrieve
subsequent parts of the data until SQLGetData returns SQL_SUCCESS, indicating that
all data for the column has been retrieved. SQLGetData will return
SQL_NO_DATA_FOUND when it is called for a column after all of the data has been
retrieved and before data is retrieved for a subsequent column. The application can
ignore excess data by proceeding to the next result column.
Important: An application can use SQLGetData to retrieve data from a column in
parts only when retrieving character C data from a column with a character,binary,
or data sourcespecific data type or when retrieving binary C data from a column
with a character, binary, or data sourcespecific data type. If SQLGetData is called
more than one time in a row for a column under any other conditions, it returns
SQL_NO_DATA_FOUND for all calls after the first.
For maximum interoperability, applications should call SQLGetData only for unbound
columns with numbers greater than the number of the last bound column. Within a
single row of data, the column number in each call to SQLGetData should be greater
than or equal to the column number in the previous call (that is, data should be retrieved
in increasing order of column number). As extended functionality, drivers can return
data through SQLGetData from bound columns, from columns before the last bound
column, or from columns in any order. To determine whether a driver supports these
extensions, an application calls SQLGetInfo with the SQL_GETDATA_EXTENSIONS
option.
Furthermore, applications that use SQLExtendedFetch to retrieve data should call
SQLGetData only when the rowset size is 1. As extended functionality, drivers can
return data through SQLGetData when the rowset size is greater than 1. The application
calls SQLSetPos to position the cursor on a row and calls SQLGetData to retrieve data
from an unbound column. To determine whether a driver supports this extension, an
application calls SQLGetInfo with the SQL_GETDATA_EXTENSIONS option.
398
SQLGetData
Code Example
In the following example, an application executes a SELECT statement to return a result
set of the employee names, ages, and birthdays sorted by birthday, age, and name. For
each row of data, it calls SQLFetch to position the cursor to the next row. It calls SQLGetData to retrieve the fetched data; the storage locations for the data and the returned
number of bytes are specified in the call to SQLGetData. Finally, it prints each
employees name, age, and birthday.
#define NAME_LEN 30
#define BDAY_LEN 11
UCHAR szName[NAME_LEN], szBirthday[BDAY_LEN];
SWORD sAge;
SQLLEN cbName, cbAge, cbBirthday;
retcode = SQLExecDirect(hstmt,
"SELECT NAME, AGE, BIRTHDAY FROM EMPLOYEE ORDER BY 3, 2, 1",
SQL_NTS);
if (retcode == SQL_SUCCESS) {
while (TRUE) {
retcode = SQLFetch(hstmt);
if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
show_error();
}
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
/* Get data for columns 1, 2, and 3 */
/* Print the row of data
*/
SQLGetData(hstmt, 1, SQL_C_CHAR, szName, NAME_LEN, &cbName);
SQLGetData(hstmt, 2, SQL_C_SSHORT, &sAge, 0, &cbAge);
SQLGetData(hstmt, 3, SQL_C_CHAR, szBirthday, BDAY_LEN,
&cbBirthday);
fprintf(out, "%-*s %-2d %*s", NAME_LEN-1, szName, sAge,
BDAY_LEN-1, szBirthday);
} else {
break;
}
}
}
399
SQLGetFunctions
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExecDirect
SQLExecute
SQLExtendedFetch (extension)
SQLFetch
SQLPutData (extension)
SQLGetFunctions
Extension Level 1
SQLGetFunctions returns information about whether a driver supports a specific
ODBC function. This function is implemented in the Driver Manager; it can also be
implemented in drivers. If a driver implements SQLGetFunctions, the Driver Manager
calls the function in the driver. Otherwise, it executes the function itself.
Syntax
RETCODE SQLGetFunctions(hdbc, fFunction, pfExists)
400
SQLGetFunctions
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
UWORD
fFunction
Input
SQL_API_ALL_FUNCTIONS or a
#define value that identifies the ODBC
function of interest. For a list of #define
values that identify ODBC functions, see
the tables in Comments.
UWORD
FAR *
pfExists
Output
If fFunction is
SQL_API_ALL_FUNCTIONS, pfExists
points to a UWORD array with 100
elements. The array is indexed by
#define values used by fFunction to
identify each ODBC function; some
elements of the array are unused and
reserved for future use. An element is
TRUE if it identifies an ODBC function
supported by the driver. It is FALSE if it
identifies an ODBC function not
supported by the driver or does not
identify an ODBC function.
Note that the fFunction value
SQL_API_ALL_FUNCTIONS was
added in ODBC 2.0.
If fFunction identifies a single ODBC
function, pfExists points to single
UWORD. pfExists is TRUE if the
specified function is supported by the
driver; otherwise, it is FALSE.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
401
SQLGetFunctions
Diagnostics
When SQLGetFunctions returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLGetFunctions and explains each
one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
402
SQLSTATE
Error
Description
01000
General warning
S1000
General error
S1001
Memory allocation
failure
S1010
Function sequence
error
S1095
SQLGetFunctions
Comments
SQLGetFunctions always returns that SQLGetFunctions, SQLDataSources, and
SQLDrivers are supported. It does this because these functions are implemented in the
Driver Manager.
The following list identifies valid values for fFunction for ODBC core functions:
SQL_API_SQLALLOCCONNECT
SQL_API_SQLFETCH
SQL_API_SQLALLOCENV
SQL_API_SQLFREECONNECT
SQL_API_SQLALLOCSTMT
SQL_API_SQLFREEENV
SQL_API_SQLBINDCOL
SQL_API_SQLFREESTMT
SQL_API_SQLCANCEL
SQL_API_SQLGETCURSORNAME
SQL_API_SQLCOLATTRIBUTES
SQL_API_SQLNUMRESULTCOLS
SQL_API_SQLCONNECT
SQL_API_SQLPREPARE
SQL_API_SQLDESCRIBECOL
SQL_API_SQLROWCOUNT
SQL_API_SQLDISCONNECT
SQL_API_SQLSETCURSORNAME
SQL_API_SQLERROR
SQL_API_SQLSETPARAM
SQL_API_SQLEXECDIRECT
SQL_API_SQLTRANSACT
SQL_API_SQLEXECUTE
403
SQLGetFunctions
SQL_API_SQLBINDPARAMETER
SQL_API_SQLGETTYPEINFO
SQL_API_SQLCOLUMNS
SQL_API_SQLPARAMDATA
SQL_API_SQLDRIVERCONNECT
SQL_API_SQLPUTDATA
SQL_API_SQLGETCONNECTOPTION
SQL_API_SQLSETCONNECTOPTION
SQL_API_SQLGETDATA
SQL_API_SQLSETSTMTOPTION
SQL_API_SQLGETFUNCTIONS
SQL_API_SQLSPECIALCOLUMNS
SQL_API_SQLGETINFO
SQL_API_SQLSTATISTICS
SQL_API_SQLGETSTMTOPTION
SQL_API_SQLTABLES
The following list identifies valid values for fFunction for ODBC extension level 2 functions:
404
SQL_API_SQLBROWSECONNECT
SQL_API_SQLNUMPARAMS
SQL_API_SQLCOLUMNPRIVILEGES
SQL_API_SQLPARAMOPTIONS
SQLGetFunctions
SQL_API_SQLDATASOURCES
SQL_API_SQLPRIMARYKEYS
SQL_API_SQLDESCRIBEPARAM
SQL_API_SQLPROCEDURECOLUMNS
SQL_API_SQLDRIVERS
SQL_API_SQLPROCEDURES
SQL_API_SQLEXTENDEDFETCH
SQL_API_SQLSETPOS
SQL_API_SQLFOREIGNKEYS
SQL_API_SQLSETSCROLLOPTIONS
SQL_API_SQLMORERESULTS
SQL_API_SQLTABLEPRIVILEGES
SQL_API_SQLNATIVESQL
Code Example
The following two examples show how an application uses SQLGetFunctions to
determine if a driver supports SQLTables, SQLColumns, and SQLStatistics. If the
driver does not support these functions, the application disconnects from the driver. The
first example calls SQLGetFunctions once for each function.
UWORD TablesExists, ColumnsExists, StatisticsExists;
SQLGetFunctions(hdbc, SQL_API_SQLTABLES, &TablesExists);
SQLGetFunctions(hdbc, SQL_API_SQLCOLUMNS, &ColumnsExists);
SQLGetFunctions(hdbc, SQL_API_SQLSTATISTICS, &StatisticsExists);
if (TablesExists && ColumnsExists && StatisticsExists) {
/* Continue with application */
}
SQLDisconnect(hdbc);
405
SQLGetFunctions
The second example calls SQLGetFunctions a single time and passes it an array in
which SQLGetFunctions returns information about all ODBC functions.
UWORD fExists[100];
SQLGetFunctions(hdbc, SQL_API_ALL_FUNCTIONS, fExists);
if (fExists[SQL_API_SQLTABLES] &&
fExists[SQL_API_SQLCOLUMNS] &&
fExists[SQL_API_SQLSTATISTICS]) {
/* Continue with application */
}
SQLDisconnect(hdbc);
Related Functions
For information about
See
SQLGetInfo (extension)
406
SQLGetInfo
SQLGetInfo
Extension Level 1
SQLGetInfo returns general information about the driver and data source associated
with an hdbc.
Syntax
RETCODE SQLGetInfo(hdbc, fInfoType, rgbInfoValue, cbInfoValueMax, pcbInfoValue)
The SQLGetInfo function accepts the following arguments.
Type
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
UWORD
fInfoType
Input
PTR
rgbInfoValue
Output
407
SQLGetInfo
Type
Argument
Use
Description
SWORD
cbInfoValueMax
Input
SWORD
FAR *
pcbInfoValue
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLGetInfo returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLGetInfo and explains each one
408
SQLGetInfo
in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
08003
Connection not
open
22003
IM001
S1000
General error
S1001
Memory allocation
failure
409
SQLGetInfo
SQLSTATE
Error
Description
S1009
Invalid argument
value
S1090
Invalid string or
buffer length
S1096
Information type
out of range
S1C00
S1T00
Timeout expired
Comments
The currently defined information types are shown below; it is expected that more will
be defined to take advantage of different data sources. Information types from 0 to 999
are reserved by ODBC; driver developers must reserve values greater than or equal to
SQL_INFO_DRIVER_START for driver-specific use. For more information, see DriverSpecific Data Types, Descriptor Types, Information Types, and Options in Chapter 11,
Guidelines for Implementing ODBC Functions.
The format of the information returned in rgbInfoValue depends on the fInfoType
requested. SQLGetInfo will return information in one of five different formats:
410
A 32-bit bitmask,
SQLGetInfo
The format of each of the following information types is noted in the types description.
The application must cast the value returned in rgbInfoValue accordingly. For an example
of how an application could retrieve data from a 32-bit bitmask, see Code Example.
A driver must return a value for each of the information types defined in the following
tables. If an information type does not apply to the driver or data source, then the driver
returns one of the following values:
Format of rgbInfoValue
Returned value
Character string (Y or N)
Empty string
16-bit integer
0L
For example, if a data source does not support procedures, SQLGetInfo returns the following values for the values of fInfoType that are related to procedures:
fInfoType
Returned value
SQL_PROCEDURES
SQL_ACCESSIBLE_PROCEDURES
SQL_MAX_PROCEDURE_NAME_LEN
SQL_PROCEDURE_TERM
Empty string
SQLGetInfo returns SQLSTATE S1096 (Invalid argument value) for values of fInfoType
that are in the range of information types reserved for use by ODBC but are not defined
by the version of ODBC supported by the driver. To determine what version of ODBC a
driver conforms to, an application calls SQLGetInfo with the
411
SQLGetInfo
Information Types
This section lists the information types supported by SQLGetInfo. Information types
are grouped categorically and listed alphabetically.
Driver Information
The following values of fInfoType return information about the ODBC driver, such as the
number of active statements, the data source name, and the API conformance levels.
412
SQL_ACTIVE_CONNECTIONS
SQL_ACTIVE_STATEMENTS
SQL_DATA_SOURCE_NAME
SQL_DRIVER_HDBC
SQL_DRIVER_HENV
SQL_DRIVER_HLIB
SQL_DRIVER_HSTMT
SQL_DRIVER_NAME
SQL_DRIVER_ODBC_VER
SQL_DRIVER_VER
SQL_FETCH_DIRECTION
SQL_FILE_USAGE
SQL_GETDATA_EXTENSIONS
SQL_LOCK_TYPES
SQL_ODBC_API_CONFORMANCE
SQL_ODBC_SAG_CLI_CONFORMANCE
SQLGetInfo
SQL_ODBC_VER
SQL_POS_OPERATIONS
SQL_ROW_UPDATES
SQL_SEARCH_PATTERN_ESCAPE
SQL_SERVER_NAME
SQL_DATABASE_NAME
SQL_DBMS_NAME
SQL_DBMS_VER
SQL_ACCESSIBLE_PROCEDURES
SQL_ACCESSIBLE_TABLES
SQL_BOOKMARK_PERSISTENCE
SQL_CONCAT_NULL_BEHAVIOR
SQL_CURSOR_COMMIT_BEHAVIOR
SQL_CURSOR_ROLLBACK_BEHAVIOR
SQL_DATA_SOURCE_READ_ONLY
SQL_DEFAULT_TXN_ISOLATION
SQL_MULT_RESULT_SETS
SQL_MULTIPLE_ACTIVE_TXN
SQL_NEED_LONG_DATA_LEN
SQL_NULL_COLLATION
SQL_OWNER_TERM
SQL_PROCEDURE_TERM
413
SQLGetInfo
SQL_QUALIFIER_TERM
SQL_SCROLL_CONCURRENCY
SQL_SCROLL_OPTIONS
SQL_STATIC_SENSITIVITY
SQL_TABLE_TERM
SQL_TXN_CAPABLE
SQL_TXN_ISOLATION_OPTION
SQL_USER_NAME
Supported SQL
The following values of fInfoType return information about the SQL statements supported by the data source. These information types do not exhaustively describe the
entire ODBC SQL grammar. Instead, they describe those parts of the grammar for which
data sources commonly offer different levels of support.
Applications should determine the general level of supported grammar from the
SQL_ODBC_SQL_CONFORMANCE information type and use the other information
types to determine variations from the stated conformance level.
414
SQL_ALTER_TABLE
SQL_COLUMN_ALIAS
SQL_CORRELATION_NAME
SQL_EXPRESSIONS_IN_ORDERBY
SQL_GROUP_BY
SQL_IDENTIFIER_CASE
SQL_IDENTIFIER_QUOTE_CHAR
SQL_KEYWORDS
SQL_LIKE_ESCAPE_CLAUSE
SQL_NON_NULLABLE_COLUMNS
SQL_ODBC_SQL_CONFORMANCE
SQL_ODBC_SQL_OPT_IEF
SQL_ORDER_BY_COLUMNS_IN_SELECT
SQL_OUTER_JOINS
SQLGetInfo
SQL_OWNER_USAGE
SQL_POSITIONED_STATEMENTS
SQL_PROCEDURES
SQL_QUALIFIER_LOCATION
SQL_QUALIFIER_NAME_SEPARATOR
SQL_QUALIFIER_USAGE
SQL_QUOTED_IDENTIFIER_CASE
SQL_SPECIAL_CHARACTERS
SQL_SUBQUERIES
SQL_UNION
SQL Limits
The following values of fInfoType return information about the limits applied to identifiers and clauses in SQL statements, such as the maximum lengths of identifiers and the
maximum number of columns in a select list. Limitations may be imposed by either the
driver or the data source.
SQL_MAX_BINARY_LITERAL_LEN
SQL_MAX_CHAR_LITERAL_LEN
SQL_MAX_COLUMN_NAME_LEN
SQL_MAX_COLUMNS_IN_GROUP_BY
SQL_MAX_COLUMNS_IN_ORDER_BY
SQL_MAX_COLUMNS_IN_INDEX
SQL_MAX_COLUMNS_IN_SELECT
SQL_MAX_COLUMNS_IN_TABLE
SQL_MAX_CURSOR_NAME_LEN
SQL_MAX_INDEX_SIZE
SQL_MAX_OWNER_NAME_LEN
SQL_MAX_PROCEDURE_NAME_LEN
SQL_MAX_QUALIFIER_NAME_LEN
SQL_MAX_ROW_SIZE
SQL_MAX_ROW_SIZE_INCLUDES_LONG
415
SQLGetInfo
SQL_MAX_STATEMENT_LEN
SQL_MAX_TABLE_NAME_LEN
SQL_MAX_TABLES_IN_SELECT
SQL_MAX_USER_NAME_LEN
SQL_CONVERT_FUNCTIONS
SQL_NUMERIC_FUNCTIONS
SQL_STRING_FUNCTIONS
SQL_SYSTEM_FUNCTIONS
SQL_TIMEDATE_ADD_INTERVALS
SQL_TIMEDATE_DIFF_INTERVALS
SQL_TIMEDATE_FUNCTIONS
Conversion Information
The following values of fInfoType return a list of the SQL data types to which the data
source can convert the specified SQL data type with the CONVERT scalar function.
416
SQL_CONVERT_BIGINT
SQL_CONVERT_BINARY
SQL_CONVERT_BIT
SQL_CONVERT_CHAR
SQL_CONVERT_DATE
SQL_CONVERT_DECIMAL
SQL_CONVERT_DOUBLE
SQL_CONVERT_FLOAT
SQL_CONVERT_INTEGER
SQL_CONVERT_LONGVARBINARY
SQL_CONVERT_LONGVARCHAR
SQLGetInfo
SQL_CONVERT_NUMERIC
SQL_CONVERT_REAL
SQL_CONVERT_SMALLINT
SQL_CONVERT_TIME
SQL_CONVERT_TIMESTAMP
SQL_CONVERT_TINYINT
SQL_CONVERT_VARBINARY
SQL_CONVERT_VARCHAR
Returns
SQL_ACCESSIBLE_PROCEDURES
(ODBC 1.0)
SQL_ACCESSIBLE_TABLES
(ODBC 1.0)
SQL_ACTIVE_CONNECTIONS
(ODBC 1.0)
SQL_ACTIVE_STATEMENTS
(ODBC 1.0)
417
SQLGetInfo
418
InfoType
Returns
SQL_ALTER_TABLE
(ODBC 2.0)
SQL_BOOKMARK_PERSISTENCE
(ODBC 2.0)
SQL_COLUMN_ALIAS
(ODBC 2.0)
SQLGetInfo
InfoType
Returns
SQL_CONCAT_NULL_BEHAVIOR
(ODBC 1.0)
419
SQLGetInfo
420
InfoType
Returns
SQL_CONVERT_BIGINT
SQL_CONVERT_BINARY
SQL_CONVERT_BIT
SQL_CONVERT_CHAR
SQL_CONVERT_DATE
SQL_CONVERT_DECIMAL
SQL_CONVERT_DOUBLE
SQL_CONVERT_FLOAT
SQL_CONVERT_INTEGER
SQL_CONVERT_LONGVARBINARY
SQL_CONVERT_LONGVARCHAR
SQL_CONVERT_NUMERIC
SQL_CONVERT_REAL
SQL_CONVERT_SMALLINT
SQL_CONVERT_TIME
SQL_CONVERT_TIMESTAMP
SQL_CONVERT_TINYINT
SQL_CONVERT_VARBINARY
SQL_CONVERT_VARCHAR
(ODBC 1.0)
SQL_CONVERT_FUNCTIONS
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_CORRELATION_NAME
(ODBC 1.0)
SQL_CURSOR_COMMIT_
BEHAVIOR
(ODBC 1.0)
421
SQLGetInfo
422
InfoType
Returns
SQL_CURSOR_ROLLBACK_
BEHAVIOR
(ODBC 1.0)
SQL_DATA_SOURCE_NAME
(ODBC 1.0)
SQL_DATA_SOURCE_READ_ONLY
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_DATABASE_NAME
(ODBC 1.0)
SQL_DBMS_NAME
(ODBC 1.0)
SQL_DBMS_VER
(ODBC 1.0)
423
SQLGetInfo
424
InfoType
Returns
SQL_DEFAULT_TXN_ISOLATION
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_DRIVER_HDBC
SQL_DRIVER_HENV
(ODBC 1.0)
SQL_DRIVER_HLIB
(ODBC 2.0)
SQL_DRIVER_HSTMT
(ODBC 1.0)
SQL_DRIVER_NAME
(ODBC 1.0)
SQL_DRIVER_ODBC_VER
(ODBC 2.0)
425
SQLGetInfo
426
InfoType
Returns
SQL_DRIVER_VER
(ODBC 1.0)
SQL_EXPRESSIONS_IN_ORDERBY
(ODBC 1.0)
SQL_FETCH_DIRECTION
(ODBC 1.0)
The information type was introduced
in ODBC 1.0; each bitmask is labeled
with the version in which it was
introduced.
SQL_FILE_USAGE
(ODBC 2.0)
A 16-bit integer value indicating how a singletier driver directly treats files in a data source:
SQL_FILE_NOT_SUPPORTED = The driver
is not a single-tier driver.
SQL_FILE_TABLE = A single-tier driver treats
files in a data source as tables. For example, a
Text driver treats each Text file as a table.
SQL_FILE_QUALIFIER = A single-tier driver
treats files in a data source as a qualifier.
SQLGetInfo
InfoType
Returns
SQL_GETDATA_EXTENSIONS
(ODBC 2.0)
427
SQLGetInfo
428
InfoType
Returns
SQL_GROUP_BY
(ODBC 2.0)
SQL_IDENTIFIER_CASE
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_IDENTIFIER_QUOTE_CHAR
(ODBC 1.0)
SQL_KEYWORDS
(ODBC 2.0)
SQL_LIKE_ESCAPE_CLAUSE
(ODBC 2.0)
SQL_LOCK_TYPES
(ODBC 2.0)
429
SQLGetInfo
InfoType
Returns
SQL_MAX_BINARY_LITERAL_LEN
(ODBC 2.0)
SQL_MAX_CHAR_LITERAL_LEN
(ODBC 2.0)
SQL_MAX_COLUMN_NAME_LEN
(ODBC 1.0)
430
SQL_MAX_COLUMNS_IN_INDEX
(ODBC 2.0)
SQL_MAX_COLUMNS_IN_ORDER_
BY
(ODBC 2.0)
SQLGetInfo
InfoType
Returns
SQL_MAX_COLUMNS_IN_SELECT
(ODBC 2.0)
SQL_MAX_COLUMNS_IN_TABLE
(ODBC 2.0)
SQL_MAX_CURSOR_NAME_LEN
(ODBC 1.0)
SQL_MAX_INDEX_SIZE
(ODBC 2.0)
SQL_MAX_OWNER_NAME_LEN
(ODBC 1.0)
SQL_MAX_PROCEDURE_NAME_
LEN
(ODBC 1.0)
SQL_MAX_QUALIFIER_NAME_
LEN
(ODBC 1.0)
SQL_MAX_ROW_SIZE
(ODBC 2.0)
431
SQLGetInfo
432
InfoType
Returns
SQL_MAX_ROW_SIZE_INCLUDES_
LONG
(ODBC 2.0)
SQL_MAX_STATEMENT_LEN
(ODBC 2.0)
SQL_MAX_TABLE_NAME_LEN
(ODBC 1.0)
SQL_MAX_TABLES_IN_SELECT
(ODBC 2.0)
SQL_MAX_USER_NAME_LEN
(ODBC 2.0)
SQL_MULT_RESULT_SETS
(ODBC 1.0)
SQL_MULTIPLE_ACTIVE_TXN
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_NEED_LONG_DATA_LEN
(ODBC 2.0)
SQL_NON_NULLABLE_COLUMNS
(ODBC 1.0)
SQL_NULL_COLLATION
(ODBC 2.0)
433
SQLGetInfo
434
InfoType
Returns
SQL_NUMERIC_FUNCTIONS
(ODBC 1.0)
The information type was introduced
in ODBC 1.0; each bitmask is labeled
with the version in which it was
introduced.
SQL_ODBC_API_CONFORMANCE
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_ODBC_SAG_CLI_
CONFORMANCE
(ODBC 1.0)
SQL_ODBC_SQL_CONFORMANCE
(ODBC 1.0)
SQL_ODBC_SQL_OPT_IEF
(ODBC 1.0)
SQL_ODBC_VER
(ODBC 1.0)
SQL_ORDER_BY_COLUMNS_IN_
SELECT
(ODBC 2.0)
435
SQLGetInfo
436
InfoType
Returns
SQL_OUTER_JOINS
(ODBC 1.0)
The information type was introduced
in ODBC 1.0; each return value is
labeled with the version in which it
was introduced.
A character string:
N = No. The data source does not support
outer joins. (ODBC 1.0)
Y = Yes. The data source supports two-table
outer joins, and the driver supports the ODBC
outer join syntax except for nested outer joins.
However, columns on the left side of the
comparison operator in the ON clause must
come from the left-hand table in the outer join,
and columns on the right side of the
comparison operator must come from the
right-hand table. (ODBC 1.0)
P = Partial. The data source partially
supports nested outer joins, and the driver
supports the ODBC outer join syntax.
However, columns on the left side of the
comparison operator in the ON clause must
come from the left-hand table in the outer join
and columns on the right side of the
comparison operator must come from the
right-hand table. Also, the right-hand table of
an outer join cannot be included in an inner
join. (ODBC 2.0)
F = Full. The data source fully supports
nested outer joins, and the driver supports the
ODBC outer join syntax. (ODBC 2.0)
SQL_OWNER_TERM
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_OWNER_USAGE
(ODBC 2.0)
SQL_POS_OPERATIONS
(ODBC 2.0)
SQL_POSITIONED_STATEMENTS
(ODBC 2.0)
437
SQLGetInfo
438
InfoType
Returns
SQL_PROCEDURE_TERM
(ODBC 1.0)
SQL_PROCEDURES
(ODBC 1.0)
SQL_QUALIFIER_LOCATION
(ODBC 2.0)
SQL_QUALIFIER_NAME_SEPARAT
OR
(ODBC 1.0)
SQL_QUALIFIER_TERM
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_QUALIFIER_USAGE
(ODBC 2.0)
SQL_QUOTED_IDENTIFIER_CASE
(ODBC 2.0)
439
SQLGetInfo
440
InfoType
Returns
SQL_ROW_UPDATES
(ODBC 1.0)
SQL_SCROLL_CONCURRENCY
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_SCROLL_OPTIONS
(ODBC 1.0)
The information type was introduced
in ODBC 1.0; each bitmask is labeled
with the version in which it was
introduced.
SQL_SEARCH_PATTERN_ESCAPE
(ODBC 1.0)
SQL_SERVER_NAME
(ODBC 1.0)
441
SQLGetInfo
442
InfoType
Returns
SQL_SPECIAL_CHARACTERS
(ODBC 2.0)
SQL_STATIC_SENSITIVITY
(ODBC 2.0)
SQLGetInfo
InfoType
Returns
SQL_STRING_FUNCTIONS
(ODBC 1.0)
443
SQLGetInfo
InfoType
Returns
SQL_SUBQUERIES
(ODBC 2.0)
444
SQL_SYSTEM_FUNCTIONS
(ODBC 1.0)
SQL_TABLE_TERM
(ODBC 1.0)
SQL_TIMEDATE_ADD_INTERVALS
(ODBC 2.0)
SQLGetInfo
InfoType
Returns
SQL_TIMEDATE_DIFF_INTERVALS
(ODBC 2.0)
SQL_TIMEDATE_FUNCTIONS
(ODBC 1.0)
The information type was introduced
in ODBC 1.0; each bitmask is labeled
with the version in which it was
introduced.
445
SQLGetInfo
446
InfoType
Returns
SQL_TXN_CAPABLE
(ODBC 1.0)The information type was
introduced in ODBC 1.0; each return
value is labeled with the version in
which it was introduced
SQL_TXN_ISOLATION_OPTION
(ODBC 1.0)
SQLGetInfo
InfoType
Returns
SQL_UNION
(ODBC 2.0)
SQL_USER_NAME
(ODBC 1.0)
Code Example
SQLGetInfo returns lists of supported options as a 32-bit bitmask in rgbInfoValue. The
bitmask for each option is used in conjunction with the flag to determine whether the
option is supported.
For example, an application could use the following code to determine whether the SUBSTRING scalar function is supported by the driver associated with the hdbc:
UDWORD fFuncs;
SQLGetInfo(hdbc,
SQL_STRING_FUNCTIONS,
(PTR)&fFuncs,
sizeof(fFuncs),
NULL);
if (fFuncs & SQL_FN_STR_SUBSTRING) /* SUBSTRING supported */
...;
else
/* SUBSTRING not supported */
...;
447
SQLGetStmtOption
Related Functions
For information about
See
SQLGetStmtOption (extension)
SQLGetTypeInfo (extension)
SQLGetStmtOption
Extension Level 1
SQLGetStmtOption returns the current setting of a statement option.
Syntax
RETCODE SQLGetStmtOption(hstmt, fOption, pvParam)
The SQLGetStmtOption function accepts the following arguments:
448
Type
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UWORD
fOption
Input
Option to retrieve.
PTR
pvParam
Output
SQLGetStmtOption
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLGetStmtOption returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLGetStmtOption and explains
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
24000
IM001
S1000
General error
S1001
Memory allocation
failure
449
SQLGetStmtOption
SQLSTATE
Error
Description
S1010
Function sequence
error
S1011
Operation invalid
at this time
S1092
S1109
Invalid cursor
position
S1C00
Comments
The following table lists statement options for which corresponding values can be
returned, but not set. The table also lists the version of ODBC in which they were introduced. For a list of options that can be set and retrieved, see SQLSetStmtOption. If fOp-
450
SQLGetStmtOption
tion specifies an option that returns a string, pvParam must be a pointer to storage for the
string. The maximum length of the string will be
SQL_MAX_OPTION_STRING_LENGTH bytes (excluding the null termination byte).
fOption
pvParam contents
SQL_GET_BOOKMARK
(ODBC 2.0)
SQL_ROW_NUMBER
(ODBC 2.0)
Related Functions
For information about
See
SQLSetConnectOption (extension)
SQLSetStmtOption (extension)
451
SQLGetTypeInfo
SQLGetTypeInfo
Extension Level 1
SQLGetTypeInfo returns information about data types supported by the data source.
The driver returns the information in the form of an SQL result set.
Important: Applications must use the type names returned in the TYPE_NAME
column in ALTER TABLE and CREATE TABLE statements; they must not use the
sample type names listed in Appendix C, SQL Grammar. SQLGetTypeInfo
may return more than one row with the same value in the DATA_TYPE column.
Syntax
RETCODE SQLGetTypeInfo(hstmt, fSqlType)
452
SQLGetTypeInfo
:
Type
Argument
Use
Description
HSTMT
hstmt
Input
SWORD
fSqlType
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
453
SQLGetTypeInfo
Diagnostics
When SQLGetTypeInfo returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLGetTypeInfo and explains each
one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
454
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had not been
called.
A result set was open on the hstmt but
SQLFetch or SQLExtendedFetch had not been
called.
IM001
S1000
General error
S1001
Memory allocation
failure
SQLGetTypeInfo
SQLSTATE
Error
Description
S1004
S1008
Operation
canceled
S1010
Function sequence
error
S1C00
S1T00
Timeout expired
455
SQLGetTypeInfo
Comments
SQLGetTypeInfo returns the results as a standard result set, ordered by DATA_TYPE
and TYPE_NAME. The following table lists the columns in the result set.
Important: SQLGetTypeInfo might not return all data types. For example, a driver might not
return user-defined data types. Applications can use any valid data type, regardless of whether it
is returned by SQLGetTypeInfo.
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source.
456
Column Name
Data Type
Comments
TYPE_NAME
Varchar(128)
not NULL
DATA_TYPE
Smallint
not NULL
PRECISION
Integer
LITERAL_PREFIX
Varchar(128)
SQLGetTypeInfo
Column Name
Data Type
Comments
LITERAL_SUFFIX
Varchar(128)
CREATE_PARAMS
Varchar(128)
NULLABLE
Smallint
not NULL
CASE_SENSITIVE
Smallint
not NULL
457
SQLGetTypeInfo
458
Column Name
Data Type
Comments
SEARCHABLE
Smallint
not NULL
UNSIGNED_ATTRIBUTE
Smallint
MONEY
Smallint
not NULL
AUTO_INCREMENT
Smallint
SQLGetTypeInfo
Column Name
Data Type
Comments
LOCAL_TYPE_NAME
Varchar(128)
MINIMUM_SCALE
Smallint
MAXIMUM_SCALE
Smallint
459
SQLGetTypeInfo
Attribute information can apply to data types or to specific columns in a result set.
SQLGetTypeInfo returns information about attributes associated with data types; SQLColAttributes returns information about attributes associated with columns in a result
set.Related Functions
460
See
SQLBindCol
SQLCancel
SQLColAttributes
SQLExtendedFetch (extension)
SQLFetch
SQLGetInfo (extension)
SQLMoreResults
SQLMoreResults
Extension Level 2
SQLMoreResults determines whether there are more results available on an hstmt containing SELECT, UPDATE, INSERT, or DELETE statements and, if so, initializes processing for those results.
Syntax
RETCODE SQLMoreResults(hstmt)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_NO_DATA_FOUND, SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLMoreResults returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLMoreResults and explains each one
461
SQLMoreResults
in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
462
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
SQLMoreResults
SQLSTATE
Error
Description
S1010
Function sequence
error
S1T00
Timeout expired
Comments
SELECT statements return result sets. UPDATE, INSERT, and DELETE statements
return a count of affected rows. If any of these statements are batched, submitted with
arrays of parameters, or in procedures, they can return multiple result sets or counts.
If another result set or count is available, SQLMoreResults returns SQL_SUCCESS and
initializes the result set or count for additional processing. After calling SQLMoreResults for SELECT statements, an application can call functions to determine the characteristics of the result set and to retrieve data from the result set. After calling
SQLMoreResults for UPDATE, INSERT, or DELETE statements, an application can call
SQLRowCount.
If all results have been processed, SQLMoreResults returns SQL_NO_DATA_FOUND.
Note that if there is a current result set with unfetched rows, SQLMoreResults discards
that result set and makes the next result set or count available.
If a batch of statements or a procedure mixes other SQL statements with SELECT,
UPDATE, INSERT, and DELETE statements, these other statements do not affect SQLMoreResults.
For additional information about the valid sequencing of result-processing functions, see
Appendix B, ODBC State Transition Tables.
463
SQLNativeSql
Related Functions
C 1.0
For information about
See
SQLCancel
SQLExtendedFetch (extension)
SQLFetch
SQLGetData (extension)
SQLNativeSql
Extension Level 2
SQLNativeSql returns the SQL string as translated by the driver.
Syntax
RETCODE SQLNativeSql(hdbc, szSqlStrIn, cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr)
464
Type
Argument
Use
Description
HDBC
hdbc
Input
Connection handle.
UCHAR FAR *
szSqlStrIn
Input
SDWORD
cbSqlStrIn
Input
UCHAR FAR *
szSqlStr
Output
SQLNativeSql
Type
Argument
Use
Description
SDWORD
cbSqlStrMax
Input
SDWORD FAR
*
pcbSqlStr
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLNativeSql returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLNativeSql and explains each one
in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
465
SQLNativeSql
466
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
08003
Connection not
open
37000
Syntax error or
access violation
IM001
S1000
General error
S1001
Memory allocation
failure
S1009
Invalid argument
value
S1090
Invalid string or
buffer length
SQLNumParams
Comments
The following are examples of what SQLNativeSql might return for the following input
SQL string containing the scalar function CONVERT. Assume that the column empid is
of type INTEGER in the data source:
SELECT { fn CONVERT (empid, SQL_SMALLINT) } FROM employee
A driver for SQL Server might return the following translated SQL string:
SELECT convert (smallint, empid) FROM employee
A driver for ORACLE Server might return the following translated SQL string:
SELECT to_number (empid) FROM employee
A driver for Ingres might return the following translated SQL string:
SELECT int2 (empid) FROM employee
Related Functions
None.
SQLNumParams
Extension Level 2
SQLNumParams returns the number of parameters in an SQL statement.
Syntax
RETCODE SQLNumParams(hstmt, pcpar)
467
SQLNumParams
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
SWORD FAR *
pcpar
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLNumParams returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLNumParams and explains each
one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
468
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
SQLNumParams
SQLSTATE
Error
Description
S1001
Memory allocation
failure
S1008
Operation
canceled
S1010
Function sequence
error
S1T00
Timeout expired
Comments
SQLNumParams can only be called after SQLPrepare has been called.
If the statement associated with hstmt does not contain parameters, SQLNumParams
sets pcpar to 0.
469
SQLNumResultCols
Related Functions
For information about
See
SQLDescribeParam (extension)
SQLBindParameter
SQLNumResultCols
Core
SQLNumResultCols returns the number of columns in a result set.
Syntax
RETCODE SQLNumResultCols(hstmt, pccol)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
SWORD FAR *
pccol
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
470
SQLNumResultCols
Diagnostics
When SQLNumResultCols returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLNumResultCols and explains
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
471
SQLNumResultCols
SQLSTATE
Error
Description
S1010
Function sequence
error
S1T00
Timeout expired
Comments
SQLNumResultCols can be called successfully only when the hstmt is in the prepared,
executed, or positioned state.
If the statement associated with hstmt does not return columns, SQLNumResultCols
sets pccol to 0.
472
SQLParamData
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLColAttributes
SQLDescribeCol
SQLExtendedFetch (extension)
SQLFetch
SQLGetData (extension)
SQLSetScrollOptions (extension)
SQLParamData
Extension Level 1
SQLParamData is used in conjunction with SQLPutData to supply parameter data at
statement execution time.
Syntax
RETCODE SQLParamData(hstmt, prgbValue)
473
SQLParamData
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
PTR FAR *
prgbValue
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA,
SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLParamData returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLParamData and explains each one in
the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
474
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
SQLParamData
SQLSTATE
Error
Description
22026
The SQL_NEED_LONG_DATA_LEN
information type in SQLGetInfo was Y and
less data was sent for a long parameter (the
data type was SQL_LONGVARCHAR,
SQL_LONGVARBINARY, or a long, data
sourcespecific data type) than was specified
with the pcbValue argument in
SQLBindParameter.
The SQL_NEED_LONG_DATA_LEN
information type in SQLGetInfo was Y and
less data was sent for a long column (the data
type was SQL_LONGVARCHAR,
SQL_LONGVARBINARY, or a long, data
sourcespecific data type) than was specified
in the length buffer corresponding to a column
in a row of data that was added or updated
with SQLSetPos.
IM001
S1000
General error
S1001
Memory allocation
failure
475
SQLParamData
SQLSTATE
Error
Description
S1008
Operation
canceled
S1010
Function sequence
error
S1T00
Timeout expired
476
SQLParamOptions
Comments
For an explanation of how data-at-execution parameter data is passed at statement
execution time, see Passing Parameter Values in SQLBindParameter. For an
explanation of how data-at-execution column data is updated or added, see Using
SQLSetPos in SQLSetPos.
Code Example
See SQLPutData.
Related Functions
For information about
See
SQLCancel
SQLDescribeParam (extension)
SQLExecDirect
SQLExecute
SQLPutData (extension)
SQLBindParameter
SQLParamOptions
Extension Level 2
SQLParamOptions allows an application to specify multiple values for the set of parameters assigned by SQLBindParameter. The ability to specify multiple values for a set of
parameters is useful for bulk inserts and other work that requires the data source to process the same SQL statement multiple times with various parameter values. An applica-
477
SQLParamOptions
tion can, for example, specify three sets of values for the set of parameters associated
with an INSERT statement, and then execute the INSERT statement once to perform the
three insert operations.
Syntax
RETCODE SQLParamOptions(hstmt, crow, pirow)
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLROWSETSIZE
crow
Input
SQLROWSETSIZE*
pirow
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLParamOptions returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLParamOptions and explains
478
SQLParamOptions
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
S1001
Memory allocation
failure
S1010
Function sequence
error
S1107
Comments
As a statement executes, the driver sets pirow to the number of the current row of parameter values; the first row is row number 1. The contents of pirow can be used as follows:
479
SQLParamOptions
When SQLParamData returns SQL_NEED_DATA for data-at-execution parameters, the application can access the value in pirow to determine which row of
parameters is being executed.
Code Example
In the following example, an application specifies an array of parameter values with
SQLBindParameter and SQLParamOptions. It then inserts those values into a table
with a single INSERT statement and checks for any errors. If the first row fails, the application rolls back all changes. If any other row fails, the application commits the transaction, skips the failed row, rebinds the remaining parameters, and continues processing.
(Note that irow is 1-based and szData[ ] is 0-based, so the irow entry of szData[ ] is
skipped by rebinding at szData[irow].)
#define CITY_LEN 256
SQLLEN cbValue[ ] = {SQL_NTS, SQL_NTS, SQL_NTS, SQL_NTS, SQL_NTS};
UCHAR szData[ ][CITY_LEN] = {"Boston","New York","Keokuk","Seattle",
"Eugene"};
SQLROWSETSIZE irow;
SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, 0);
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_DEFAULT, SQL_CHAR,
CITY_LEN, 0, szData, 0, cbValue);
SQLPrepare(hstmt, "INSERT INTO CITIES VALUES (?)", SQL_NTS);
SQLParamOptions(hstmt, 5, &irow);
while (TRUE) {
retcode = SQLExecute(hstmt);
/* Done if execution was successful */
if (retcode != SQL_ERROR) {
break;
}
/* On an error, print the error. If the error is in row 1, roll */
/* back the transaction and quit. If the error is in another */
/* row, commit the transaction and, unless the error is in the */
/* last row, rebind to the next row and continue processing. */
show_error();
if (irow == 1) {
SQLTransact(henv, hstmt, SQL_ROLLBACK);
480
SQLPrepare
break;
} else {
SQLTransact(henv, hstmt, SQL_COMMIT);
if (irow == 5) {
break;
} else {
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,
SQL_C_DEFAULT, SQL_CHAR, CITY_LEN, 0,
szData[irow], 0, &cbValue[irow]);
SQLParamOptions(hstmt, 5-irow, &irow);
}
}
}
Related Functions
For information about
See
SQLDescribeParam (extension)
SQLBindParameter
SQLPrepare
Core
SQLPrepare prepares an SQL string for execution.
Syntax
RETCODE SQLPrepare(hstmt, szSqlStr, cbSqlStr)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
481
SQLPrepare
Type
Argument
Use
Description
UCHAR FAR *
szSqlStr
Input
SDWORD
cbSqlStr
Input
Length of szSqlStr.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLPrepare returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLPrepare and explains each one
in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
482
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
21S01
21S02
Degree of derived
table does not
match column list
SQLPrepare
SQLSTATE
Error
Description
22005
Error in
assignment
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
34000
Invalid cursor
name
37000
Syntax error or
access violation
42000
Syntax error or
access violation
IM001
S0001
483
SQLPrepare
484
SQLSTATE
Error
Description
S0002
S0011
Index already
exists
S0012
S0021
Column already
exists
SQLPrepare
SQLSTATE
Error
Description
S0022
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
S1009
Invalid argument
value
485
SQLPrepare
SQLSTATE
Error
Description
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1T00
Timeout expired
Comments
The application calls SQLPrepare to send an SQL statement to the data source for preparation. The application can include one or more parameter markers in the SQL statement. To include a parameter marker, the application embeds a question mark (?) into
the SQL string at the appropriate position.
Tip: If an application uses SQLPrepare to prepare and SQLExecute to submit a COMMIT or
ROLLBACK statement, it will not be interoperable between DBMS products. To commit or roll
back a transaction, call SQLTransact.
The driver modifies the statement to use the form of SQL used by the data source, then
submits it to the data source for preparation. In particular, the driver modifies the escape
clauses used to define ODBC-specific SQL. (For a description of SQL statement grammar, see Supporting ODBC Extensions to SQL in Chapter 14, Processing an SQL
Statement, and Appendix C, SQL Grammar.) For the driver, an hstmt is similar to a
statement identifier in embedded SQL code. If the data source supports statement identifiers, the driver can send a statement identifier and parameter values to the data
source.
Once a statement is prepared, the application uses hstmt to refer to the statement in later
function calls. The prepared statement associated with the hstmt may be reexecuted by
calling SQLExecute until the application frees the hstmt with a call to SQLFreeStmt with
486
SQLPrepare
the SQL_DROP option or until the hstmt is used in a call to SQLPrepare, SQLExecDirect,
or one of the catalog functions (SQLColumns, SQLTables, and so on). Once the application prepares a statement, it can request information about the format of the result set.
Some drivers cannot return syntax errors or access violations when the application calls
SQLPrepare. A driver may handle syntax errors and access violations, only syntax
errors, or neither syntax errors nor access violations. Therefore, an application must be
able to handle these conditions when calling subsequent related functions such as
SQLNumResultCols, SQLDescribeCol, SQLColAttributes, and SQLExecute.
Depending on the capabilities of the driver and data source and on whether the application has called SQLBindParameter, parameter information (such as data types) might be
checked when the statement is prepared or when it is executed. For maximum interoperability, an application should unbind all parameters that applied to an old SQL statement before preparing a new SQL statement on the same hstmt. This prevents errors that
are due to old parameter information being applied to the new statement.
Warning: Committing or rolling back a transaction, either by calling SQLTransact
or by using the SQL_AUTOCOMMIT connection option, can cause the data
source to delete the access plans for all hstmts on an hdbc. For more information, see
the SQL_CURSOR_COMMIT_BEHAVIOR and
SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
Code Example
See SQLBindParameter, SQLParamOptions, SQLPutData, and SQLSetPos.
Related Functions
ODBC 1.0
For information about
See
SQLAllocStmt
SQLBindCol
SQLCancel
SQLExecDirect
487
SQLPrimaryKeys
See
SQLExecute
SQLRowCount
SQLSetCursorName
SQLBindParameter
SQLTransact
SQLPrimaryKeys
Extension Level 2
SQLPrimaryKeys returns the column names that comprise the primary key for a table.
The driver returns the information as a result set. This function does not support returning primary keys from multiple tables in a single call.
Syntax
RETCODE SQLPrimaryKeys(hstmt, szTableQualifier, cbTableQualifier, szTableOwner,
cbTableOwner, szTableName, cbTableName)
488
Type
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szTableQualifier
Input
SQLPrimaryKeys
Type
Argument
Use
Description
SWORD
cbTableQualifier
Input
Length of szTableQualifier.
UCHAR FAR *
szTableOwner
Input
SWORD
cbTableOwner
Input
Length of szTableOwner.
UCHAR FAR *
szTableName
Input
Table name.
SWORD
cbTableName
Input
Length of szTableName.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLPrimaryKeys returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLPrimaryKeys and explains each one
489
SQLPrimaryKeys
in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
490
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
SQLPrimaryKeys
SQLSTATE
Error
Description
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1C00
S1T00
Timeout expired
Comments
SQLPrimaryKeys returns the results as a standard result set, ordered by
TABLE_QUALIFIER, TABLE_OWNER, TABLE_NAME, and KEY_SEQ. The following
table lists the columns in the result set.
Important: SQLPrimaryKeys might not return all primary keys. For example, a Paradox driver
might only return primary keys for files (tables) in the current directory.
491
SQLPrimaryKeys
.The lengths of VARCHAR columns shown in the table are maximums; the actual
lengths depend on the data source. To determine the actual lengths of the
TABLE_QUALIFIER, TABLE_OWNER, TABLE_NAME, and COLUMN_NAME columns, call SQLGetInfo with the SQL_MAX_QUALIFIER_NAME_LEN,
SQL_MAX_OWNER_NAME_LEN, SQL_MAX_TABLE_NAME_LEN, and
SQL_MAX_COLUMN_NAME_LEN options.
Column Name
Data Type
Comments
TABLE_QUALIFIER
Varchar(128)
TABLE_OWNER
Varchar(128)
TABLE_NAME
Varchar(128)
not NULL
COLUMN_NAME
Varchar(128)
not NULL
KEY_SEQ
Smallint
not NULL
PK_NAME
Varchar(128)
Important: The PK_NAME column was added in ODBC 2.0. ODBC 1.0 drivers may return a
different, driver-specific column with the same column number.
Code Example
See SQLForeignKeys.
492
SQLProcedureColumns
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExtendedFetch (extension)
SQLFetch
SQLForeignKeys (extension)
SQLStatistics (extension)
SQLProcedureColumns
Extension Level 2
SQLProcedureColumns returns the list of input and output parameters, as well as the
columns that make up the result set for the specified procedures. The driver returns the
information as a result set on the specified hstmt.
Syntax
RETCODE SQLProcedureColumns(hstmt, szProcQualifier, cbProcQualifier, szProcOwner,
cbProcOwner, szProcName, cbProcName, szColumnName, cbColumnName)
493
SQLProcedureColumns
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szProcQualifier
Input
SWORD
cbProcQualifier
Input
Length of szProcQualifier.
UCHAR FAR *
szProcOwner
Input
SWORD
cbProcOwner
Input
Length of szProcOwner.
UCHAR FAR *
szProcName
Input
SWORD
cbProcName
Input
Length of szProcName.
UCHAR FAR *
szColumnName
Input
SWORD
cbColumnName
Input
Length of szColumnName.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
494
SQLProcedureColumns
Diagnostics
When SQLProcedureColumns returns SQL_ERROR or SQL_SUCCESS_WITH_INFO,
an associated SQLSTATE value may be obtained by calling SQLError. The following
table lists the SQLSTATE values commonly returned by SQLProcedureColumns and
explains each one in the context of this function; the notation (DM) precedes the
descriptions of SQLSTATEs returned by the Driver Manager. The return code associated
with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
S1000
General error
S1001
Memory allocation
failure
495
SQLProcedureColumns
496
SQLSTATE
Error
Description
S1008
Operation
canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
SQLProcedureColumns
SQLSTATE
Error
Description
S1C00
S1T00
Timeout expired
Comments
This function is typically used before statement execution to retrieve information about
procedure parameters and columns from the data sources catalog. For more information
about stored procedures, see Using ODBC Extensions to SQL in Chapter 6, Executing
SQL Statements.
Important: SQLProcedureColumns might not return all columns used by a procedure. For example, a driver might only return information about the parameters
used by a procedure and not the columns in a result set it generates.
The szProcOwner, szProcName, and szColumnName arguments accept search patterns. For
more information about valid search patterns, see Search Pattern Arguments earlier in
this chapter.
SQLProcedureColumns returns the results as a standard result set, ordered by
PROCEDURE_QUALIFIER, PROCEDURE_OWNER, PROCEDURE_NAME, and
COLUMN_TYPE. The following table lists the columns in the result set. Additional columns beyond column 13 (REMARKS) can be defined by the driver.
497
SQLProcedureColumns
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the
PROCEDURE_QUALIFIER, PROCEDURE_OWNER, PROCEDURE_NAME, and
COLUMN_NAME columns, an application can call SQLGetInfo with the
SQL_MAX_QUALIFIER_NAME_LEN, SQL_MAX_OWNER_NAME_LEN,
SQL_MAX_PROCEDURE_NAME_LEN, and SQL_MAX_COLUMN_NAME_LEN
options.
498
Column Name
Data Type
Comments
PROCEDURE_QUALIFIER
Varchar(128)
PROCEDURE_OWNER
Varchar(128)
PROCEDURE_NAME
Varchar(128)
not NULL
Procedure identifier.
COLUMN_NAME
Varchar(128)
not NULL
SQLProcedureColumns
Column Name
Data Type
Comments
COLUMN_TYPE
Smallint
not NULL
DATA_TYPE
Smallint
not NULL
TYPE_NAME
Varchar(128)
not NULL
499
SQLProcedureColumns
500
Column Name
Data Type
Comments
PRECISION
Integer
LENGTH
Integer
SCALE
Smallint
SQLProcedureColumns
Column Name
Data Type
Comments
RADIX
Smallint
NULLABLE
Smallint
not NULL
REMARKS
Varchar(254)
Code Example
See SQLProcedures.
501
SQLProcedureColumns
Related Functions
502
See
SQLBindCol
SQLCancel
SQLExtendedFetch (extension)
SQLFetch
SQLProcedures (extension)
SQLProcedures
SQLProcedures
Extension Level 2
SQLProcedures returns the list of procedure names stored in a specific data source. Procedure is a generic term used to describe an executable object, or a named entity that can be
invoked using input and output parameters, and which can return result sets similar to
the results returned by SQL SELECT expressions.
Syntax
RETCODE SQLProcedures(hstmt, szProcQualifier, cbProcQualifier, szProcOwner, cbProcOwner,
szProcName, cbProcName)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szProcQualifier
Input
SWORD
cbProcQualifier
Input
Length of szProcQualifier.
UCHAR FAR *
szProcOwner
Input
SWORD
cbProcOwner
Input
Length of szProcOwner.
503
SQLProcedures
Type
Argument
Use
Description
UCHAR FAR *
szProcName
Input
SWORD
cbProcName
Input
Length of szProcName.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLProcedures returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLProcedures and explains each one in
the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
504
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
SQLProcedures
SQLSTATE
Error
Description
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
505
SQLProcedures
SQLSTATE
Error
Description
S1C00
S1T00
Timeout expired
Comments
SQLProcedures lists all procedures in the requested range. A user may or may not have
permission to execute any of these procedures. To check accessibility, an application can
call SQLGetInfo and check the SQL_ACCESSIBLE_PROCEDURES information value.
Otherwise, the application must be able to handle a situation where the user selects a
procedure which it cannot execute.
Important: SQLProcedures might not return all procedures. Applications can use any valid procedure, regardless of whether it is returned by SQLProcedures.
SQLProcedures returns the results as a standard result set, ordered by
PROCEDURE_QUALIFIER, PROCEDURE_OWNER, and PROCEDURE_NAME. The
following table lists the columns in the result set.
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the
PROCEDURE_QUALIFIER, PROCEDURE_OWNER, and PROCEDURE_NAME col-
506
SQLProcedures
Data Type
Comments
PROCEDURE_QUALIFIER
Varchar(128)
PROCEDURE_OWNER
Varchar(128)
PROCEDURE_NAME
Varchar(128)
not NULL
Procedure identifier.
NUM_INPUT_PARAMS
N/A
NUM_OUTPUT_PARAMS
N/A
NUM_RESULT_SETS
N/A
507
SQLProcedures
Column Name
Data Type
Comments
REMARKS
Varchar(254)
PROCEDURE_TYPE
Smallint
.Important: The PROCEDURE_TYPE column was added in ODBC 2.0. ODBC 1.0 drivers
might return a different, driver-specific column with the same column number.
The szProcOwner and szProcName arguments accept search patterns. For more information about valid search patterns, see Search Pattern Arguments earlier in this chapter.
Code Example
In this example, an application uses the procedure AddEmployee to insert data into the
EMPLOYEE table. The procedure contains input parameters for NAME, AGE, and
BIRTHDAY columns. It also contains one output parameter that returns a remark about
the new employee. The example also shows the use of a return value from a stored procedure. For the return value and each parameter in the procedure, the application calls
SQLBindParameter to specify the ODBC C data type and the SQL data type of the
parameter and to specify the storage location and length of the parameter. The application assigns data values to the storage locations for each parameter and calls SQLExecDirect to execute the procedure. If SQLExecDirect returns SQL_SUCCESS or
SQL_SUCCESS_WITH_INFO, the return value and the value of each output or
input/output parameter is automatically put into the storage location defined for the
parameter in SQLBindParameter.
#define NAME_LEN 30
#define REM_LEN 128
UCHAR
szName[NAME_LEN], szRemark[REM_LEN];
SWORD
sAge, sEmpId;
SQLLEN cbEmpId, cbName, cbAge = 0, cbBirthday = 0, cbRemark;
DATE_STRUCT dsBirthday;
508
SQLProcedures
509
SQLPutData
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExtendedFetch (extension)
SQLFetch
SQLGetInfo (extension)
SQLProcedureColumns (extension)
SQLPutData
Extension Level 1
SQLPutData allows an application to send data for a parameter or column to the driver
at statement execution time. This function can be used to send character or binary data
values in parts to a column with a character, binary, or data sourcespecific data type (for
example, parameters of the SQL_LONGVARBINARY or SQL_LONGVARCHAR types).
Syntax
RETCODE SQLPutData(hstmt, rgbValue, cbValue)
510
SQLPutData
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLPOINTER
rgbValue
Input
SQLLEN
cbValue
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
511
SQLPutData
Diagnostics
Whenrjn SQLPutData returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists
the SQLSTATE values commonly returned by SQLPutData and explains each one in the
context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
512
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
08S01
Communication
link failure
SQLPutData
SQLSTATE
Error
Description
22001
The SQL_NEED_LONG_DATA_LEN
information type in SQLGetInfo was Y and
more data was sent for a long parameter (the
data type was SQL_LONGVARCHAR,
SQL_LONGVARBINARY, or a long, data
sourcespecific data type) than was specified
with the pcbValue argument in
SQLBindParameter.
The SQL_NEED_LONG_DATA_LEN
information type in SQLGetInfo was Y and
more data was sent for a long column (the data
type was SQL_LONGVARCHAR,
SQL_LONGVARBINARY, or a long, data
sourcespecific data type) than was specified
in the length buffer corresponding to a column
in a row of data that was added or updated
with SQLSetPos.
22003
22005
Error in
assignment
22008
Datetime field
overflow
IM001
513
SQLPutData
514
SQLSTATE
Error
Description
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
S1009
Invalid argument
value
S1010
Function sequence
error
SQLPutData
SQLSTATE
Error
Description
S1090
Invalid string or
buffer length
S1T00
Timeout expired
Comments
For an explanation of how data-at-execution parameter data is passed at statement execution time, see Passing Parameter Values in SQLBindParameter. For an explanation
of how data-at-execution column data is updated or added, see Using SQLSetPos in
SQLSetPos.
Important: An application can use SQLPutData to send data in parts only when
sending character C data to a column with a character, binary, or data sourcespecific data type or when sending binary C data to a column with a character, binary,
or data sourcespecific data type. If SQLPutData is called more than once under
any other conditions, it returns SQL_ERROR and SQLSTATE 22003 (Numeric
value out of range).
Code Example
In the following example, an application prepares an SQL statement to insert data into
the EMPLOYEE table. The statement contains parameters for the NAME, ID, and
PHOTO columns. For each parameter, the application calls SQLBindParameter to
specify the C and SQL data types of the parameter. It also specifies that the data for the
first and third parameters will be passed at execution time, and passes the values 1 and
3 for later retrieval by SQLParamData. These values will identify which parameter is
being processed.
The application calls GetNextID to get the next available employee ID number. It then
calls SQLExecute to execute the statement. SQLExecute returns SQL_NEED_DATA
when it needs data for the first and third parameters. The application calls
SQLParamData to retrieve the value it stored with SQLBindParameter; it uses this value
515
SQLPutData
to determine which parameter to send data for. For each parameter, the application calls
InitUserData to initialize the data routine. It repeatedly calls GetUserData and
SQLPutData to get and send the parameter data. Finally, it calls SQLParamData to
indicate it has sent all the data for the parameter and to retrieve the value for the next
parameter. After data has been sent for both parameters, SQLParamData returns
SQL_SUCCESS.
For the first parameter, InitUserData does not do anything and GetUserData calls a
routine to prompt the user for the employee name. For the third parameter,
InitUserData calls a routine to prompt the user for the name of a file containing a bitmap
photo of the employee and opens the file. GetUserData retrieves the next
MAX_DATA_LEN bytes of photo data from the file. After it has retrieved all the photo
data, it closes the photo file.
Note that some application routines are omitted for clarity.
#define NAME_LEN 30
#define MAX_DATA_LEN 1024
SQLLEN cbNameParam, cbID = 0; cbPhotoParam, cbData;
SWORD sID;
PTR pToken, InitValue;
UCHAR Data[MAX_DATA_LEN];
retcode = SQLPrepare(hstmt,
"INSERT INTO EMPLOYEE (NAME, ID, PHOTO) VALUES (?, ?, ?)",
SQL_NTS);
if (retcode == SQL_SUCCESS) {
/* Bind the parameters. For parameters 1 and 3, pass the
*/
/* parameter number in rgbValue instead of a buffer address. */
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
NAME_LEN, 0, 1, 0, &cbNameParam);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT,
SQL_SMALLINT, 0, 0, &sID, 0, &cbID);
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT,
SQL_C_BINARY, SQL_LONGVARBINARY,
0, 0, 3, 0, &cbPhotoParam);
/* Set values so data for parameters 1 and 3 will be passed */
/* at execution. Note that the length parameter in the macro */
/* SQL_LEN_DATA_AT_EXEC is 0. This assumes that the driver */
/* returns "N" for the SQL_NEED_LONG_DATA_LEN information */
/* type in SQLGetInfo.
*/
cbNameParam = cbPhotoParam = SQL_LEN_DATA_AT_EXEC(0);
sID = GetNextID(); /* Get next available employee ID number. */
retcode = SQLExecute(hstmt);
516
SQLPutData
517
SQLRowCount
Related Functions
For information about
See
SQLCancel
SQLExecDirect
SQLExecute
SQLParamData (extension)
SQLBindParameter
SQLRowCount
Core
SQLRowCount returns the number of rows affected by an UPDATE, INSERT, or
DELETE statement or by a SQL_UPDATE, SQL_ADD, or SQL_DELETE operation in
SQLSetPos.
Syntax
RETCODE SQLRowCount(hstmt, pcrow)
518
SQLRowCount
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLLEN*
pcrow
Output
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLRowCount returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLRowCount and explains each one in the
519
SQLRowCount
context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
IM001
S1000
General error
S1001
Memory allocation
failure
S1010
Function sequence
error
Comments
If the last executed statement associated with hstmt was not an UPDATE, INSERT, or
DELETE statement, or if the fOption argument in the previous call to SQLSetPos was
not SQL_UPDATE, SQL_ADD, or SQL_DELETE, the value of pcrow is driver-defined.
520
SQLSetConnectOption
Related Functions
For information about
See
SQLExecDirect
SQLExecute
SQLSetConnectOption
Extension Level 1
SQLSetConnectOption sets options that govern aspects of connections.
Syntax
RETCODE SQLSetConnectOption(hdbc, fOption, vParam)
Argument
Use
Description
SQLHDBC
hdbc
Input
Connection handle.
SQLUSMALLINT
fOption
Input
SQLULEN
vParam
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
521
SQLSetConnectOption
Diagnostics
When SQLSetConnectOption returns SQL_ERROR or SQL_SUCCESS_WITH_INFO,
an associated SQLSTATE value may be obtained by calling SQLError. The following
table lists the SQLSTATE values commonly returned by SQLSetConnectOption and
explains each one in the context of this function; the notation (DM) precedes the
descriptions of SQLSTATEs returned by the Driver Manager. The return code associated
with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
The driver can return SQL_SUCCESS_WITH_INFO to provide information about the
result of setting an option. For example, setting SQL_ACCESS_MODE to read-only
during a transaction might cause the transaction to be committed. The driver could use
SQL_SUCCESS_WITH_INFO and information returned with SQLError to inform the
application of the commit action.
522
SQLSTATE
Error
Description
01000
General warning
01S02
Option value
changed
08002
Connection in use
08003
Connection not
open
08S01
Communication
link failure
IM001
SQLSetConnectOption
SQLSTATE
Error
Description
IM009
Unable to load
translation shared
library
S1000
General error
S1001
Memory allocation
failure
S1009
Invalid argument
value
S1010
Function sequence
error
523
SQLSetConnectOption
SQLSTATE
Error
Description
S1011
Operation invalid
at this time
S1092
S1C00
Comments
The currently defined options and the version of ODBC in which they were introduced
are shown below; it is expected that more will be defined to take advantage of different
data sources. Options from 0 to 999 are reserved by ODBC; driver developers must
reserve values greater than or equal to SQL_CONNECT_OPT_DRVR_START for driverspecific use. For more information, see Driver-Specific Data Types, Descriptor Types,
Information Types, and Options in Chapter 11, Guidelines for Implementing ODBC
Functions.
An application can call SQLSetConnectOption and include a statement option. The
driver sets the statement option for any hstmts associated with the specified hdbc and
establishes the statement option as a default for any hstmts later allocated for that hdbc.
For a list of statement options, see SQLSetStmtOption.
All connection and statement options successfully set by the application for the hdbc persist until SQLFreeConnect is called on the hdbc. For example, if an application calls
SQLSetConnectOption before connecting to a data source, the option persists even if
524
SQLSetConnectOption
SQLSetConnectOption fails in the driver when the application connects to the data
source; if an application sets a driver-specific option, the option persists even if the application connects to a different driver on the hdbc.
Some connection and statement options support substitution of a similar value if the data
source does not support the specified value of vParam. In such cases, the driver returns
SQL_SUCCESS_WITH_INFO and SQLSTATE 01S02 (Option value changed). For example, if fOption is SQL_PACKET_SIZE and vParam exceeds the maximum packet size, the
driver substitutes the maximum size. To determine the substituted value, an application
calls SQLGetConnectOption (for connection options) or SQLGetStmtOption (for statement options).
The format of information set through vParam depends on the specified fOption.
SQLSetConnectOption will accept option information in one of two different formats: a
null-terminated character string or a 32-bit integer value. The format of each foption is
noted in the following table. Character strings pointed to by the vParam argument of
SQLSetConnectOption have a maximum length of
SQL_MAX_OPTION_STRING_LENGTH bytes (excluding the null termination byte).
525
SQLSetConnectOption
526
fOption
vParam Contents
SQL_ACCESS_MODE
(ODBC 1.0)
SQL_AUTOCOMMIT
(ODBC 1.0)
SQLSetConnectOption
fOption
vParam Contents
SQL_CURRENT_QUALIFIER
(ODBC 2.0)
SQL_LOGIN_TIMEOUT
(ODBC 1.0)
SQL_ODBC_CURSORS
(ODBC 2.0)
527
SQLSetConnectOption
528
fOption
vParam Contents
SQL_OPT_TRACE
(ODBC 1.0)
SQL_OPT_TRACEFILE
(ODBC 1.0)
SQL_PACKET_SIZE
(ODBC 2.0)
SQLSetConnectOption
fOption
vParam Contents
SQL_QUIET_MODE
(ODBC 2.0)
SQL_TRANSLATE_DLL
(ODBC 1.0)
529
SQLSetConnectOption
530
fOption
vParam Contents
SQL_TRANSLATE_OPTION
(ODBC 1.0)
SQLSetConnectOption
fOption
vParam Contents
SQL_TXN_ISOLATION
(ODBC 1.0)
531
SQLSetConnectOption
Data Translation
Data translation will be performed for all data flowing between the driver and the data
source.
The translation option (set with the SQL_TRANSLATE_OPTION option) can be any 32bit value. Its meaning depends on the translation shared library being used. A new
option can be set at any time. The new option will be applied to the next exchange of
data following the call to SQLSetConnectOption. A default translation shared library
may be specified for the data source in its data source specification in the .odbc.ini file.
The default translation shared library is loaded by the driver at connection time. A
translation option (SQL_TRANSLATE_OPTION) may be specified in the data source
specification as well.
To change the translation shared library for a connection, an application calls SQLSetConnectOption with the SQL_TRANSLATE_DLL option after it has connected to the
data source. The driver will attempt to load the specified shared library and, if the
attempt fails, return SQL_ERROR with the SQLSTATE IM009 (Unable to load translation
shared library).
If no translation shared library has been specified in the ODBC initialization file or by
calling SQLSetConnectOption, the driver will not attempt to translate data. Any value
set for the translation option will be ignored.
For more information about translating data, see Translating Data in Chapter 13,
Establishing Connections; Specifying a Default Translator in Chapter 19, Configuring Data Sources; and Chapter 23, Translation Function Shared Library Reference.
Code Example
See SQLConnect and SQLParamOptions.
532
SQLSetCursorName
Related Functions
For information about
See
SQLGetStmtOption (extension)
SQLSetStmtOption (extension)
SQLSetCursorName
Core
SQLSetCursorName associates a cursor name with an active hstmt. If an application
does not call SQLSetCursorName, the driver generates cursor names as needed for SQL
statement processing.
Syntax
RETCODE SQLSetCursorName(hstmt, szCursor, cbCursor)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szCursor
Input
Cursor name.
SWORD
cbCursor
Input
Length of szCursor.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
533
SQLSetCursorName
Diagnostics
When SQLSetCursorName returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLSetCursorName and explains
each one in the context of this function; the notation (DM) precedes the descriptions
of SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
534
SQLSTATE
Error
Description
01000
General warning
24000
34000
Invalid cursor
name
3C000
Duplicate cursor
name
IM001
S1000
General error
S1001
Memory allocation
failure
S1009
Invalid argument
value
SQLSetCursorName
SQLSTATE
Error
Description
S1010
Function sequence
error
S1090
Invalid string or
buffer length
Comments
The only ODBC SQL statements that use a cursor name are a positioned update and
delete (for example, UPDATE table-name ...WHERE CURRENT OF cursor-name). If the
application does not call SQLSetCursorName to define a cursor name, on execution of a
SELECT statement the driver generates a name that begins with the letters SQL_CUR
and does not exceed 18 characters in length.
All cursor names within the hdbc must be unique. The maximum length of a cursor name
is defined by the driver. For maximum interoperability, it is recommended that applications limit cursor names to no more than 18 characters.
A cursor name that is set either explicitly or implicitly remains set until the hstmt with
which it is associated is dropped, using SQLFreeStmt with the SQL_DROP option.
Code Example
In the following example, an application uses SQLSetCursorName to set a cursor name
for an hstmt. It then uses that hstmt to retrieve results from the EMPLOYEE table. Finally,
it performs a positioned update to change the name of 25-year-old John Smith to John D.
Smith. Note that the application uses different hstmts for the SELECT and UPDATE
statements.
535
SQLSetCursorName
hstmtSelect,
hstmtUpdate;
szName[NAME_LEN];
sAge;
cbName;
cbAge;
536
SQLSetParam
Related Functions
For information about
See
SQLExecDirect
SQLExecute
SQLGetCursorName
SQLSetScrollOptions (extension)
SQLSetParam
Deprecated
In ODBC 2.0, the ODBC 1.0 function SQLSetParam has been replaced by SQLBindParameter. For more information, see SQLBindParameter.
SQLSetPos
Extension Level 2
SQLSetPos sets the cursor position in a rowset and allows an application to refresh,
update, delete, or add data to the rowset.
Syntax
RETCODE SQLSetPos(hstmt, irow, fOption, fLock)
537
SQLSetPos
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLSETPOSIROW
irow
Input
SQLUSMALLINT
fOption
Input
Operation to perform:
SQL_POSITION
SQL_REFRESH
SQL_UPDATE
SQL_DELETE
SQL_ADD
For more information, see
Comments.
SQLUSMALLINT
fLock
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA,
SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLSetPos returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated
SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLSetPos and explains each one in the con-
538
SQLSetPos
text of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
01004
Data truncated
01S01
Error in row
01S03
No rows updated
or deleted
01S04
21S02
Degree of derived
table does not
match column list
539
SQLSetPos
540
SQLSTATE
Error
Description
22003
22005
Error in
assignment
22008
Datetime field
overflow
23000
24000
Invalid cursor state (DM) The hstmt was in an executed state but no
result set was associated with the hstmt.
(DM) A cursor was open on the hstmt but
SQLFetch or SQLExtendedFetch had not been
called.
A cursor was open on the hstmt and
SQLExtendedFetch had been called, but the
cursor was positioned before the start of the
result set or after the end of the result set.
The argument fOption was SQL_DELETE,
SQL_REFRESH, or SQL_UPDATE and the
cursor was positioned before the start of the
result set or after the end of the result set.
42000
Syntax error or
access violation
SQLSetPos
SQLSTATE
Error
Description
IM001
S0023
No default for
column
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
541
SQLSetPos
542
SQLSTATE
Error
Description
S1009
Invalid argument
value
S1010
Function sequence
error
S1090
Invalid string or
buffer length
SQLSetPos
SQLSTATE
Error
Description
S1107
S1109
Invalid cursor
position
S1C00
S1T00
Timeout expired
Comments
irow Argument
The irow argument specifies the number of the row in the rowset on which to perform the
operation specified by the fOption argument. If irow is 0, the operation applies to every
row in the rowset. Except for the SQL_ADD operation, irow must be a value from 0 to the
number of rows in the rowset. For the SQL_ADD operation, irow can be any value; generally it is either 0 (to add as many rows as there are in the rowset) or the number of rows
in the rowset plus 1 (to add the data from an extra row of buffers allocated for this purpose).
Important: In the C language, arrays are 0-based, while the irow argument is 1-based. For example, to update the fifth row of the rowset, an application modifies the rowset buffers at array index
4, but specifies an irow of 5.
543
SQLSetPos
All operations except for SQL_ADD position the cursor on the row specified by irow; the
SQL_ADD operation does not change the cursor position. The following operations
require a cursor position:
Calls to SQLGetData.
For example, if the cursor is positioned on the second row of the rowset, a positioned
delete statement deletes that row; if it is positioned on the entire rowset (irow is 0), a positioned delete statement deletes every row in the rowset.
An application can specify a cursor position when it calls SQLSetPos. Generally, it calls
SQLSetPos with the SQL_POSITION or SQL_REFRESH operation to position the cursor
before executing a positioned update or delete statement or calling SQLGetData.
fOption Argument
The fOption argument supports the following operations. To determine which options
are supported by a data source, an application calls SQLGetInfo with the
SQL_POS_OPERATIONS information type.
544
fOption Argument
Operation
SQL_POSITION
SQL_REFRESH
The driver positions the cursor on the row specified by irow and
refreshes data in the rowset buffers for that row. For more
information about how the driver returns data in the rowset
buffers, see the descriptions of row-wise and column-wise
binding in SQLExtendedFetch.
This is the same as the TRUE value of this argument in ODBC
1.0.
SQLSetPos
fOption Argument
Operation
SQL_UPDATE
The driver positions the cursor on the row specified by irow and
updates the underlying row of data with the values in the rowset
buffers (the rgbValue argument in SQLBindCol). It retrieves the
lengths of the data from the number-of-bytes buffers (the
pcbValue argument in SQLBindCol). If the length of any column
is SQL_IGNORE, the column is not updated. After updating the
row, the driver changes the rgfRowStatus array specified in
SQLExtendedFetch to SQL_ROW_UPDATED.
SQL_DELETE
The driver positions the cursor on the row specified by irow and
deletes the underlying row of data. It changes the rgfRowStatus
array specified in SQLExtendedFetch to SQL_ROW_DELETED.
After the row has been deleted, positioned update and delete
statements, calls to SQLGetData and calls to SQLSetPos with
fOption set to anything except SQL_POSITION are not valid for
the row.
Whether the row remains visible depends on the cursor type. For
example, deleted rows are visible to static and keyset-driven
cursors but invisible to dynamic cursors.
SQL_ADD
The driver adds a new row of data to the data source. Where the
row is added to the data source and whether it is visible in the
result set is driver-defined.
The driver retrieves the data from the rowset buffers (the
rgbValue argument in SQLBindCol) according to the value of the
irow argument. It retrieves the lengths of the data from the
number-of-bytes buffers (the pcbValue argument in
SQLBindCol). Generally, the application allocates an extra row
of buffers for this purpose.
For columns not bound to the rowset buffers, the driver uses
default values (if they are available) or NULL values (if default
values are not available). For columns with a length of
SQL_IGNORE, the driver uses default values.
If irow is less than or equal to the rowset size, the driver changes
the rgfRowStatus array specified in SQLExtendedFetch to
SQL_ROW_ADDED after adding the row. At this point, the
rowset buffers do not match the cursors for the row. To restore
the rowset buffers to match the data in the cursor, an application
calls SQLSetPos with the SQL_REFRESH option.
This operation does not affect the cursor position.
545
SQLSetPos
fLock Argument
The fLock argument provides a way for applications to control concurrency and simulate
transactions on data sources that do not support them. Generally, data sources that support concurrency levels and transactions will only support the
SQL_LOCK_NO_CHANGE value of the fLock argument.
The fLock argument specifies the lock state of the row after SQLSetPos has been executed. To simulate a transaction, an application uses the SQL_LOCK_RECORD macro to
lock each of the rows in the transaction. It then uses the SQL_UPDATE_RECORD or
SQL_DELETE_RECORD macro to update or delete each row; the driver may temporarily change the lock state of the row while performing the operation specified by the
fOption argument. Finally, it uses the SQL_LOCK_RECORD macro to unlock each row.
For an example of how an application might do this, see the second code example. Note
that if the driver is unable to lock the row either to perform the requested operation or
to satisfy the fLock argument, it returns SQL_ERROR and SQLSTATE 42000 (Syntax error
or access violation).
Although the fLock argument is specified for an hstmt, the lock accords the same privileges to all hstmts on the connection. In particular, a lock that is acquired by one hstmt on
a connection can be unlocked by a different hstmt on the same connection.
A row locked through SQLSetPos remains locked until the application calls SQLSetPos
for the row with fLock set to SQL_LOCK_UNLOCK or the application calls SQLFreeStmt with the SQL_CLOSE or SQL_DROP option.
546
SQLSetPos
The fLock argument supports the following types of locks. To determine which locks are
supported by a data source, an application calls SQLGetInfo with the
SQL_LOCK_TYPES information type.
fLock Argument
Lock Type
SQL_LOCK_UNLOCK
For the add, update, and delete operations in SQLSetPos, the application uses the fLock
argument as follows:
To guarantee that a row does not change after it is retrieved, an application calls
SQLSetPos with fOption set to SQL_REFRESH and fLock set to
SQL_LOCK_EXCLUSIVE.
547
SQLSetPos
For more information about the SQL_CONCURRENCY statement option, see SQLSetStmtOption.
Using SQLSetPos
Before an application calls SQLSetPos, it must:
1.
2.
3.
Calls SQLSetPos with irow set to the number of the row to delete.
An application can pass the value for a column either in the rgbValue buffer or
with one or more calls to SQLPutData. Columns whose data is passed with
SQLPutData are known as data-at-execution columns. These are commonly used
to send data for SQL_LONGVARBINARY and SQL_LONGVARCHAR columns
and can be mixed with other columns.
Places values in the rgbValue and pcbValue buffers bound with SQLBindCol:
For normal columns, the application places the new column value in the
rgbValue buffer and the length of that value in the pcbValue buffer. If the row
is being updated and the column is not to be changed, the application places
SQL_IGNORE in the pcbValue buffer.
For data-at-execution columns, the application places an applicationdefined value, such as the column number, in the rgbValue buffer. The value
can be used later to identify the column.
It places the result of the SQL_LEN_DATA_AT_EXEC(length) macro in the
pcbValue buffer. If the SQL data type of the column is
SQL_LONGVARBINARY, SQL_LONGVARCHAR, or a long, data source
specific data type and the driver returns Y for the
SQL_NEED_LONG_DATA_LEN information type in SQLGetInfo, length is
548
SQLSetPos
the number of bytes of data to be sent for the parameter; otherwise, it must
be a nonnegative value and is ignored.
2.
3.
Calls SQLSetPos or uses an SQLSetPos macro to update or add the row of data.
Calls SQLParamData to retrieve the address of the rgbValue buffer for the first
data-at-execution column to be processed. The application retrieves the application-defined value from the rgbValue buffer.
Although data-at-execution parameters are similar to data-at-execution columns, the value returned by SQLParamData is different for each.
Data-at-execution parameters are pararmeters in an SQL statement for which
data will be sent with SQLPutData when the statement is executed with SQLExecDirect or SQLExecute.They are bound with SQLBindParameter. The value
returned by SQLParamData is a 32-bit value passed to SQLBindParameter in
the rgbValue argument.
Data-at-execution columns are columns in a rowset for which data will be sent
with SQLPutData when a row is updated or added with SQLSetPos. They are
bound with SQLBindCol. The value returned by SQLParamData is the address
of the row in the rgbValue buffer that is being processed.
4.
Calls SQLPutData one or more times to send data for the column. More than one
call is needed if the data value is larger than the rgbValue buffer specified in
SQLPutData; note that multiple calls to SQLPutData for the same column are
allowed only when sending character C data to a column with a character,
binary, or data sourcespecific data type or when sending binary C data to a column with a character, binary, or data sourcespecific data type.
5.
Calls SQLParamData again to signal that all data has been sent for the column.
549
SQLSetPos
After SQLSetPos returns SQL_NEED_DATA, and before data is sent for all data-at-execution columns, the operation is canceled, or an error occurs in SQLParamData or
SQLPutData, the application can only call SQLCancel, SQLGetFunctions, SQLParamData, or SQLPutData with the hstmt or the hdbc associated with the hstmt. If it calls any
other function with the hstmt or the hdbc associated with the hstmt, the function returns
SQL_ERROR and SQLSTATE S1010 (Function sequence error).
If the application calls SQLCancel while the driver still needs data for data-at-execution
columns, the driver cancels the operation; the application can then call SQLSetPos
again; canceling does not affect the cursor state or the current cursor position. If the
application calls SQLParamData or SQLPutData after canceling the operation, the
function returns SQL_ERROR and SQLSTATE S1008 (Operation canceled).
Sets the element in the rgfRowStatus array for the row to SQL_ROW_ERROR.
Posts one or more additional SQLSTATEs for the error after SQLSTATE 01S01
(Error in row) in the error queue.
After it has processed the error or warning, the driver continues the operation for the
remaining rows in the rowset and returns SQL_SUCCESS_WITH_INFO. Thus, for each
row that returned an error, the error queue contains SQLSTATE 01S01 (Error in row) followed by zero or more additional SQLSTATEs.
If the driver returns any warnings, such as SQLSTATE 01004 (Data truncated), it returns
warnings that apply to the entire rowset or to unknown rows in the rowset before it
returns the error information that applies to specific rows. It returns warnings for specific rows along with any other error information about those rows.
550
SQLSetPos
SQLSetPos Macros
As an aid to programming, the following macros for calling SQLSetPos are defined in
the sqlext.h file.
Macro name
Function call
SQL_POSITION_TO(hstmt, irow)
SQL_LOCK_RECORD(hstmt, irow,
fLock)
SQL_REFRESH_RECORD(hstmt, irow,
fLock)
SQL_UPDATE_RECORD(hstmt, irow)
SQL_DELETE_RECORD(hstmt, irow)
SQL_ADD_RECORD(hstmt, irow)
Code Example
In the following example, an application allows a user to browse the EMPLOYEE table
and update employee birthdays. The cursor is keyset-driven with a rowset size of 20 and
uses optimistic concurrency control comparing row versions. After each rowset is
fetched, the application prints them and allows the user to select and update an
employees birthday. The application uses SQLSetPos to position the cursor on the
selected row and performs a positioned update of the row. (Error handling is omitted for
clarity.)
#define ROWS 20
#define NAME_LEN 30
#define BDAY_LEN 11
UCHAR szName[ROWS][NAME_LEN], szBirthday[ROWS][BDAY_LEN], szReply[3];
SQLLEN cbName[ROWS], cbBirthday[ROWS];
SQLUSMALLINT rgfRowStatus[ROWS];
SQLROWSETSIZE crow,
SQLSETPOSISIZE irow;
HSTMT hstmtS, hstmtU;
551
SQLSetPos
552
SQLSetScrollOptions
In the following code fragment, an application simulates a transaction for rows 1 and 2.
It locks the rows, updates them, then unlocks them. The code uses the SQLSetPos macros.
/* Lock rows 1 and 2
*/
SQL_LOCK_RECORD(hstmt, 1, SQL_LOCK_EXCLUSIVE);
SQL_LOCK_RECORD(hstmt, 2, SQL_LOCK_EXCLUSIVE);
/* Modify the rowset buffers for rows 1 and 2 (not shown).*/
/* Update rows 1 and 2.
*/
SQL_UPDATE_RECORD(hstmt, 1);
SQL_UPDATE_RECORD(hstmt, 2);
/* Unlock rows 1 and 2
*/
SQL_LOCK_RECORD(hstmt, 1, SQL_LOCK_UNLOCK);
SQL_LOCK_RECORD(hstmt, 2, SQL_LOCK_UNLOCK);
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExtendedFetch (extension)
SQLSetStmtOption (extension)
SQLSetScrollOptions
Extension Level 2
SQLSetScrollOptions sets options that control the behavior of cursors associated with
an hstmt. SQLSetScrollOptions allows the application to specify the type of cursor
behavior desired in three areas: concurrency control, sensitivity to changes made by
other transactions, and rowset size.
553
SQLSetScrollOptions
Syntax
RETCODE SQLSetScrollOptions(hstmt, fConcurrency, crowKeyset, crowRowset)
554
Type
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
fConcurrency
Input
SQLSetScrollOptions
Type
Argument
Use
Description
SQLLEN
crowKeyset
Input
SQLUSMALLINT
crowRowset
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLSetScrollOptions returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLSetScrollOptions and explains
555
SQLSetScrollOptions
each one in the context of this function; the notation (DM) precedes the descriptions
of SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
556
SQLSTATE
Error
Description
01000
IM001
S1000
General error
S1001
Memory
The driver was unable to allocate memory
allocation failure required to support execution or completion of
the function.
S1010
Function
sequence error
S1107
SQLSetScrollOptions
SQLSTATE
Error
Description
S1108
Concurrency
option out of
range
S1C00
Driver not
capable
Comments
If an application calls SQLSetScrollOptions for an hstmt, it must do so before it calls
SQLPrepare or SQLExecDirect or creating a result set with a catalog function.
The application must specify a buffer in a call to SQLBindCol that is large enough to
hold the number of rows specified in crowRowset.
If the application does not call SQLSetScrollOptions, crowRowset has a default value of
1, crowKeyset has a default value of SQL_SCROLL_FORWARD_ONLY, and fConcurrency
equals SQL_CONCUR_READ_ONLY.
For more information concerning scrollable cursors, see Using Block and Scrollable Cursors in Chapter 7, Retrieving Results.
557
SQLSetScrollOptions
Related Functions
558
See
SQLBindCol
SQLExtendedFetch (extension)
SQLSetPos (extension)
SQLSetStmtOption
SQLSetStmtOption
SQLSetStmtOption
Extension Level 1
SQLSetStmtOption sets options related to an hstmt. To set an option for all statements
associated with a specific hdbc, an application can call SQLSetConnectOption.
Syntax
RETCODE SQLSetStmtOption(hstmt, fOption, vParam)
Argument
Use
Description
SQLHSTMT
hstmt
Input
Statement handle.
SQLUSMALLINT
fOption
Input
SQLROWCOUNT
vParam
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLSetStmtOption returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLSetStmtOption and explains
559
SQLSetStmtOption
each one in the context of this function; the notation (DM) precedes the descriptions
of SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
560
SQLSTATE
Error
Description
01000
General warning
01S02
Option value
changed
08S01
Communication
link failure
24000
IM001
S1000
General error
S1001
Memory allocation
failure
SQLSetStmtOption
SQLSTATE
Error
Description
S1009
Invalid argument
value
S1010
Function sequence
error
S1011
Operation invalid
at this time
S1092
S1C00
561
SQLSetStmtOption
Comments
Statement options for an hstmt remain in effect until they are changed by another call to
SQLSetStmtOption or the hstmt is dropped by calling SQLFreeStmt with the
SQL_DROP option. Calling SQLFreeStmt with the SQL_CLOSE, SQL_UNBIND, or
SQL_RESET_PARAMS options does not reset statement options.
Some statement options support substitution of a similar value if the data source does
not support the specified value of vParam. In such cases, the driver returns
SQL_SUCCESS_WITH_INFO and SQLSTATE 01S02 (Option value changed). For example, if fOption is SQL_CONCURRENCY, vParam is SQL_CONCUR_ROWVER, and the
data source does not support this, the driver substitutes SQL_CONCUR_VALUES. To
determine the substituted value, an application calls SQLGetStmtOption.
The currently defined options and the version of ODBC in which they were introduced
are shown below; it is expected that more will be defined to take advantage of different
data sources. Options from 0 to 999 are reserved by ODBC; driver developers must
reserve values greater than or equal to SQL_CONNECT_OPT_DRVR_START for driverspecific use. For more information, see Driver-Specific Data Types, Descriptor Types,
Information Types, and Options in Chapter 11, Guidelines for Implementing ODBC
Functions.
The format of information set with vParam depends on the specified fOption. SQLSetStmtOption accepts option information in one of two different formats: a null-terminated
character string or a 32-bit integer value. The format of each is noted in the options
description. This format applies to the information returned for each option in SQLGetStmtOption. Character strings pointed to by the vParam argument of SQLSetStmtOption have a maximum length of SQL_MAX_OPTION_STRING_LENGTH bytes
(excluding the null termination byte).
562
SQLSetStmtOption
563
SQLSetStmtOption
564
Ofption
vParam Contents
SQL_ASYNC_
ENABLE
(ODBC 1.0)
SQLSetStmtOption
Ofption
vParam Contents
SQL_BIND_TYPE
(ODBC 1.0)
SQL_
CONCURRENCY
(ODBC 2.0)
565
SQLSetStmtOption
566
Ofption
vParam Contents
SQL_CURSOR_TYPE
(ODBC 2.0)
SQL_KEYSET_SIZE
(ODBC 2.0)
SQLSetStmtOption
Ofption
vParam Contents
SQL_MAX_LENGTH
(ODBC 1.0)
SQL_MAX_ROWS
(ODBC 1.0)
SQL_NOSCAN
(ODBC 1.0)
567
SQLSetStmtOption
568
Ofption
vParam Contents
SQL_QUERY_
TIMEOUT
(ODBC 1.0)
A 32-bit integer value corresponding to the number of seconds to wait for an SQL statement to execute before returning to the application. If vParam equals 0 (the default),
then there is no time out.
If the specified timeout exceeds the maximum timeout in
the data source or is smaller than the minimum timeout,
the driver substitutes that value and returns SQLSTATE
01S02 (Option value changed).
Note that the application need not call SQLFreeStmt with
the SQL_CLOSE option to reuse the hstmt if a SELECT
statement timed out.
SQL_RETRIEVE_
DATA
(ODBC 2.0)
SQL_ROWSET_
SIZE
(ODBC 2.0)
SQLSetStmtOption
Ofption
vParam Contents
SQL_SIMULATE_
CURSOR
(ODBC 2.0)
569
SQLSpecialColumns
Ofption
vParam Contents
SQL_USE_
BOOKMARKS
(ODBC 2.0)
A 32-bit integer value that specifies whether an application will use bookmarks with a cursor:
SQL_UB_OFF = Off (the default)
SQL_UB_ON = On
To use bookmarks with a cursor, the application must
specify this option with the SQL_UB_ON value before
opening the cursor.
Code Example
See SQLExtendedFetch.
Related Functions
For information about
See
SQLCancel
SQLGetStmtOption (extension)
SQLSetConnectOption (extension)
SQLSpecialColumns
Extension Level 1
SQLSpecialColumns retrieves the following information about columns within a specified table:
570
The optimal set of columns that uniquely identifies a row in the table.
Columns that are automatically updated when any value in the row is updated
by a transaction.
SQLSpecialColumns
Syntax
RETCODE SQLSpecialColumns(hstmt, fColType, szTableQualifier, cbTableQualifier,
szTableOwner, cbTableOwner, szTableName, cbTableName, fScope, fNullable)
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UWORD
fColType
Input
UCHAR FAR *
szTableQualifier
Input
SWORD
cbTableQualifier
Input
Length of szTableQualifier.
571
SQLSpecialColumns
572
Type
Argument
Use
Description
UCHAR FAR *
szTableOwner
Input
SWORD
cbTableOwner
Input
Length of szTableOwner.
UCHAR FAR *
szTableName
Input
Table name.
SWORD
cbTableName
Input
Length of szTableName.
UWORD
fScope
Input
UWORD
fNullable
Input
SQLSpecialColumns
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLSpecialColumns returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLSpecialColumns and explains
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
S1000
General error
573
SQLSpecialColumns
574
SQLSTATE
Error
Description
S1001
Memory allocation
failure
S1008
Operation
canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1097
S1098
S1099
SQLSpecialColumns
SQLSTATE
Error
Description
S1C00
S1T00
Timeout expired
Comments
SQLSpecialColumns is provided so that applications can provide their own custom
scrollable-cursor functionality, similar to that provided by SQLExtendedFetch and
SQLSetStmtOption.
When the fColType argument is SQL_BEST_ROWID, SQLSpecialColumns returns the
column or columns that uniquely identify each row in the table. These columns can
always be used in a select-list or WHERE clause. However, SQLColumns does not
necessarily return these columns. For example, SQLColumns might not return the
Oracle ROWID pseudo-column ROWID. If there are no columns that uniquely identify
each row in the table, SQLSpecialColumns returns a rowset with no rows; a subsequent
call to SQLFetch or SQLExtendedFetch on the hstmt returns SQL_NO_DATA_FOUND.
If the fColType, fScope, or fNullable arguments specify characteristics that are not supported by the data source, SQLSpecialColumns returns a result set with no rows (as
opposed to the function returning SQL_ERROR with SQLSTATE S1C00 (Driver not capable)). A subsequent call to SQLFetch or SQLExtendedFetch on the hstmt will return
SQL_NO_DATA_FOUND.
SQLSpecialColumns returns the results as a standard result set, ordered by SCOPE. The
following table lists the columns in the result set.
575
SQLSpecialColumns
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual length of the COLUMN_NAME column, an application can call SQLGetInfo with the SQL_MAX_COLUMN_NAME_LEN
option.
576
Column Name
Data Type
Comments
SCOPE
Smallint
COLUMN_NAME
Varchar(128)
not NULL
Column identifier.
DATA_TYPE
Smallint
not NULL
TYPE_NAME
Varchar(128)
not NULL
PRECISION
Integer
SQLSpecialColumns
Column Name
Data Type
Comments
LENGTH
Integer
SCALE
Smallint
PSEUDO_COLUMN Smallint
The PSEUDO_COLUMN column was added in ODBC 2.0. ODBC 1.0 drivers might
return a different, driver-specific column with the same column number.
Once the application retrieves values for SQL_BEST_ROWID, the application can use
these values to reselect that row within the defined scope. The SELECT statement is
guaranteed to return either no rows or one row.
If an application reselects a row based on the rowid column or columns and the row is
not found, then the application can assume that the row was deleted or the rowid columns were modified. The opposite is not true: even if the rowid has not changed, the
other columns in the row may have changed.
577
SQLSpecialColumns
Columns returned for column type SQL_BEST_ROWID are useful for applications that
need to scroll forwards and backwards within a result set to retrieve the most recent data
from a set of rows. The column or columns of the rowid are guaranteed not to change
while positioned on that row.
The column or columns of the rowid may remain valid even when the cursor is not positioned on the row; the application can determine this by checking the SCOPE column in
the result set.
Columns returned for column type SQL_ROWVER are useful for applications that need
the ability to check if any columns in a given row have been updated while the row was
reselected using the rowid. For example, after reselecting a row using rowid, the application can compare the previous values in the SQL_ROWVER columns to the ones just
fetched. If the value in a SQL_ROWVER column differs from the previous value, the
application can alert the user that data on the display has changed.
Code Example
For a code example of a similar function, see SQLColumns.
578
SQLStatistics
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLColumns (extension)
SQLExtendedFetch (extension)
SQLFetch
SQLPrimaryKeys (extension)
SQLStatistics
Extension Level 1
SQLStatistics retrieves a list of statistics about a single table and the indexes associated
with the table. The driver returns the information as a result set.
Syntax
RETCODE SQLStatistics(hstmt, szTableQualifier, cbTableQualifier,szTableOwner, cbTableOwner,
szTableName, cbTableName, fUnique, fAccuracy)
579
SQLStatistics
580
Type
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szTableQualifier
Input
SWORD
cbTableQualifier
Input
Length of szTableQualifier.
UCHAR FAR *
szTableOwner
Input
SWORD
cbTableOwner
Input
Length of szTableOwner.
UCHAR FAR *
szTableName
Input
Table name.
SWORD
cbTableName
Input
Length of szTableName.
UWORD
fUnique
Input
Type of index:
SQL_INDEX_UNIQUE or
SQL_INDEX_ALL.
UWORD
fAccuracy
Input
SQLStatistics
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLStatistics returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLStatistics and explains each one
in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each
SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
S1000
General error
581
SQLStatistics
582
SQLSTATE
Error
Description
S1001
Memory allocation
failure
S1008
Operation
canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1100
Uniqueness option
type out of range
S1101
Accuracy option
type out of range
SQLStatistics
SQLSTATE
Error
Description
S1C00
S1T00
Timeout expired
Comments
SQLStatistics returns information about a single table as a standard result set, ordered
by NON_UNIQUE, TYPE, INDEX_QUALIFIER, INDEX_NAME, and SEQ_IN_INDEX.
The result set combines statistics information for the table with information about each
index. The following table lists the columns in the result set.
Important: SQLStatistics might not return all indexes. For example, a Text driver might only
return indexes in files in the current directory. Applications can use any valid index, regardless
of whether it is returned by SQLStatistics.
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the TABLE_QUALIFIER,
TABLE_OWNER, TABLE_NAME, and COLUMN_NAME columns, an application can
call SQLGetInfo with the SQL_MAX_QUALIFIER_NAME_LEN,
SQL_MAX_OWNER_NAME_LEN, SQL_MAX_TABLE_NAME_LEN, and
SQL_MAX_COLUMN_NAME_LEN options.
583
SQLStatistics
584
Column Name
Data Type
Comments
TABLE_QUALIFIER
Varchar(128)
TABLE_OWNER
Varchar(128)
TABLE_NAME
Varchar(128)
not NULL
NON_UNIQUE
Smallint
INDEX_QUALIFIER
Varchar(128)
INDEX_NAME
Varchar(128)
SQLStatistics
Column Name
Data Type
Comments
TYPE
Smallint
not NULL
SEQ_IN_INDEX
Smallint
COLUMN_NAME
Varchar(128)
COLLATION
Char(1)
CARDINALITY
Integer
585
SQLStatistics
Column Name
Data Type
Comments
PAGES
Integer
FILTER_CONDITION
Varchar(128)
Important: The FILTER_CONDITION column was added in ODBC 2.0. ODBC 1.0 drivers
might return a different, driver-specific column with the same column number.
If the row in the result set corresponds to a table, the driver sets TYPE to
SQL_TABLE_STAT and sets NON_UNIQUE, INDEX_QUALIFIER, INDEX_NAME,
SEQ_IN_INDEX, COLUMN_NAME, and COLLATION to NULL. If CARDINALITY or
PAGES are not available from the data source, the driver sets them to NULL.
Code Example
For a code example of a similar function, see SQLColumns.
586
SQLTablePrivileges
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLExtendedFetch (extension)
SQLFetch
SQLForeignKeys (extension)
SQLPrimaryKeys (extension)
SQLTablePrivileges
Extension Level 2
SQLTablePrivileges returns a list of tables and the privileges associated with each table.
The driver returns the information as a result set on the specified hstmt.
Syntax
RETCODE SQLTablePrivileges(hstmt, szTableQualifier, cbTableQualifier,
szTableOwner, cbTableOwner, szTableName, cbTableName)
587
SQLTablePrivileges
Argument
Use
Description
HSTMT
hstmt
Input
Statement handle.
UCHAR FAR *
szTableQualifier
Input
SWORD
cbTableQualifier
Input
Length of szTableQualifier.
UCHAR FAR *
szTableOwner
Input
SWORD
cbTableOwner
Input
Length of szTableOwner.
UCHAR FAR *
szTableName
Input
SWORD
cbTableName
Input
Length of szTableName.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR, or SQL_INVALID_HANDLE.
Diagnostics
When SQLTablePrivileges returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an
associated SQLSTATE value may be obtained by calling SQLError. The following table
lists the SQLSTATE values commonly returned by SQLTablePrivileges and explains
588
SQLTablePrivileges
each one in the context of this function; the notation (DM) precedes the descriptions of
SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
Invalid cursor state (DM) A cursor was open on the hstmt and
SQLFetch or SQLExtendedFetch had been
called.
A cursor was open on the hstmt but SQLFetch
or SQLExtendedFetch had not been called.
IM001
S1000
General error
S1001
Memory allocation
failure
S1008
Operation
canceled
589
SQLTablePrivileges
SQLSTATE
Error
Description
S1010
Function sequence
error
S1090
Invalid string or
buffer length
S1C00
S1T00
Timeout expired
Comments
The szTableOwner and szTableName arguments accept search patterns. For more information about valid search patterns, see Search Pattern Arguments earlier in this chapter.
SQLTablePrivileges returns the results as a standard result set, ordered by
TABLE_QUALIFIER, TABLE_OWNER, TABLE_NAME, and PRIVILEGE. The following table lists the columns in the result set.
590
SQLTablePrivileges
Important: SQLTablePrivileges might not return privileges for all tables. For example, a Text
driver might only return privileges for files (tables) in the current directory. Applications can use
any valid table, regardless of whether it is returned by SQLTablePrivileges.
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the TABLE_QUALIFIER,
TABLE_OWNER, and TABLE_NAME columns, an application can call SQLGetInfo
with the SQL_MAX_QUALIFIER_NAME_LEN, SQL_MAX_OWNER_NAME_LEN,
and SQL_MAX_TABLE_NAME_LEN options.
Column Name
Data Type
Comments
TABLE_QUALIFIER
Varchar(128)
TABLE_OWNER
Varchar(128)
TABLE_NAME
Varchar(128)
not NULL
Table identifier.
GRANTOR
Varchar(128)
GRANTEE
Varchar(128)
not NULL
591
SQLTablePrivileges
Column Name
Data Type
Comments
PRIVILEGE
Varchar(128)
not NULL
IS_GRANTABLE
Varchar(3)
Code Example
For a code example of a similar function, see SQLColumns.
592
SQLTables
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLColumnPrivileges (extension)
SQLColumns (extension)
SQLExtendedFetch (extension)
SQLFetch
SQLStatistics (extension)
SQLTables (extension)
SQLTables
Extension Level 1
SQLTables returns the list of table names stored in a specific data source. The driver
returns the information as a result set.
Syntax
RETCODE SQLTables(hstmt, szTableQualifier, cbTableQualifier, szTableOwner, cbTableOwner,
szTableName, cbTableName, szTableType, cbTableType)
593
SQLTables
Argument
Use
Description
HSTMT
hstmt
Input
UCHAR FAR *
szTableQualifier
Input
SWORD
cbTableQualifier
Input
Length of szTableQualifier.
UCHAR FAR *
szTableOwner
Input
SWORD
cbTableOwner
Input
Length of szTableOwner.
UCHAR FAR *
szTableName
Input
SWORD
cbTableName
Input
Length of szTableName.
UCHAR FAR *
szTableType
Input
SWORD
cbTableType
Input
Length of szTableType.
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING,
SQL_ERROR or SQL_INVALID_HANDLE.
594
SQLTables
Diagnostics
When SQLTables returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated
SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLTables and explains each one in the context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08S01
Communication
link failure
24000
IM001
S1000
General error
S1001
Memory allocation
failure
595
SQLTables
596
SQLSTATE
Error
Description
S1008
Operation canceled
S1010
Function sequence
error
S1090
Invalid string or
buffer length
SQLTables
SQLSTATE
Error
Description
S1C00
S1T00
Timeout expired
Comments
SQLTables lists all tables in the requested range. A user may or may not have SELECT
privileges to any of these tables. To check accessibility, an application can:
Otherwise, the application must be able to handle a situation where the user selects a
table for which SELECT privileges are not granted.
The szTableOwner and szTableName arguments accept search patterns. For more information about valid search patterns, see Search Pattern Arguments earlier in this chapter.
To support enumeration of qualifiers, owners, and table types, SQLTables defines the
following special semantics for the szTableQualifier, szTableOwner, szTableName, and
szTableType arguments:
If szTableQualifier is a single percent character (%) and szTableOwner and szTableName are empty strings, then the result set contains a list of valid qualifiers for
the data source. (All columns except the TABLE_QUALIFIER column contain
NULLs.)
597
SQLTables
If szTableOwner is a single percent character (%) and szTableQualifier and szTableName are empty strings, then the result set contains a list of valid owners for the
data source. (All columns except the TABLE_OWNER column contain NULLs.)
598
SQLTables
The lengths of VARCHAR columns shown in the table are maximums; the actual lengths
depend on the data source. To determine the actual lengths of the TABLE_QUALIFIER,
TABLE_OWNER, and TABLE_NAME columns, an application can call SQLGetInfo
with the SQL_MAX_QUALIFIER_NAME_LEN, SQL_MAX_OWNER_NAME_LEN,
and SQL_MAX_TABLE_NAME_LEN options.
Column Name
Data Type
Comments
TABLE_QUALIFIER
Varchar(128)
TABLE_OWNER
Varchar(128)
TABLE_NAME
Varchar(128)
Table identifier.
TABLE_TYPE
Varchar(128)
REMARKS
Varchar(254)
Code Example
For a code example of a similar function, see SQLColumns.
599
SQLTransact
Related Functions
For information about
See
SQLBindCol
SQLCancel
SQLColumnPrivileges (extension)
SQLColumns (extension)
SQLExtendedFetch (extension)
SQLFetch
SQLStatistics (extension)
SQLTablePrivileges (extension)
SQLTransact
Core
SQLTransact requests a commit or rollback operation for all active operations on all
hstmts associated with a connection. SQLTransact can also request that a commit or rollback operation be performed for all connections associated with the henv.
Syntax
RETCODE SQLTransact(henv, hdbc, fType)
600
SQLTransact
Argument
Use
Description
HENV
henv
Input
Environment handle.
HDBC
hdbc
Input
Connection handle.
UWORD
fType
Input
Returns
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or
SQL_INVALID_HANDLE.
Diagnostics
When SQLTransact returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated
SQLSTATE value may be obtained by calling SQLError. The following table lists the
SQLSTATE values commonly returned by SQLTransact and explains each one in the
context of this function; the notation (DM) precedes the descriptions of SQLSTATEs
returned by the Driver Manager. The return code associated with each SQLSTATE value
is SQL_ERROR, unless noted otherwise.
SQLSTATE
Error
Description
01000
General warning
08003
Connection not
open
08007
Connection failure
during transaction
601
SQLTransact
SQLSTATE
Error
Description
IM001
S1000
General error
S1001
Memory allocation
failure
S1010
Function sequence
error
S1012
Invalid transaction
operation code
S1C00
Comments
If hdbc is SQL_NULL_HDBC and henv is a valid environment handle, then the Driver
Manager will attempt to commit or roll back transactions on all hdbcs that are in a connected state. The Driver Manager calls SQLTransact in the driver associated with each
hdbc. The Driver Manager will return SQL_SUCCESS only if it receives SQL_SUCCESS
for each hdbc. If the Driver Manager receives SQL_ERROR on one or more hdbcs, it will
return SQL_ERROR to the application. To determine which connection(s) failed during
the commit or rollback operation, the application can call SQLError for each hdbc.
602
SQLTransact
Important: The Driver Manager does not simulate a global transaction across all hdbcs and therefore does not use two-phase commit protocols.
If hdbc is a valid connection handle, henv is ignored and the Driver Manager calls SQLTransact in the driver for the hdbc.
If hdbc is SQL_NULL_HDBC and henv is SQL_NULL_HENV, SQLTransact returns
SQL_INVALID_HANDLE.
If fType is SQL_COMMIT, SQLTransact issues a commit request for all active operations
on any hstmt associated with an affected hdbc. If fType is
SQL_ROLLBACK, SQLTransact issues a rollback request for all active operations on any
hstmt associated with an affected hdbc. If no transactions are active, SQLTransact returns
SQL_SUCCESS with no effect on any data sources.
If the driver is in manual-commit mode (by calling SQLSetConnectOption with the
SQL_AUTOCOMMIT option set to zero), a new transaction is implicitly started when an
SQL statement that can be contained within a transaction is executed against the current
data source.
To determine how transaction operations affect cursors, an application calls SQLGetInfo
with the SQL_CURSOR_ROLLBACK_BEHAVIOR and
SQL_CURSOR_COMMIT_BEHAVIOR options.
If the SQL_CURSOR_ROLLBACK_BEHAVIOR or
SQL_CURSOR_COMMIT_BEHAVIOR value equals SQL_CB_DELETE, SQLTransact
closes and deletes all open cursors on all hstmts associated with the hdbc and discards all
pending results. SQLTransact leaves any hstmt present in an allocated (unprepared)
state; the application can reuse them for subsequent SQL requests or can call SQLFreeStmt to deallocate them.
If the SQL_CURSOR_ROLLBACK_BEHAVIOR or
SQL_CURSOR_COMMIT_BEHAVIOR value equals SQL_CB_CLOSE, SQLTransact
closes all open cursors on all hstmts associated with the hdbc. SQLTransact leaves any
hstmt present in a prepared state; the application can call SQLExecute for an hstmt
associated with the hdbc without first calling SQLPrepare.
If the SQL_CURSOR_ROLLBACK_BEHAVIOR or
SQL_CURSOR_COMMIT_BEHAVIOR value equals SQL_CB_PRESERVE, SQLTransact
does not affect open cursors associated with the hdbc. Cursors remain at the row they
pointed to prior to the call to SQLTransact.
603
SQLTransact
For drivers and data sources that support transactions, calling SQLTransact with either
SQL_COMMIT or SQL_ROLLBACK when no transaction is active will return
SQL_SUCCESS (indicating that there is no work to be committed or rolled back) and
have no effect on the data source.
Drivers or data sources that do not support transactions (SQLGetInfo fOption
SQL_TXN_CAPABLE is 0) are effectively always in autocommit mode. Therefore, calling SQLTransact with SQL_COMMIT will return SQL_SUCCESS. However, calling
SQLTransact with SQL_ROLLBACK will result in SQLSTATE S1C00 (Driver not capable), indicating that a rollback can never be performed.
Code Example
See SQLParamOptions.
Related Functions
604
See
SQLGetInfo (extension)
SQLFreeStmt
Chapter 55
ConfigDSN
Purpose
ConfigDSN adds, modifies, or deletes data sources from the .odbc.ini file. It may prompt the user
for connection information. It can be in the driver shared library or a separate setup shared library.
Syntax
BOOL ConfigDSN(hwndParent, fRequest, lpszDriver, lpszAttributes)
605
ConfigDSN
Argument
Use
Description
HWND
hwndParent
Input
UINT
fRequest
Input
LPCSTR
lpszDriver
Input
LPCSTR
lpszAttributes
Input
Returns
The function returns TRUE if it is successful. It returns FALSE if it fails.
Comments
ConfigDSN receives connection information from the installer shared library as a list of
attributes in the form of keyword-value pairs. Each pair is terminated with a null byte
and the entire list is terminated with a null byte (that is, two null bytes mark the end of
the list). The keywords used by ConfigDSN are the same as those used by SQLBrowseConnect and SQLDriverConnect, except that ConfigDSN does not accept the
DRIVER keyword. As in SQLBrowseConnect and SQLDriverConnect, the keywords
and their values should not contain the []{}(),;?*=!@\ characters, and the value of the
DSN keyword cannot consist only of blanks.
606
ConfigDSN
For example, to configure a data source that requires a user ID, password, and database
name, a setup application might pass the following keyword-value pairs:
DSN=Personnel Data\0UID=Smith\0PWD=Sesame\0DATABASE=Personnel\0\0
For more information about these keywords, see SQLDriverConnect and each drivers
documentation.
In order to display a dialog box, hwndParent must not be null.
607
ConfigTranslator
ConfigTranslator
Purpose
ConfigTranslator returns a default translation option for a translator. It can be in the
translator shared library or a separate setup shared library.
Syntax
BOOL ConfigTranslator(hwndParent, pvOption)
608
ConfigTranslator
Argument
Use
Description
HWND
hwndParent
Input
DWORD FAR *
pvOption
Output
Returns
The function returns TRUE if it is successful. It returns FALSE if it fails.
Comments
If the translator supports only a single translation option, ConfigTranslator returns
TRUE and sets pvOption to the 32-bit option. Otherwise, it determines the default translation option to use. ConfigTranslator can display a dialog box with which a user selects
a default translation option.
Related Functions
For information about
See
SQLGetConnectOption
Selecting a translator
SQLGetTranslator
SQLSetConnectOption
609
ConfigTranslator
610
Chapter 56
SQLDataSourceToDriver
Extension Level 2
SQLDataSourceToDriver supports translations for ODBC drivers. This function is not
called by ODBC-enabled applications; applications request translation through SQLSetConnectOption. The driver associated with the hdbc specified in SQLSetConnectOption
calls the specified shared library to perform translations of all data flowing from the data
source to the driver. A default translation shared library can be specified in the ODBC initialization file.
Syntax
BOOL SQLDataSourceToDriver(fOption, fSqlType, rgbValueIn, cbValueIn, rgbValueOut, cbValueOutMax, pcbValueOut, szErrorMsg, cbErrorMsgMax, pcbErrorMsg)
611
SQLDataSourceToDriver
612
Type
Argument
Use
Description
UDWORD
fOption
Input
Option value.
SWORD
fSqlType
Input
PTR
rgbValueIn
Input
Value to translate.
SDWORD
cbValueIn
Input
Length of rgbValueIn.
PTR
rgbValueOut
Output
SDWORD
cbValueOutMax
Input
Length of rgbValueOut.
SQLDataSourceToDriver
Type
Argument
Use
Description
SDWORD FAR
*
pcbValueOut
Output
The total number of bytes (excluding the null termination byte) available to return in rgbValueOut.
For character or binary data, if this
is greater than or equal to cbValueOutMax, the data in rgbValueOut is
truncated to cbValueOutMax bytes.
For all other data types, the value
of cbValueOutMax is ignored and
the translation shared library assumes the size of rgbValueOut is the
size of the default C data type of
the SQL data type specified with
fSqlType.
UCHAR FAR *
szErrorMsg
Output
SWORD
cbErrorMsgMax
Input
Length of szErrorMsg.
SWORD FAR *
pcbErrorMsg
Output
Returns
TRUE if the translation was successful.
FALSE if the translation failed.
Comments
The driver calls SQLDataSourceToDriver to translate all data (result set data, table
names, row counts, error messages, and so on) passing from the data source to the driver.
The translation shared library may not translate some data, depending on the datas type
613
SQLDataSourceToDriver
and the purpose of the translation shared library; for example, a shared library that
translates character data from one code page to another ignores all numeric and binary
data.
The value of fOption is set to the value of vParam specified by calling SQLSetConnectOption with the SQL_TRANSLATE_OPTION option. It is a 32-bit value which has a
specific meaning for a given translation shared library. For example, it could specify a
certain character set translation.
If the same buffer is specified for rgbValueIn and rgbValueOut, the translation of data in
the buffer will be performed in place.
Note that, although cbValueIn, cbValueOutMax, and pcbValueOut are of the type
SDWORD, SQLDataSourceToDriver does not necessarily support huge pointers.
If SQLDataSourceToDriver returns FALSE, data truncation may have occurred during
translation. If pcbValueOut, the number of bytes available to return in the output buffer,
is greater than cbValueOutMax, the length of the output buffer, then truncation occurred.
The driver must determine whether the truncation was acceptable. If truncation did not
occur, the SQLDataSourceToDriver returned FALSE due to another error. In either case,
a specific error message is returned in szErrorMsg.
For more information about translating data, see Translating Data in Chapter 13,
Establishing Connections.
614
SQLDriverToDataSource
Related Functions
For information about
See
SQLDriverToDataSource
SQLGetConnectOption (extension)
SQLSetConnectOption (extension)
SQLDriverToDataSource
Extension Level 2
SQLDriverToDataSource supports translations for ODBC drivers. This function is not
called by ODBC-enabled applications; applications request translation through SQLSetConnectOption. The driver associated with the hdbc specified in SQLSetConnectOption
calls the specified shared library to perform translations of all data flowing from the
driver to the data source. A default translation shared library can be specified in the
ODBC initialization file.
Syntax
BOOL SQLDriverToDataSource(fOption, fSqlType, rgbValueIn, cbValueIn, rgbValueOut,
cbValueOutMax, pcbValueOut, szErrorMsg, cbErrorMsg, pcbErrorMsg)
615
SQLDriverToDataSource
616
Type
Argument
Use
Description
UDWORD
fOption
Input
Option value.
SWORD
fSqlType
Input
The ODBC SQL data type. This argument tells the driver how to convert rgbValueIn into a form
acceptable by the data source. This
must be one of the following values:
SQL_BIGINT
SQL_BINARY
SQL_BIT
SQL_CHAR
SQL_DATE
SQL_DECIMAL
SQL_DOUBLE
SQL_FLOAT
SQL_INTEGER
SQL_LONGVARBINARY
SQL_LONGVARCHAR
SQL_NUMERIC
SQL_REAL
SQL_SMALLINT
SQL_TIME
SQL_TIMESTAMP
SQL_TINYINT
SQL_VARBINARY
SQL_VARCHAR
For information about SQL data
types, see SQL Data Types in
Appendix D, Data Types.
PTR
rgbValueIn
Input
Value to translate.
SDWORD
cbValueIn
Input
Length of rgbValueIn.
PTR
rgbValueOut
Output
SDWORD
cbValueOutMax
Input
Length of rgbValueOut.
SQLDriverToDataSource
Type
Argument
Use
Description
Output
UCHAR FAR *
szErrorMsg
Output
Pointer to storage for an error message. This is an empty string unless the translation failed.
SWORD
cbErrorMsgMax
Input
Length of szErrorMsg.
SWORD FAR *
pcbErrorMsg
Output
Returns
TRUE if the translation was successful.
FALSE if the translation failed.
617
SQLDriverToDataSource
Comments
The driver calls SQLDriverToDataSource to translate all data (SQL statements, parameters, and so on) passing from the driver to the data source. The translation shared library
may not translate some data, depending on the datas type and the purpose of the translation shared library. For example, a shared library that translates character data from one
code page to another ignores all numeric and binary data.
The value of fOption is set to the value of vParam specified by calling SQLSetConnectOption with the SQL_TRANSLATE_OPTION option. It is a 32-bit value which has a
specific meaning for a given translation shared library. For example, it could specify a certain character set translation.
If the same buffer is specified for rgbValueIn and rgbValueOut, the translation of data in
the buffer will be performed in-place.
Note that, although cbValueIn, cbValueOutMax, and pcbValueOut are of the type
SDWORD, SQLDriverToDataSource does not necessarily support huge pointers.
If SQLDriverToDataSource returns FALSE, data truncation may have occurred during
translation. If pcbValueOut, the number of bytes available to return in the output buffer,
is greater than cbValueOutMax, the length of the output buffer, then truncation occurred.
The driver must determine whether or not the truncation was acceptable. If truncation
did not occur, the SQLDriverToDataSource returned FALSE due to another error. In
either case, a specific error message is returned in szErrorMsg.
For more information about translating data, see Translating Data in Chapter 13,
Establishing Connections.
Related Functions
For information about
See
618
SQLSetConnectOption (extension)
Appendix A
SQLSTATE
Error
01000
General warning
01002
Disconnect error
SQLDisconnect
619
SQLSTATE
Error
01004
Data truncated
SQLBrowseConnect
SQLColAttributes
SQLDataSources
SQLDescribeCol
SQLDriverConnect
SQLDrivers
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLGetCursorName
SQLGetData
SQLGetInfo
SQLNativeSql
SQLPutData
SQLSetPos
01006
SQLExecDirect
SQLExecute
01S00
01S01
Error in row
SQLExtendedFetch
SQLSetPos
01S02
SQLSetConnectOption
SQLSetStmtOption
01S03
01S04
SQLExecDirect
SQLExecute
SQLSetPos
07001
SQLExecDirect
SQLExecute
07006
SQLBindParameter
SQLExtendedFetch
SQLFetch
SQLGetData
SQLSTATE
Error
08001
SQLBrowseConnect
SQLConnect
SQLDriverConnect
08002
Connection in use
SQLBrowseConnect
SQLConnect
SQLDriverConnect
SQLSetConnectOption
08003
SQLAllocStmt
SQLDisconnect
SQLGetConnectOption
SQLGetInfo
SQLNativeSql
SQLSetConnectOption
SQLTransact
08004
SQLBrowseConnect
SQLConnect
SQLDriverConnect
08007
SQLTransact
621
622
SQLSTATE
Error
08S01
SQLBrowseConnect
SQLColumnPrivileges
SQLColumns
SQLConnect
SQLDriverConnect
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLForeignKeys
SQLFreeConnect
SQLGetData
SQLGetTypeInfo
SQLParamData
SQLPrepare
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLPutData
SQLSetConnectOption
SQLSetStmtOption
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
21S01
SQLExecDirect
SQLPrepare
21S02
SQLExecDirect
SQLPrepare
SQLSetPos
22001
SQLPutData
22003
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLGetData
SQLGetInfo
SQLPutData
SQLSetPos
SQLSTATE
Error
22005
Error in assignment
SQLExecDirect
SQLExecute
SQLGetData
SQLPrepare
SQLPutData
SQLSetPos
22008
SQLExecDirect
SQLExecute
SQLGetData
SQLPutData
SQLSetPos
22012
Division by zero
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
22026
SQLParamData
23000
SQLExecDirect
SQLExecute
SQLSetPos
623
624
SQLSTATE
Error
24000
SQLColAttributes
SQLColumnPrivileges
SQLColumns
SQLDescribeCol
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLForeignKeys
SQLGetData
SQLGetStmtOption
SQLGetTypeInfo
SQLPrepare
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLSetCursorName
SQLSetPos
SQLSetStmtOption
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
25000
SQLDisconnect
28000
SQLBrowseConnect
SQLConnect
SQLDriverConnect
34000
SQLExecDirect
SQLPrepare
SQLSetCursorName
37000
3C000
SQLSetCursorName
40001
Serialization failure
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLSTATE
Error
42000
70100
Operation aborted
SQLCancel
IM001
IM002
SQLBrowseConnect
SQLConnect
SQLDriverConnect
IM003
SQLBrowseConnect
SQLConnect
SQLDriverConnect
IM004
Drivers SQLAllocEnv
failed
SQLBrowseConnect
SQLConnect
SQLDriverConnect
IM005
Drivers SQLAllocConnect
failed
SQLBrowseConnect
SQLConnect
SQLDriverConnect
IM006
SQLBrowseConnect
SQLConnect
SQLDriverConnect
IM007
SQLDriverConnect
IM008
Dialog failed
SQLDriverConnect
625
626
SQLSTATE
Error
IM009
SQLBrowseConnect
SQLConnect
SQLDriverConnect
SQLSetConnectOption
IM010
SQLBrowseConnect
SQLDriverConnect
IM011
SQLBrowseConnect
SQLDriverConnect
IM012
IM013
S0001
SQLExecDirect
SQLPrepare
S0002
SQLExecDirect
SQLPrepare
S0011
SQLExecDirect
SQLPrepare
S0012
SQLExecDirect
SQLPrepare
S0021
SQLExecDirect
SQLPrepare
S0022
SQLExecDirect
SQLPrepare
S0023
SQLSetPos
S1000
General error
S1001
SQLSTATE
Error
S1002
SQLBindCol
SQLColAttributes
SQLDescribeCol
SQLExtendedFetch
SQLFetch
SQLGetData
S1003
SQLBindCol
SQLBindParameter
SQLGetData
S1004
SQLBindParameter
SQLGetTypeInfo
S1008
Operation canceled
627
628
SQLSTATE
Error
S1009
SQLAllocConnect
SQLAllocStmt
SQLBindCol
SQLBindParameter
SQLExecDirect
SQLForeignKeys
SQLGetData
SQLGetInfo
SQLNativeSql
SQLPrepare
SQLPutData
SQLSetConnectOption
SQLSetCursorName
SQLSetPos
SQLSetStmtOption
SQLSTATE
Error
S1010
SQLBindCol
SQLBindParameter
SQLColAttributes
SQLColumnPrivileges
SQLColumns
SQLDescribeCol
SQLDescribeParam
SQLDisconnect
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLForeignKeys
SQLFreeConnect
SQLFreeEnv
SQLFreeStmt
SQLGetConnectOption
SQLGetCursorName
SQLGetData
SQLGetFunctions
SQLGetStmtOption
SQLGetTypeInfo
SQLMoreResults
SQLNumParams
SQLNumResultCols
SQLParamData
SQLParamOptions
SQLPrepare
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLPutData
SQLRowCount
SQLSetConnectOption
SQLSetCursorName
SQLSetPos
SQLSetScrollOptions
SQLSetStmtOption
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
SQLTransact
629
630
SQLSTATE
Error
S1011
SQLGetStmtOption
SQLSetConnectOption
SQLSetStmtOption
S1012
SQLTransact
S1015
SQLGetCursorName
S1090
SQLBindCol
SQLBindParameter
SQLBrowseConnect
SQLColAttributes
SQLColumnPrivileges
SQLColumns
SQLConnect
SQLDataSources
SQLDescribeCol
SQLDriverConnect
SQLDrivers
SQLExecDirect
SQLExecute
SQLForeignKeys
SQLGetCursorName
SQLGetData
SQLGetInfo
SQLNativeSql
SQLPrepare
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLPutData
SQLSetCursorName
SQLSetPos
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
S1091
SQLSTATE
Error
S1092
SQLFreeStmt
SQLGetConnectOption
SQLGetStmtOption
SQLSetConnectOption
SQLSetStmtOption
S1093
SQLBindParameter
SQLDescribeParam
S1094
SQLBindParameter
S1095
SQLGetFunctions
S1096
SQLGetInfo
S1097
SQLSpecialColumns
S1098
SQLSpecialColumns
S1099
SQLSpecialColumns
S1100
SQLStatistics
S1101
SQLStatistics
S1103
SQLDataSources
SQLDrivers
S1104
SQLBindParameter
S1105
SQLBindParameter
S1106
SQLExtendedFetch
S1107
SQLExtendedFetch
SQLParamOptions
SQLSetPos
SQLSetScrollOptions
S1108
SQLSetScrollOptions
631
632
SQLSTATE
Error
S1109
SQLExecute
SQLExecDirect
SQLGetData
SQLGetStmtOption
SQLSetPos
S1110
SQLDriverConnect
S1111
SQLExtendedFetch
SQLSTATE
Error
S1C00
SQLBindCol
SQLBindParameter
SQLColAttributes
SQLColumnPrivileges
SQLColumns
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLForeignKeys
SQLGetConnectOption
SQLGetData
SQLGetInfo
SQLGetStmtOption
SQLGetTypeInfo
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLSetConnectOption
SQLSetPos
SQLSetScrollOptions
SQLSetStmtOption
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
SQLTransact
633
634
SQLSTATE
Error
S1T00
Timeout expired
SQLBrowseConnect
SQLColAttributes
SQLColumnPrivileges
SQLColumns
SQLConnect
SQLDescribeCol
SQLDescribeParam
SQLDriverConnect
SQLExecDirect
SQLExecute
SQLExtendedFetch
SQLFetch
SQLForeignKeys
SQLGetData
SQLGetInfo
SQLGetTypeInfo
SQLMoreResults
SQLNumParams
SQLNumResultCols
SQLParamData
SQLPrepare
SQLPrimaryKeys
SQLProcedureColumns
SQLProcedures
SQLPutData
SQLSetPos
SQLSpecialColumns
SQLStatistics
SQLTablePrivileges
SQLTables
Appendix B
En, Cn, or Sn. The environment, connection, or statement state moves to the specified state.
(IH). The function returned SQL_INVALID_HANDLE. Although this error is possible in any state, it is shown only when it is the only possible outcome of calling
the function in the specified state. This error does not change the state and is
always detected by the Driver Manager, as indicated by the parentheses.
NS. Next State. The statement transition is the same as if the statement had not
gone through the asynchronous states. For example, suppose a statement that creates a result set enters state S11 from state S1 because SQLExecDirect returned
SQL_STILL_EXECUTING. The NS notation in state S11 means that the transitions
for the statement are the same as those for a statement in state S1 that creates a
result set: if SQLExecDirect returns an error; the statement remains in state S1; if it
succeeds, the statement moves to state S5; if it needs data, the statement moves to
state S8; and if it is still executing, it remains in state S11.
XXXXX or (XXXXX). An SQLSTATE that is related to the transition table; SQLSTATEs detected by the Driver Manager are enclosed in parentheses. The function
635
returned SQL_ERROR and the specified SQLSTATE, but the state does not change.
For example, if SQLExecute is called before SQLPrepare, it returns SQLSTATE
S1010 (Function sequence error).
Note The tables do not show errors unrelated to the transition tables that do not change the
state. For example, when SQLAllocConnect is called inenvironment state E1 and returns
SQLSTATE S1001 (Memory allocation failure), the environment remains in state E1; this is
not shown in the environment transition table for SQLAllocConnect.
If the environment, connection, or statement can move to more than one state, each
possible state is shown and one or more footnotes explains the conditions under which
each transition takes place. The following footnotes may appear in any table:
Footnote
Meaning
Before or after. The cursor was positioned before the start of the result
set or after the end of the result set.
Invalid row. The cursor was positioned on a row in the result set and
the value in the rgfRowStatus array in SQLExtendedFetch for the row
was SQL_DELETED or SQL_ERROR.
nf
np
nr
No results. The statement will not or did not create a result set.
Results. The statement will or did create a (possibly empty) result set.
Environment Transitions
Footnote
Meaning
Valid row. The cursor was positioned on a row in the result set and the
value in the rgfRowStatus array in SQLExtendedFetch for the row was
SQL_ADDED, SQL_SUCCESS, or SQL_UPDATED.
For example, the environment state transition table for SQLFreeEnv is:
SQLFreeEnv
E0
Unallocated
E1
Allocated
E2
hdbc
(IH)
E0
(S1010)
Environment Transitions
The ODBC environment has the following three states:
State
Description
E0
Unallocated henv
E1
E2
The following tables show how each ODBC function affects the environment state.
637
Environment Transitions
SQLAllocConnect
E0
Unallocated
E1
Allocated
E2
hdbc
(IH)
E2
-- 1
1 Calling SQLAllocConnect with a pointer to a valid hdbc overwrites that hdbc. This may
be an application programming error.
SQLAllocEnv
E0
Unallocated
E1
Allocated
E2
hdbc
E1
-- 1
E1 1
1 Calling SQLAllocEnv with a pointer to a valid henv overwrites that henv. This may be
an application programming error.
SQLDataSources and SQLDrivers
E0
Unallocated
E1
Allocated
E2
hdbc
(IH)
--
--
E0
Unallocated
E1
Allocated
E2
hdbc
(IH) 1
--
--
SQLError
1 This row shows transitions when henv was non-null, hdbc was SQL_NULL_HDBC, and
hstmt was SQL_NULL_HSTMT.
638
Environment Transitions
SQLFreeConnect
E0
Unallocated
E1
Allocated
E2
hdbc
(IH)
(IH)
-- 1
E1 2
E1
Allocated
E2
hdbc
(IH)
E0
(S1010)
E0
Unallocated
E1
Allocated
E2
hdbc
(IH)
-- 1
-- 1
SQLTransact
639
Connection Transitions
E1
Allocated
E2
hdbc
(IH)
(IH)
--
Connection Transitions
ODBC connections have the following states:
State
Description
C0
C1
C2
C3
C4
Connected hdbc
C5
C6
The following tables show how each ODBC function affects the connection state.
SQLAllocConnect
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
C2
-- 1
C2 1
C2 1
C2 1
C2 1
1 Calling SQLAllocConnect with a pointer to a valid hdbc overwrites that hdbc. This may
be an application programming error.
640
Connection Transitions
SQLAllocEnv
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
C1
-- 1
C1 1
C1 1
C1 1
C1 1
C1 1
1 Calling SQLAllocEnv with a pointer to a valid henv overwrites that henv. This may be
an application programming error.
SQLAllocStmt
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(08003)
(08003)
C5
-- 1
C5 1
1 Calling SQLAllocStmt with a pointer to a valid hstmt overwrites that hstmt. This may
be an application programming error.
641
Connection Transitions
SQLBrowseConnect
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
C3 d
C4 s
-- d
C2 e
C4 s
(08002)
(08002)
(08002)
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(IH)
(IH)
(IH)
-- 1
C6 2
--
1 The data source was in auto-commit mode or did not begin a transaction.
2 The data source was in manual-commit mode and began a transaction.
SQLColumns: see SQLColumnPrivileges
642
Connection Transitions
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
C4
(08002)
(08002)
(08002)
(08002)
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
--
--
--
--
--
--
SQLDisconnect
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(08003)
C2
C2
C2
25000
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH) 1
(IH)
--
--
--
--
--
1 This row shows transitions when hdbc was non-null and hstmt was
SQL_NULL_HSTMT.
643
Connection Transitions
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(IH)
(IH)
(IH)
-- 1
C6 2
--
1 The data source was in auto-commit mode or did not begin a transaction.
2 The data source was in manual-commit mode and began a transaction.
SQLExecute: see SQLExecDirect
SQLForeignKeys: see SQLColumnPrivileges
SQLFreeConnect
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
C1
(S1010)
(S1010)
(S1010)
(S1010)
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
C0 1
(S1010) 2
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
SQLFreeEnv
644
Connection Transitions
SQLFreeStmt
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(IH)
(IH)
(IH)
-- 1
C4 2
-- 1
C4 2
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
-- 1
(08003) 2
(S1010)
--
--
--
645
Connection Transitions
SQLGetFunctions
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(S1010)
(S1010)
--
--
--
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
-- 1
(08003) 2
(08003)
--
--
--
SQLGetInfo
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(08003)
(08003)
--
--
--
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(IH)
(IH)
(IH)
-- 1
C6 2
--
SQLPrepare
1 The data source was in auto-commit mode or did not begin a transaction.
2 The data source was in manual commit mode and began a transaction.
646
Connection Transitions
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
-- 1
(08003) 2
(S1010)
-- 3
(08002) 4
-- 3
-- 3 and 5
C5 6
(08002) 4
S1011 7
(08002) 4
647
Connection Transitions
SQLTransact
C0
No henv
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH) 1
(IH)
(IH)
(IH)
(IH)
(IH)
(IH)
(IH) 2
--
(08003)
(08003)
--
--
-- e and 4
C5 s or 5
(IH) 3
(IH)
(08003)
(08003)
--
--
-- e
C5 s
1 This row shows transitions when henv was SQL_NULL_HENV and hdbc was
SQL_NULL_HDBC.
2 This row shows transitions when henv was a valid environment handle and hdbc was
SQL_NULL_HDBC.
3 This row shows transitions when hdbc was a valid connection handle.
4 The commit or rollback failed on the connection.
5 The function returned SQL_ERROR but the commit or rollback succeeded on the connection.
648
Statement Transitions
C1
Unallocated
C2
Allocated
C3
Need Data
C4
Connected
C5
hstmt
C6
Transaction
(IH)
(IH)
(IH)
(IH)
(IH)
--
--
Statement Transitions
ODBC statements have the following states:
State
Description
S0
S1
Allocated hstmt.
S2
S3
S4
S5
Statement executed and a (possibly empty) result set was created. The
cursor is open and positioned before the first row of the result set.
S6
S7
S8
S9
S10
649
Statement Transitions
State
Description
S11
Still executing.
S12
States S2 and S3 are known as the prepared states, states S5 through S7 as the cursor
states, states S8 through S10 as the need data states, and states S11 and S12 as the asynchronous states. In each of these groups, the transitions are shown separately only when
they are different for each state in the group; generally, the transitions for each state in
each a group are the same.
The following tables show how each ODBC function affects the statement state.
SQLAllocConnect
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
-- 1
S0 1
S0 1
S0 1
S0 1
S0 1
S0 1
1 Calling SQLAllocConnect with a pointer to a valid hdbc overwrites that hdbc. This may
be an application programming error. Furthermore, this returns the connection state to
C2; the connection state must be C4 before the statement state is S0.
650
Statement Transitions
SQLAllocEnv
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
-- 1
S0 1
S0 1
S0 1
S0 1
S0 1
S0 1
1 Calling SQLAllocEnv with a pointer to a valid henv overwrites that henv. This may be
an application programming error. Furthermore, this returns the connection state to C1;
the connection state must be C4 before the statement state is S0.
SQLAllocStmt
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
S1
-- 1
S1 1
S1 1
S1 1
S1 1
S1 1
1 Calling SQLAllocStmt with a pointer to a valid hstmt overwrites that hstmt. This may
be an application programming error.
SQLBindCol
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
--
--
--
--
(S1010)
(S1010)
651
Statement Transitions
SQLBindParameter
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
--
--
--
--
(S1010)
(S1010)
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(08002)
(08002)
(08002)
(08002)
(08002)
(08002)
(08002)
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
--
--
S1 np
S2 p
S1 np
S1 2
S2 nr and 3
S3 r and 3
S7 4
S12
SQLCancel 1
S3 p
1 This table does not cover cancellation of a function running synchronously on one
thread when an application calls SQLCancel on a different thread with the same hstmt.
In this case, the driver must note that SQLCancel was called and return the correct
return code and SQLSTATE (if any) from the synchronous function. The statement transition when that function finishes is NS (Next State). That is, the statement transition is
the same as if the function completed processing normally; the only difference is that it
is possible for the function to return SQL_ERROR and SQLSTATE S1008 (Operation canceled).
2 SQLExecDirect returned SQL_NEED_DATA.
3 SQLExecute returned SQL_NEED_DATA.
4 SQLSetPos returned SQL_NEED_DATA.
652
Statement Transitions
SQLColAttributes
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
see below
24000
-- s
S11 x
(S1010)
NS c
(S1010) o
S3
Results
24000
-- s
S11 x
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
S5 s
S11 x
S1 e
S5 s
S11 x
S1 e
see below
(S1010)
NS c
(S1010) o
S5 s
S11 x
S6
SQLFetch
S7
SQLExtendedFetch
24000
(24000)
(24000)
Statement Transitions
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
--
--
--
--
--
--
--
SQLDescribeCol
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
see below
24000
-- s
S11 x
(S1010)
NS c
(S1010) o
S3
Results
24000
-- s
S11 x
SQLDescribeParam
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
-- s
S11 x
-- s
-- s
(S1010)
NS c
(S1010) o
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
-- 1
S0 1
S0 1
S0 1
S0 1
(S1010)
(S1010)
S11 x
S11 x
SQLDisconnect
654
Statement Transitions
1 Calling SQLDisconnect frees all hstmts associated with the hdbc. Furthermore, this
returns the connection state to C2; the connection state must be C4 before the statement
state is S0.
SQLDriverConnect: see SQLBrowseConnect
SQLDrivers: see SQLDataSources
SQLError
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH) 1
--
--
--
--
--
--
655
Statement Transitions
SQLExecDirect
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
S4 s and nr
S5 s and r
S8 d
S11 x
S1 e
S4 s and nr
S5 s and r
S8 d
S11 x
S1 e
see
below
(S1010)
NS c
(S1010) o
S4 s and nr
S5 s and r
S8 d
S11 x
S6
SQLFetch
S7
SQLExtendedFetch
24000
(24000)
(24000)
SQLExecute
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
(IH)
(S1010)
see below
S2 e and p
see
S4 s, p, and nr below
S8 d and p
S11 x and p
(S1010) np
656
S2
No Results
S3
Results
S4 s
S8 d
S11 x
S5 s
S8 d
S11 x
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(S1010)
NS c
(S1010) o
Statement Transitions
S6
SQLFetch
S7
SQLExtendedFetch
24000 p
(S1010) np
(24000) p
(S1010) np
(24000) p
(S1010) np
SQLExtendedFetch
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
(S1010)
24000
see
below
(S1010)
NS c
(S1010) o
S6
SQLFetch
S7
SQLExtendedFetch
S7 s or nf
S11 x
(S1010)
-- s or nf
S11 x
SQLFetch
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
(S1010)
24000
see
below
(S1010)
NS c
(S1010) o
657
Statement Transitions
S6
SQLFetch
S7
SQLExtendedFetch
S6 s or nf
S11 x
-- s or nf
S11 x
(S1010)
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH) 1
--
--
S1 np
S2 p
S1 np
S3 p
(S1010)
(S1010)
(IH) 2
S0
S0
S0
S0
(S1010)
(S1010)
(IH) 3
--
--
--
--
(S1010)
(S1010)
SQLFreeEnv
SQLFreeStmt
Statement Transitions
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
--
--
--
--
--
--
--
SQLGetCursorName
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
-- 1
(S1015) 2
-- 1
(S1015) 2
-- 1
--
(S1010)
(S1010)
(S1015) 2
1 A cursor name had been set by calling SQLSetCursorName or by creating a result set.
2 A cursor name had not been set by calling SQLSetCursorName or by creating a result
set.
659
Statement Transitions
SQLGetData
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
(S1010)
(24000)
see below
(S1010)
NS c
(S1010) o
S6
SQLFetch
S7
SQLExtendedFetch
(24000)
-- s or nf
S11 x
24000 3
-- s or nf
S11 x
24000 b
S1109 i
S1C00 v and 1
1 The rowset size was greater than 1 and the SQLGetInfo did not return the
SQL_GD_BLOCK bit for the SQL_GETDATA_EXTENSIONS information type.
660
Statement Transitions
SQLGetFunctions
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
--
--
--
--
--
--
--
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
--
--
--
--
--
--
--
SQLGetInfo
SQLGetStmtOption
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
-- 1
(24000) 2
-- 1
(24000) 2
-- 1
see
below
(S1010)
(S1010)
(24000) 2
S6
SQLFetch
S7
SQLExtendedFetch
-- 1
(24000) 2 or 3
-- 1 or (v and 3)
24000 b and 3
S1011 2
S1109 i and 3
-- 1 or (v and (2 or 3))
24000 b and (2 or 3)
S1109 i and (2 or 3)
Statement Transitions
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor 1
S8 S10
Need Data
S11 S12
Async
(IH)
-- 2
-- 2
S1 nf and np
S2 nf and p
S11 x
-- s
S1 nf and
(S1010)
NS c
(S1010) o
np
S3 nf and p
S11 x
1 For SQLMoreResults, the cursor states are somewhat modified. A batch statement,
statement submitted with an array of parameters, or procedure can return result sets
and INSERT, UPDATE, or DELETE row counts; these are collectively known as results.
After the statement is executed, it moves to the S4 state if there are no results and the S5
state if there are results. In the S5 state, SQLFetch or SQLExtendedFetch returns SQLSTATE 24000 (Invalid cursor state) if the next result is a row count; the application must
call SQLMoreResults to stop processing the current result and proceed to the next
result. After the last result is processed, SQLMoreResults returns the statement to the
allocated or prepared state.
2 The function always returns SQL_NO_DATA_FOUND in this state.
662
Statement Transitions
SQLNativeSql
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
--
--
--
--
--
--
--
SQLNumParams
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
-- s
S11 x
-- s
-- s
(S1010)
NS c
(S1010) o
S11 x
S11 x
SQLNumResultCols
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
-- s
S11 x
-- s
-- s
(S1010)
NS c
(S1010) o
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
(S1010)
(S1010)
(S1010)
see below
NS c
(S1010) o
S11 x
S11 x
SQLParamData
663
Statement Transitions
S9
Must Put
S10
Can Put
S1 e and 1
S2 e, nr, and 2
S3 e, r, and 2
S7 e and 3
S9 s
S11 x
S1010
S1 e and 1
S2 e, nr, and 2
S3 e, r, and 2
S4 s, nr, and (1 or 2)
S5 s, r, and (1 or 2)
S7 (s or e) and 3
S9 d
S11 x
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
--
--
--
--
(S1010)
(S1010)
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
S2 s and nr
S3 s and r
S11 x
-- s or (e and 1) S1 e
S1 e and 2
S2 s and nr
S11 x
S3 s and r
S11 x
see
below
(S1010)
NS c
(S1010) o
SQLPrepare
1 The preparation fails for a reason other than validating the statement (in other words,
the SQLSTATE was S1009 (Invalid argument value) or S1090 (Invalid string or buffer
length)).
664
Statement Transitions
2 The preparation fails while validating the statement (in other words, the SQLSTATE
was not S1009 (Invalid argument value) or S1090 (Invalid string or buffer length)).
SQLPrepare (Cursor states)
S5
Opened
S6
SQLFetch
S7
SQLExtendedFetch
24000
(24000)
(24000)
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
(S1010)
(S1010)
(S1010)
see below
NS c
(S1010) o
S9
Must Put
S10
Can Put
S1010
S1 e and 1
S2 e, nr, and 2
S3 e, r, and 2
S7 e and 3
S10 s
S11 x
-- s
S1 e and 1
S2 e, nr, and 2
S3 e, r, and 2
S7 e and 3
S11 x
Statement Transitions
SQLRowCount
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
(S1010)
--
--
(S1010)
(S1010)
SQLSetConnectOption
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
-- 1
--
--
--
--
(S1010)
(S1010)
1 This row shows transitions when fOption was a connection option. For transitions
when fOption was a statement option, see the statement transition table for SQLSetStmtOption.
666
Statement Transitions
SQLSetCursorName
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
--
--
(24000)
(24000)
(S1010)
(S1010)
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
(S1010)
(S1010)
(24000)
see
below
(S1010)
NS c
(S1010) o
SQLSetPos
S6
SQLFetch
S7
SQLExtendedFetch
(24000)
(S1010)
-- s
S8 d
S11 x
24000 b
S1109 i
SQLSetScrollOptions
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
(IH)
--
(S1010)
(S1010)
(S1010)
(S1010)
(S1010)
667
Statement Transitions
SQLSetStmtOption
S0
Unallocated
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
(IH)
--
-- 1
(S1011) 2
-- 1
-- 1
(24000) 2
(24000) 2
S8 S10
Need Data
S11 S12
Async
(S1010) np
(S1010) np
or 1
or 1
(S1011) p
(S1011) p
and 2
and 2
S1
Allocated
S2 S3
Prepared
S4
Executed
S5 S7
Cursor
S8 S10
Need Data
S11 S12
Async
--
--
-- 2 or 3
S1 1
-- 3
S1 np and(1 or
-- 3
(S1010)
(S1010)
2)
2)
S1 p and 1
S2 p and 2
S1 p and 1
S3 p and 2
S1 np and(1 or
668
Statement Transitions
669
Statement Transitions
670
Appendix C
SQL Grammar
The following paragraphs list the recommended constructs to ensure interoperability in
calls to SQLPrepare, SQLExecute, or SQLExecDirect. To the right of each construct is an
indicator that tells whether the construct is part of the minimum grammar, the core grammar, or the extended grammar. ODBC does not prohibit the use of vendor-specific SQL
grammar.
The Integrity Enhancement Facility (IEF) is included in the grammar but is optional. If drivers parse and execute SQL directly and wish to include referential integrity functionality,
then we strongly recommend the SQL syntax used for this functionality conform to the
grammar used here. The grammar for the IEF is taken directly from the X/Open and SQL
Access Group SQL CAE specification (1992) and is a subset of the ISO SQL-92 standard.
Elements that are part of the IE and are optional in the ANSI 1989 standard are presented
in the following typeface and font, distinct from the rest of the grammar:
table-constraint-definition
A given driver and data source do not necessarily support all of the data types defined in
this grammar. To determine which data types a driver supports, an application calls
SQLGetInfo with the SQL_ODBC_SQL_CONFORMANCE flag. Drivers that support
every core data type return 1 and drivers that support every core and every extended data
type return 2. To determine whether a specific data type is supported, an application calls
SQLGetTypeInfo with the fSqlType argument set to that data type.
If a driver supports data types that map to the ODBC SQL date, time, or timestamp data
types, the driver must also support the extended SQL grammar for specifying date, time,
or timestamp literals.
Note In CREATE TABLE and ALTER TABLE statements, applications must use the data
type name returned by SQLGetTypeInfo in the TYPE_NAME column.
671
VARCHAR
Parameter Markers
An application cannot place parameter markers in the following locations:
In a SELECT list.
SQLStatements
SQLStatements
The following SQL statements define the base ODBC SQL grammar.
673
674
column-definition ::=
column-identifier data-type
[DEFAULT default-value]
[column-constraint-definition[ column-constraint-definition]...]
default-value ::= literal | NULL | USER
column-constraint-definition ::=
NOT NULL
| UNIQUE | PRIMARY KEY
| REFERENCES ref-table-name referenced-columns
| CHECK (search-condition)
table-constraint-definition ::=
UNIQUE (column-identifier [, column-identifier] ...)
| PRIMARY KEY (column-identifier [, column-identifier] ...)
| CHECK (search-condition)
| FOREIGN KEY referencing-columns REFERENCES
ref-table-name referenced-columns
Important: As a data-type in a create-table-statement, application smust use a data type from the
TYPE_NAME column of the result set returned by SQLGetTypeInfo.
675
GRANT Statement
ODBC conformance level: Core
GRANT {ALL | grant-privilege [, grant-privilege]... }
ON table-name
TO {PUBLIC | user-name [, user-name]... }
grant-privilege ::=
DELETE
| INSERT
| SELECT
676
INSERT Statement
INSERT Statement
ODBC conformance level: Minimum
INSERT INTO table-name [( column-identifier [, column-identifier]...)]
VALUES (insert-value[, insert-value]... )
ODBC conformance level: Core
INSERT INTO table-name [( column-identifier [, column-identifier]... )]
{ query-specification | VALUES (insert-value [, insert-value]...)}
REVOKE Statement
ODBC conformance level: Core
REVOKE {ALL | revoke-privilege [, revoke-privilege]... }
ON table-name
FROM {PUBLIC | user-name [, user-name]... }
[ CASCADE | RESTRICT ]
revoke-privilege ::=
DELETE
| INSERT
| SELECT
| UPDATE
| REFERENCES
677
SELECT Statement
SELECT Statement
ODBC conformance level: Minimum
SELECT [ALL | DISTINCT] select-list
FROM table-reference-list
[WHERE search-condition]
[order-by-clause]
ODBC conformance level: Core
SELECT [ALL | DISTINCT] select-list
FROM table-reference-list
[WHERE search-condition]
[GROUP BY column-name [, column-name]... ]
[HAVING search-condition]
[order-by-clause]
ODBC conformance level: Extended
SELECT [ALL | DISTINCT] select-list
FROM table-reference-list
[WHERE search-condition]
[GROUP BY column-name [, column-name]... ]
[HAVING search-condition]
[UNION [ALL] select-statement]...
[order-by-clause]
(In ODBC 1.0, the UNION clause was in the Core SQL grammar and did not support the
ALL keyword.)
678
Statement List
Statement List
ODBC conformance level: Minimum
statement ::= create-table-statement
| delete-statement-searched
| drop-table-statement
| insert-statement
| select-statement
| update-statement-searched
ODBC conformance level: Core
statement ::= alter-table-statement
| create-index-statement
| create-table-statement
| create-view-statement
| delete-statement-searched
| drop-index-statement
| drop-table-statement
| drop-view-statement
| grant-statement
| insert-statement
| revoke-statement
| select-statement
| update-statement-searched
ODBC conformance level: Extended
statement ::= alter-table-statement
| create-index-statement
| create-table-statement
| create-view-statement
| delete-statement-positioned
| delete-statement-searched
| drop-index-statement
| drop-table-statement
| drop-view-statement
|ODBC-procedure-extension
| grant-statement
| insert-statement
| revoke-statement
679
| select-statement
| select-for-update-statement
| statement-list
|update-statement-positioned
| update-statement-searched
statement-list ::= statement | statement; statement-list
680
Element
ODBC
Conformance
Level
Core
Core
Core
Minimum
Minimum
Minimum
Core
between-predicate ::=
expression [NOT] BETWEEN expression AND expression
Core
Extended
Extended
bit-literal ::= 0 | 1
Extended
Extended
681
682
Element
ODBC
Conformance
Level
Minimum
Minimum
Minimum
Minimum
character-string-literal :: = '{character}...'
(To include a single literal quote character (') in a character-stringliteral, use two literal quote characters (' ').)
Minimum
Minimum
Core
Minimum
Minimum
Core
Minimum
Minimum
comparison-predicate ::=
expression comparison-operator {expression | (sub-query)}
Core
Core
Core
Minimum
data-type ::=
character-string-type
| exact-numeric-type
| approximate-numeric-type
Core
Element
ODBC
Conformance
Level
data-type ::=
character-string-type
| exact-numeric-type
| approximate-numeric-type
| bit-type
| binary-type
| date-type
| time-type
| timestamp-type
Extended
date-separator ::= -
Extended
Extended
date-value ::=
years-value date-separator months-value date-separator days-value
Extended
Extended
digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Minimum
distinct-function ::=
Core
{AVG | COUNT | MAX | MIN | SUM} (DISTINCT column-name)
dynamic-parameter ::= ?
Minimum
empty-string ::=
Extended
Extended
exact-numeric-literal ::=
[+|] { unsigned-integer[.unsigned-integer ]
| unsigned-integer.
| .unsigned-integer }
Core
Core
683
Element
ODBC
Conformance
Level
Extended
Core
Core
Minimum
Minimum
Extended
Core
Core
Core
684
insert-value ::=
dynamic-parameter
| literal
| NULL
| USER
Minimum
keyword ::=
(see list of reserved keywords)
Minimum
Minimum
Minimum
Minimum
like-predicate ::=
expression [NOT] LIKE pattern-value [ODBC-like-escape-clause]
Extended
Minimum
Core
Element
ODBC
Conformance
Level
Extended
lower-case-letter ::=
a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|
s|t|u|v|w|x|y|z
Minimum
Core
Extended
Extended
Minimum
Minimum
ODBC-date-literal ::=
ODBC-std-esc-initiator d date-value ODBC-std-esc-terminator
| ODBC-ext-esc-initiator d date-value ODBC-ext-esc-terminator
Extended
ODBC-date-time-extension ::=
ODBC-date-literal
| ODBC-time-literal
| ODBC-timestamp-literal
Extended
ODBC-like-escape-clause ::=
ODBC-std-esc-initiator escape escape-character
ODBC-std-esc-terminator
| ODBC-ext-esc-initiator escape escape-character
ODBC-ext-esc-terminator
Extended
ODBC-time-literal ::=
| ODBC-std-esc-initiator t time-value ODBC-std-esc-terminator
| ODBC-ext-esc-initiator t time-value ODBC-ext-esc-terminator
Extended
685
Element
ODBC
Conformance
Level
ODBC-timestamp-literal ::=
| ODBC-std-esc-initiator ts timestamp-value ODBC-std-escterminator
| ODBC-ext-esc-initiator ts timestamp-value ODBC-ext-escterminator
Extended
ODBC-ext-esc-initiator ::= {
Extended
ODBC-ext-esc-terminator ::= }
Extended
ODBC-outer-join-extension ::=
ODBC-std-esc-initiator oj outer-join ODBC-std-esc-terminator
| ODBC-ext-esc-initiator oj outer-join ODBC-ext-esc-terminator
Extended
ODBC-scalar-function-extension ::=
Extended
ODBC-std-esc-initiator fn scalar-function ODBC-std-esc-terminator
| ODBC-ext-esc-initiator fn scalar-function ODBC-ext-esc-terminator
ODBC-std-esc-initiator ::= ODBC-std-esc-prefix SQL-esc-vendorclause
Extended
Extended
Extended
Extended
Core
686
Element
ODBC
Conformance
Level
Core
Minimum
predicate ::=
between-predicate | comparison-predicate | exists-predicate
| in-predicate | like-predicate | null-predicate | quantified-predicate
Core
Minimum
Core
Extended
Extended
Extended
Extended
687
Element
ODBC
Conformance
Level
Extended
Core
Core
Core
query-specification ::=
SELECT [ALL | DISTINCT] select-list
FROM table-reference-list
[WHERE search-condition]
[GROUP BY column-name, [column-name]...]
[HAVING search-condition]
Core
Minimum
Core
Core
Core
688
Core
Minimum
Extended
Element
ODBC
Conformance
Level
Extended
Minimum
Minimum
Core
Minimum
Extended
sub-query ::=
SELECT [ALL | DISTINCT] select-list
FROM table-reference-list
[WHERE search-condition]
[GROUP BY column-name [, column-name]...]
[HAVING search-condition]
Core
Minimum
Minimum
Core
Minimum
Core
Extended
is an ODBC-outer-join-extension.)
689
690
Element
ODBC
Conformance
Level
Core
Minimum
time-separator ::= :
Extended
Extended
time-value ::=
hours-value time-separator minutes-value time-separator
seconds-value
Extended
timestamp-separator ::=
(The blank character.)
Extended
Extended
Extended
Minimum
upper-case-letter ::=
A|B|C|D|E|F|G|H|I|J|K|L|M|
N|O|P|Q|R|S|T|U|V|W|X|Y|Z
Minimum
Minimum
Core
Core
Core
Element
ODBC
Conformance
Level
Core
Extended
BIT
BIT_LENGTH
BY
CASCADE
CASCADED
CASE
CAST
CATALOG
CHAR
CHAR_LENGTH
CHARACTER
CHARACTER_LENGTH
CHECK
CLOSE
COALESCE
COBOL
COLLATE
COLLATION
COLUMN
COMMIT
CONNECT
CONNECTION
CONSTRAINT
CONSTRAINTS
CONTINUE
CONVERT
CORRESPONDING
COUNT
CREATE
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURSOR
DATE
DAY
DEALLOCATE
DEC
DECIMAL
DECLARE
DEFERRABLE
DEFERRED
DELETE
DESC
692
DESCRIBE
DESCRIPTOR
DIAGNOSTICS
DICTIONARY
DISCONNECT
DISPLACEMENT
DISTINCT
DOMAIN
DOUBLE
DROP
ELSE
END
END-EXEC
ESCAPE
EXCEPT
EXCEPTION
EXEC
EXECUTE
EXISTS
EXTERNAL
EXTRACT
FALSE
FETCH
FIRST
FLOAT
FOR
FOREIGN
FORTRAN
FOUND
FROM
FULL
GET
GLOBAL
GO
GOTO
GRANT
GROUP
HAVING
HOUR
IDENTITY
IGNORE
IMMEDIATE
IN
INCLUDE
693
INDEX
INDICATOR
INITIALLY
INNER
INPUT
INSENSITIVE
INSERT
INTEGER
INTERSECT
INTERVAL
INTO
IS
ISOLATION
JOIN
KEY
LANGUAGE
LAST
LEFT
LEVEL
LIKE
LOCAL
LOWER
MATCH
MAX
MIN
MINUTE
MODULE
MONTH
MUMPS
NAMES
NATIONAL
NCHAR
NEXT
NONE
NOT
NULL
NULLIF
NUMERIC
OCTET_LENGTH
OF
OFF
ON
ONLY
OPEN
694
OPTION
OR
ORDER
OUTER
OUTPUT
OVERLAPS
PARTIAL
PASCAL
PLI
POSITION
PRECISION
PREPARE
PRESERVE
PRIMARY
PRIOR
PRIVILEGES
PROCEDURE
PUBLIC
RESTRICT
REVOKE
RIGHT
ROLLBACK
ROWS
SCHEMA
SCROLL
SECOND
SECTION
SELECT
SEQUENCE
SET
SIZE
SMALLINT
SOME
SQL
SQLCA
SQLCODE
SQLERROR
SQLSTATE
SQLWARNING
SUBSTRING
SUM
SYSTEM
TABLE
TEMPORARY
695
THEN
TIME
TIMESTAMP
TIMEZONE_HOUR
TIMEZONE_MINUTE
TO
TRANSACTION
TRANSLATE
TRANSLATION
TRUE
UNION
UNIQUE
UNKNOWN
UPDATE
UPPER
USAGE
USER
USING
VALUE
VALUES
VARCHAR
VARYING
VIEW
WHEN
WHENEVER
WHERE
WITH
WORK
YEAR
696
Appendix D
Data Types
Data stored on a data source has an SQL data type, which may be specific to that data
source. A driver maps data sourcespecific SQL data types to ODBC SQL data types and
driver-specific SQL data types. (A driver returns these mappings through SQLGetTypeInfo. It also returns the SQL data types when describing the data types of columns and
parameters in SQLColAttributes, SQLColumns, SQLDescribeCol, SQLDescribeParam,
SQLProcedureColumns, and SQLSpecialColumns.)
Each SQL data type corresponds to an ODBC C data type. By default, the driver assumes
that the C data type of a storage location corresponds to the SQL data type of the column
or parameter to which the location is bound. If the C data type of a storage location is not
the default C data type, the application can specify the correct C data type with the fCType
argument in SQLGetData, or SQLBindParameter. Before returning data from the data
source, the driver converts it to the specified C data type. Before sending data to the data
source, the driver converts it from the specified C data type.
This appendix discusses the following:
For information about driver-specific SQL data types, see the drivers documentation.
697
Minimum
Core SQL data types are the data types in the X/Open and SQL Access Group
SQL CAE specification (1992) and are supported by most SQL data sources.
Extended SQL data types are additional data types supported by some SQL data
sources.
A given driver and data source do not necessarily support all of the SQL data types defined
in the ODBC grammar. Furthermore, they may support additional, driver-specific SQL
data types. To determine which data types a driver supports, an application calls SQLGetTypeInfo. For information about driver-specific SQL data types, see the drivers documentation.
To determine which data types are supported by a data source and the characteristics of
those data types, an application calls SQLGetTypeInfo.
fSqlType
Description
SQL_CHAR
CHAR(n)
SQL_VARCHAR
VARCHAR(n)
Variable-length character
string with a maximum string
length n (1 n 254).
SQL_LONGVARCHAR
LONG VARCHAR
699
To determine which data types are supported by a data source and the characterisics of
those data types, an application calls SQLGetTypeInfo.
fSqlType
Description
SQL_DECIMAL
DECIMAL(p,s)
SQL_NUMERIC
NUMERIC(p,s)
SQL_SMALLINT
SMALLINT
SQL_INTEGER
INTEGER
SQL_REAL
REAL
SQL_FLOAT
FLOAT
SQL_DOUBLE
DOUBLE
PRECISION
700
Description
SQL_BIT
BIT
SQL_TINYINT
TINYINT
SQL_BIGINT
BIGINT
SQL_BINARY
BINARY(n)
SQL_VARBINARY
VARBINARY(n)
SQL_LONGVARBINARY
LONG VARBINARY
SQL_DATE
DATE
Date data.
701
C Data Types
fSqlType
Description
SQL_TIME
TIME
Time data.
SQL_TIMESTAMP
TIMESTAMP
Date/time data.
C Data Types
Data is stored in the application in ODBC C data types. The core C data types are those
that support the minimum and core SQL data types. They also support some extended
SQL data types. The extended C data types are those that only support extended SQL
data types. The bookmark C data type is used only to retrieve bookmark values and
should not be converted to other data types.
Note Unsigned C data types for integers were added to ODBC 2.0. Drivers must support
the integer C data types specified in both ODBC 1.0 and ODBC 2.0; ODBC 2.0 or later
applications must use the ODBC 1.0 integer C data types with ODBC 1.0 drivers and the
ODBC 2.0 integer C data types with ODBC 2.0 drivers..
The C data type is specified in the SQLBindCol, SQLGetData, and SQLBindParameter
functions with the fCType argument.
702
fCType
ODBC C Typedef
C Type
SQL_C_CHAR
UCHAR FAR *
SQL_C_SSHORT
SWORD
short int
SQL_C_USHORT
UWORD
fCType
ODBC C Typedef
C Type
SQL_C_SLONG
SDWORD
long int
SQL_C_ULONG
UDWORD
SQL_C_FLOAT
SFLOAT
float
SQL_C_DOUBLE
SDOUBLE
double
Note Because string arguments in ODBC functions are unsigned, applications that pass
CString objects to ODBC functions without casting them to unsigned strings will receive
compiler warnings.
ODBC C Typedef
C Type
SQL_C_BIT
UCHAR
unsigned char
SQL_C_STINYINT
SCHAR
signed char
SQL_C_UTINYINT
UCHAR
unsigned char
SQL_C_BINARY
UCHAR FAR *
SQL_C_DATE
DATE_STRUCT
struct tagDATE_STRUCT {
SWORD year; a
UWORD month; b
UWORD day; c
}
703
fCType
ODBC C Typedef
C Type
SQL_C_TIME
TIME_STRUCT
struct tagTIME_STRUCT {
UWORD hour; d
UWORD minute; e
UWORD second; f
}
SQL_C_TIMESTAMP
TIMESTAMP_STRUCT
struct
tagTIMESTAMP_STRUCT
{
SWORD year; a
UWORD month; b
UWORD day; c
UWORD hour; d
UWORD minute; e
UWORD second; f
UDWORD fraction; g
}
The value of the year field must be in the range from 0 to 9,999. Years are measured
from 0 A.D. Some data sources do not support the entire range of years.
The value of the month field must be in the range from 1 to 12.
The value of day field must be in the range from 1 to the number of days in the month.
The number of days in the month is determined from the values of the year and month
fields and is 28, 29, 30, or 31.
The value of the hour field must be in the range from 0 to 23.
The value of the minute field must be in the range from 0 to 59.
The value of the second field must be in the range from 0 to 59.
The value of the fraction field is the number of billionths of a second and ranges from 0
to 999,999,999 (1 less than 1 billion). For example, the value of the fraction field for a halfsecond is 500,000,000, for a thousandth of a second (one millisecond) is 1,000,000, for a
millionth of a second (one microsecond) is 1,000, and for a billionth of a second (one
nanosecond) is 1.
g
704
ODBC C Typedef
C Type
SQL_C_BOOKMARK
BOOKMARK
ODBC C Typedef
C Type
SQL_C_TINYINT
SCHAR
signed char
SQL_C_SHORT
SWORD
short int
SQL_C_LONG
SDWORD
long int
Because the ODBC 1.0 integer C data types (SQL_C_TINYINT, SQL_C_SHORT, and
SQL_C_LONG) are signed, and because the ODBC integer SQL data types can be signed
or unsigned, ODBC 1.0 applications and drivers had to interpret signed integer C data as
signed or unsigned.
705
ODBC 2.0 applications and drivers treat the ODBC 1.0 integer C data types as unsigned
only when:
The C data type of the storage location in which the data will be placed is the
default C data type for that column. (For a list of default C data types, see
Default C Data Types later in this chapter.)
In all other cases, these applications and drivers treat the ODBC 1.0 integer C data types
as signed.
In other words, for any conversion except the default conversion, ODBC 2.0 drivers
check the validity of the conversion based on the numeric data value. For the default
conversion, the drivers simply pass the data value without attempting to validate it
numerically and applications interpret the data value according to whether the column
is signed. (Applications call SQLGetTypeInfo to determine whether a column is signed
or unsigned.)
For example, the following table shows how an ODBC 2.0 driver interprets ODBC 1.0
integer C data sent to both signed and unsigned SQL_SMALLINT columns.
From C Data Type
C Data Values
SQL_C_TINYINT
SQL_SMALLINT
(signed)
128 to 127
128 to 127
SQL_SMALLINT
(unsigned)
<0
0 to 127
--- a
32,768 to 32,767
32,768 to 32,767
SQL_SMALLINT
(unsigned)
32,768 to 1
0 to 32,767
32,768 to 65,535
0 to 32,767
SQL_SMALLINT
(signed)
< 32,768
32,768 to 32,767
> 32,767
SQL_SMALLINT
(unsigned)
<0
0 to 32,767
> 32,767
SQL_C_SHORT(def SQL_SMALLINT
ault conversion)
(signed)
SQL_C_LONG
706
0 to 127
--- a
32,768
to 32,767
--- a
--- a
0 to 32,767
--- a
SQL_CHAR
SQL_C_CHAR
SQL_VARCHAR
SQL_C_CHAR
SQL_LONGVARCHAR
SQL_C_CHAR
SQL_DECIMAL
SQL_C_CHAR
SQL_NUMERIC
SQL_C_CHAR
SQL_BIT
SQL_C_BIT
SQL_TINYINT
SQL_C_STINYINT or
SQL_C_UTINYINT a
SQL_SMALLINT
SQL_C_SSHORT or SQL_C_USHORT a
SQL_INTEGER
SQL_C_SLONG or SQL_C_ULONG a
SQL_BIGINT
SQL_C_CHAR
SQL_REAL
SQL_C_FLOAT
SQL_FLOAT
SQL_C_DOUBLE
707
SQL_DOUBLE
SQL_C_DOUBLE
SQL_BINARY
SQL_C_BINARY
SQL_VARBINARY
SQL_C_BINARY
SQL_LONGVARBINARY
SQL_C_BINARY
SQL_DATE
SQL_C_DATE
SQL_TIME
SQL_C_TIME
SQL_TIMESTAMP
SQL_C_TIMESTAMP
If the driver can determine whether the column is signed or unsigned, such as when
the driver is fetching data from the data source or when the data source supports only a
signed type or only an unsigned type, but not both, the driver uses the corresponding
signed or unsigned C data type. If the driver cannot determine whether the column is
signed or unsigned, it passes the data value without attempting to validate it numerically.
708
Precision
The precision of a numeric column or parameter refers to the maximum number of digits
used by the data type of the column or parameter. The precision of a nonnumeric column
or parameter generally refers to either the maximum length or the defined length of the
column or parameter. To determine the maximum precision allowed for a data type, an
application calls SQLGetTypeInfo. The following table defines the precision for each
ODBC SQL data type.
fSqlType
Precision
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR a, b
SQL_DECIMAL
SQL_NUMERIC
SQL_BIT c
SQL_TINYINT c
SQL_SMALLINT c
SQL_INTEGER c
10
SQL_BIGINT c
709
Scale
fSqlType
Precision
SQL_REAL c
SQL_FLOAT c
15
SQL_DOUBLE c
15
SQL_BINARY
SQL_VARBINARY
SQL_TIME c
SQL_TIMESTAMP
For an ODBC 1.0 application calling SQLSetParam in an ODBC 2.0 driver, and for an
ODBC 2.0 application calling SQLBindParameter in an ODBC 1.0 driver, when pcbValue
is SQL_DATA_AT_EXEC, cbColDef must be set to the total length of the data to be sent,
not the precision as defined in this table.
a
Scale
The scale of a numeric column or parameter refers to the maximum number of digits to
the right of the decimal point. For approximate floating point number columns or
parameters, the scale is undefined, since the number of digits to the right of the decimal
point is not fixed. (For the SQL_DECIMAL and SQL_NUMERIC data types, the maxi710
Scale
mum scale is generally the same as the maximum precision. However, some data sources
impose a separate limit on the maximum scale. To determine the minimum and maximum scales allowed for a data type, an application calls SQLGetTypeInfo.) The following table defines the scale for each ODBC SQL data type.
fSqlType
Scale
SQL_CHAR a
SQL_VARCHAR a
SQL_LONGVARCHAR a
Not applicable.
SQL_DECIMAL
SQL_NUMERIC
SQL_BIT a
SQL_TINYINT a
SQL_SMALLINT a
SQL_INTEGER a
SQL_BIGINT a
SQL_REAL a
SQL_FLOAT a
SQL_DOUBLE a
Not applicable.
SQL_BINARY a
SQL_VARBINARY a
SQL_LONGVARBINARY a
Not applicable.
SQL_DATE a
SQL_TIME a
Not applicable.
SQL_TIMESTAMP
711
Length
Length
The length of a column is the maximum number of bytes returned to the application
when data is transferred to its default C data type. For character data, the length does
not include the null termination byte. Note that the length of a column may be different
than the number of bytes required to store the data on the data source. For a list of
default C data types, see the Default C Data Types earlier in this appendix.
The following table defines the length for each ODBC SQL data type.
712
fSqlType
Length
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR a
SQL_DECIMAL
SQL_NUMERIC
SQL_BIT
SQL_TINYINT
1 (one byte).
SQL_SMALLINT
2 (two bytes).
SQL_INTEGER
4 (four bytes).
SQL_BIGINT
SQL_REAL
4 (four bytes).
SQL_FLOAT
8 (eight bytes).
SQL_DOUBLE
8 (eight bytes).
SQL_BINARY
SQL_VARBINARY
SQL_LONGVARBINARY a
Display Size
fSqlType
Length
SQL_DATE
SQL_TIME
SQL_TIMESTAMP
Display Size
The display size of a column is the maximum number of bytes needed to display data in
character form. The following table defines the display size for each ODBC SQL data
type.
fSqlType
Display Size
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR a
SQL_DECIMAL
SQL_NUMERIC
SQL_BIT
1 (1 digit).
SQL_TINYINT
SQL_SMALLINT
SQL_INTEGER
SQL_BIGINT
SQL_REAL
713
fSqlType
Display Size
SQL_FLOAT
SQL_DOUBLE
SQL_BINARY
SQL_VARBINARY
SQL_LONGVARBINARY a
SQL_DATE
SQL_TIME
SQL_TIMESTAMP
714
SQL_C_BIT
SQL_C_STINYINT
SQL_C_UTINYINT
SQL_C_TINYINT
SQL_C_SSHORT
SQL_C_USHORT
SQL_C_SHORT
SQL_C_SLONG
SQL_C_ULONG
SQL_C_LONG
SQL_C_FLOAT
SQL_C_DOUBLE
SQL_C_BINARY
SQL_C_DATE
SQL_C_TIME
SQL_C_TIMESTAMP
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
SQL_DECIMAL
SQL_NUMERIC
SQL_BIT
SQL_TINYINT(signed
SQL_TINYINT(unsigned)
SQL_SMALLINT(signed)
SQL_SMALLINT unsigned)
SQL_INTEGER (signed)
SQL_INTEGER (unsigned)
SQL_REAL
SQL_FLOAT
SQL_DOUBLE
SQL_BINARY
SQL_VARBINARY
SQL_LONGVARBINARY
SQL_DATE
SQL_TIME
SQL_TIMESTAMP
C Data type
SQL_C_CHAR
The following table shows the supported conversions from ODBC SQL data types to
ODBC C data types. A solid circle indicates the default conversion for an SQL data type
(the C data type to which the data will be converted when the value of fCType is
SQL_C_DEFAULT). A hollow circle indicates a supported conversion.
715
Default conversion
Supported
conversion
The tables in the following sections describe how the driver or data source converts data
retrieved from the data source; drivers are required to support conversions to all ODBC
C data types from the ODBC SQL data types that they support. For a given ODBC SQL
data type, the first column of the table lists the legal input values of the fCType argument
in SQLBindCol and SQLGetData. The second column lists the outcomes of a test, often
using the cbValueMax argument specified in SQLBindCol or SQLGetData, which the
driver performs to determine if it can convert the data. For each outcome, the third and
fourth columns list the values of the rgbValue and pcbValue arguments specified in SQLBindCol or SQLGetData after the driver has attempted to convert the data.
The last column lists the SQLSTATE returned for each outcome by SQLExtendedFetch,
SQLFetch, or SQLGetData.
If the fCType argument in SQLBindCol or SQLGetData contains a value for an ODBC C
data type not shown in the table for a given ODBC SQL data type, SQLExtendedFetch,
SQLFetch, or SQLGetData returns SQLSTATE 07006 (Restricted data type attribute violation). If the fCType argument contains a value that specifies a conversion from a driverspecific SQL data type to an ODBC C data type and this conversion is not supported by
the driver, SQLExtendedFetch, SQLFetch, or SQLGetData returns SQLSTATE S1C00
(Driver not capable).
Though it is not shown in the tables, the pcbValue argument contains SQL_NULL_DATA
when the SQL data value is NULL. For an explanation of the use of pcbValue when multiple calls are made to retrieve data, see SQLGetData. When SQL data is converted to
character C data, the character count returned in pcbValue does not include the null termination byte. If rgbValue is a null pointer, SQLBindCol or SQLGetData returns SQLSTATE S1009 (Invalid argument value).
The following terms and conventions are used in the tables:
716
Display size is the total number of bytes needed to display the data in character
format.
SQL to C: Character
SQL to C: Character
The character ODBC SQL data types are:
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
The following table shows the ODBC C data types to which character SQL data may be
converted. For an explanation of the columns and terms in the table, see the list above.
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_CHAR
Data
Length of data
N/A
Truncated data
Length of data
01004
Data
Size of the C
data type
N/A
Truncated data
Size of the C
data type
01004
Untouched
Untouched
22003
Untouched
Untouched
22005
Data
Size of the C
data type
N/A
Untouched
Untouched
22003
Untouched
Untouched
22005
SQL_C_STINYINT
SQL_C_UTINYINT
SQL_C_TINYINT a
SQL_C_SSHORT
SQL_C_USHORT
SQL_C_SHORT a
SQL_C_SLONG
SQL_C_ULONG
SQL_C_LONG a
SQL_C_FLOAT
SQL_C_DOUBLE
717
SQL to C: Character
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_BIT
Data is 0 or 1
Data
1c
N/A
Truncated data
1c
01004
Untouched
Untouched
22003
Untouched
Untouched
22005
Data
Length of data
N/A
Truncated data
Length of data
01004
6c
N/A
6c
N/A
6c
01004
Untouched
22008
SQL_C_BINARY
SQL_C_DATE
718
Untouched
SQL to C: Character
fCType
Test
SQL_C_TIME
SQL_C_
TIMESTAMP
rgbValue
pcbValue
SQL-STATE
6c
N/A
6c
N/A
6c
01004
Untouched
22008
16 c
N/A
16 c
N/A
16 c
N/A
16 c
N/A
Untouched
22008
Untouched
Untouched
For more information, see ODBC 1.0 C Data Types, earlier in this appendix.
The value of cbValueMax is ignored for this conversion. The driver assumes that the size
of rgbValue is the size of the C data type.
b
SQL to C: Numeric
The date fields of the timestamp structure are set to the current date.
When character SQL data is converted to numeric, date, time, or timestamp C data, leading and trailing spaces are ignored.
All drivers that support date, time, and timestamp data can convert character SQL data
to date, time, or timestamp C data as specified in the previous table. Drivers may be able
to convert character SQL data from other, driver-specific formats to date, time, or timestamp C data. Such conversions are not interoperable among data sources.
SQL to C: Numeric
The numeric ODBC SQL data types are:
SQL_DECIMAL
SQL_NUMERIC
SQL_TINYINT
SQL_SMALLINT
SQL_INTEGER
720
SQL_BIGINT
SQL_REAL
SQL_FLOAT
SQL_DOUBLE
SQL to C: Numeric
The following table shows the ODBC C data types to which numeric SQL data may be
converted. For an explanation of the columns and terms in the table, see page .
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_CHAR
Data
Length of data
N/A
Truncated data
Length of data
01004
Untouched
Untouched
22003
SQL_C_STINYINT
SQL_C_UTINYINT
SQL_C_TINYINT a
SQL_C_SSHORT
SQL_C_USHORT
SQL_C_SHORT a
SQL_C_SLONG
SQL_C_ULONG
SQL_C_LONG a
Data
Size of the C
data type
N/A
Truncated data
Size of the C
data type
01004
Untouched
Untouched
22003
SQL_C_FLOAT
SQL_C_DOUBLE
Data
Size of the C
data type
N/A
Untouched
Untouched
22003
Data is 0 or 1 b
Data
1c
N/A
Truncated data
1c
01004
Untouched
Untouched
22003
Data
Length of data
N/A
Untouched
Untouched
22003
SQL_C_BIT
SQL_C_BINARY
721
SQL to C: Bit
For more information, see ODBC 1.0 C Data Types, earlier in this appendix.
The value of cbValueMax is ignored for this conversion. The driver assumes that the size
of rgbValue is the size of the C data type.
b
SQL to C: Bit
The bit ODBC SQL data type is:
SQL_BIT
The following table shows the ODBC C data types to which bit SQL data may be converted. For an explanation of the columns and terms in the table, see page .
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_CHAR
cbValueMax > 1
Data
N/A
cbValueMax 1
Untouched
Untouched
22003
SQL_C_STINYINT
SQL_C_UTINYINT
SQL_C_TINYINT a
SQL_C_SSHORT
SQL_C_USHORT
SQL_C_SHORT a
SQL_C_SLONG
SQL_C_ULONG
SQL_C_LONG a
SQL_C_FLOAT
SQL_C_DOUBLE
None b
Data
Size of the C
data type
N/A
SQL_C_BIT
None b
Data
1c
N/A
SQL_C_BINARY
cbValueMax 1
Data
N/A
cbValueMax < 1
Untouched
Untouched
22003
722
For more information, see ODBC 1.0 C Data Types, earlier in this appendix.
SQL to C: Binary
The value of cbValueMax is ignored for this conversion. The driver assumes that the size
of
rgbValue is the size of the C data type.
When bit SQL data is converted to character C data, the possible values are 0 and 1.
SQL to C: Binary
The binary ODBC SQL data types are:
SQL_BINARY
SQL_VARBINARY
SQL_LONGVARBINARY
The following table shows the ODBC C data types to which binary SQL data may be converted. For an explanation of the columns and terms in the table, see page .
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_CHAR
Data
Length of data
N/A
Truncated data
Length of data
01004
Data
Length of data
N/A
Truncated data
Length of data
01004
SQL_C_BINARY
When binary SQL data is converted to character C data, each byte (8 bits) of source data
is represented as two ASCII characters. These characters are the ASCII character representation of the number in its hexadecimal form. For example, a binary 00000001 is converted to 01 and a binary 11111111 is converted to FF.
The driver always converts individual bytes to pairs of hexadecimal digits and terminates the character string with a null byte. Because of this, if cbValueMax is even and is
less than the length of the converted data, the last byte of the rgbValue buffer is not used.
(The converted data requires an even number of bytes, the next-to-last byte is a null byte,
and the last byte cannot be used.)
723
SQL to C: Date
SQL to C: Date
The date ODBC SQL data type is:
SQL_DATE
The following table shows the ODBC C data types to which date SQL data may be converted. For an explanation of the columns and terms in the table, see page .
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_CHAR
cbValueMax 11
Data
10
N/A
cbValueMax < 11
Untouched
Untouched
22003
Data
Length of data
N/A
Untouched
Untouched
22003
SQL_C_DATE
None a
Data
6c
N/A
SQL_C_TIMESTAMP
None a
Data b
16 c
N/A
SQL_C_BINARY
The value of cbValueMax is ignored for this conversion. The driver assumes that the size
of rgbValue is the size of the C data type.
When date SQL data is converted to character C data, the resulting string is in the yyyymm-dd format.
SQL to C: Time
The time ODBC SQL data type is:
SQL_TIME
724
SQL to C: Timestamp
The following table shows the ODBC C data types to which time SQL data may be converted. For an explanation of the columns and terms in the table, see page .
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_CHAR
cbValueMax 9
Data
N/A
cbValueMax < 9
Untouched
Untouched
22003
Data
Length of data
N/A
Untouched
Untouched
22003
SQL_C_TIME
None a
Data
6c
N/A
SQL_C_TIMESTAMP
None a
Data b
16 c
N/A
SQL_C_BINARY
The value of cbValueMax is ignored for this conversion. The driver assumes that the size
of rgbValue is the size of the C data type.
The date fields of the timestamp structure are set to the current date and the fractional
seconds field of the timestamp structure is set to zero.
b
When time SQL data is converted to character C data, the resulting string is in the
hh:mm:ss format.
SQL to C: Timestamp
The timestamp ODBC SQL data type is:
SQL_TIMESTAMP
725
SQL to C: Timestamp
The following table shows the ODBC C data types to which timestamp SQL data may
be converted. For an explanation of the columns and terms in the table, see page .
fCType
Test
rgbValue
pcbValue
SQL-STATE
SQL_C_CHAR
Data
Length of data
N/A
20 cbValueMax Display
size
01004
cbValueMax < 20
Untouched
Untouched
22003
Data
Length of data
N/A
Untouched
Untouched
22003
Data
6f
N/A
Truncated data c 6 f
01004
Data d
6f
N/A
Truncated data
6f
01004
Data e
16 f
N/A
Truncated data e 16 f
01004
SQL_C_BINARY
SQL_C_DATE
SQL_C_TIME
SQL_C_TIMESTAMP
d, e
The value of cbValueMax is ignored for this conversion. The driver assumes that the size
of rgbValue is the size of the C data type.
726
When timestamp SQL data is converted to character C data, the resulting string is in the
yyyy-mm-dd hh:mm:ss[.f...] format, where up to nine digits may be used for fractional
seconds. (Except for the decimal point and fractional seconds, the entire format must be
used, regardless of the precision of the timestamp SQL data type.)
C Data Type
cbValueMax
rgbValue
SQLSTATE
SQL_CHAR
abcdef
SQL_C_CHAR
abcdef\0 a
N/A
SQL_CHAR
abcdef
SQL_C_CHAR
abcde\0 a
01004
SQL_DECIMAL
1234.56
SQL_C_CHAR
1234.56\0 a
N/A
SQL_DECIMAL
1234.56
SQL_C_CHAR
1234\0 a
01004
SQL_DECIMAL
1234.56
SQL_C_CHAR
----
22003
SQL_DECIMAL
1234.56
SQL_C_FLOAT
ignored
1234.56
N/A
SQL_DECIMAL
1234.56
SQL_C_SSHORT
ignored
1234
01004
SQL_DECIMAL
1234.56
SQL_C_STINYINT
ignored
----
22003
SQL_DOUBLE
1.2345678
SQL_C_DOUBLE
ignored
1.2345678
N/A
SQL_DOUBLE
1.2345678
SQL_C_FLOAT
ignored
1.234567
N/A
SQL_DOUBLE
1.2345678
SQL_C_STINYINT
ignored
N/A
SQL_DATE
1992-12-31
SQL_C_CHAR
11
1992-12-31\0 a
N/A
SQL_DATE
1992-12-31
SQL_C_CHAR
10
-----
22003
SQL_DATE
1992-12-31
SQL_C_TIMESTAMP
ignored
1992,12,31,
0,0,0,0 b
N/A
SQL_TIMESTAMP
1992-12-31
23:45:55.12
SQL_C_CHAR
23
1992-12-31
N/A
23:45:55.12\0 a
727
SQLSTATE
C Data Type
cbValueMax
rgbValue
SQL_TIMESTAMP
1992-12-31
23:45:55.12
SQL_C_CHAR
22
1992-12-31
23:45:55.1\0 a
01004
SQL_TIMESTAMP
1992-12-31
23:45:55.12
SQL_C_CHAR
18
----
22003
The numbers in this list are the numbers stored in the fields of the
TIMESTAMP_STRUCT structure.
b
728
SQL_SMALLINT (signed)
SQL_SMALLINT (unsigned)
SQL_INTEGER (signed)
SQL_INTEGER (unsigned)
SQL_REAL
SQL_FLOAT
SQL_TIMESTAAMP
SQL_TINYINT(unsigned)
SQL_TIME
SQL_TINYINT(signed)
SQL_DATE
SQL_BIT
SQL_LONGVARBINARY
SQL_NUMERIC
SQL_VARBINARY
SQL_DECIMAL
SQL_BINARY
SQL_LONGVARCHAR
SQL_DOUBLE
SQL_VARCHAR
SQL_C_CHAR
SQL_C_BIT
SQL_C_STINYINT
SQL_C_UTINYINT
SQL_C_TINYINT
SQL_C_SSHORT
SQL_C_USHORT
SQL_C_SHORT
SQL_C_SLONG
SQL_C_ULONG
SQL_C_LONG
SQL_C_FLOAT
SQL_C_DOUBLE
SQL_C_BINARY
SQL_C_DATE
SQL_C_TIME
SQL_C_TIMESTAMP
SQL_CHAR
C Data Type
..
Default conversion
Supported
conversion
The tables in the following sections describe how the driver or data source converts data
sent to the data source; drivers are required to support conversions from all ODBC C data
types to the ODBC SQL data types that they support. For a given ODBC C data type, the
first column of the table lists the legal input values of the fSqlType argument in SQLBindParameter. The second column lists the outcomes of a test that the driver performs to
729
C to SQL: Character
determine if it can convert the data. The third column lists the SQLSTATE returned for
each outcome by SQLExecDirect, SQLExecute, or SQLPutData. Data is sent to the data
source only if SQL_SUCCESS is returned.
If the fSqlType argument in SQLBindParameter contains a value for an ODBC SQL data
type that is not shown in the table for a given C data type, SQLBindParameter returns
SQLSTATE 07006 (Restricted data type attribute violation). If the fSqlType argument contains a driver-specific value and the driver does not support the conversion from the
specific ODBC C data type to that driver-specific SQL data type, SQLBindParameter
returns SQLSTATE S1C00 (Driver not capable).
If the rgbValue and pcbValue arguments specified in SQLBindParameter are both null
pointers, that function returns SQLSTATE S1009 (Invalid argument value). Though it is
not shown in the tables, an application sets the value pointed to by the pcbValue argument of SQLBindParameter or the value of the cbValue argument to SQL_NULL_DATA
to specify a NULL SQL data value. The application sets these values to SQL_NTS to
specify that the value in rgbValue is a null-terminated string.
The following terms are used in the tables:
Length of data is the number of bytes of SQL data available to send to the data source,
regardless of whether the data will be truncated before it is sent to the data source. For
string data, this does not include the null termination byte.
Column length and display size are defined for each SQL data type in the section
Precision, Scale, Length, and Display Size earlier in this chapter.
Number of digits is the number of characters used to represent a number, including the minus sign, decimal point, and exponent (if needed).
Words in italics represent elements of the ODBC SQL grammar. For the syntax
of grammar elements, see Appendix C, SQL Grammar.
C to SQL: Character
The character ODBC C data type is:
SQL_C_CHAR
730
C to SQL: Character
The following table shows the ODBC SQL data types to which C character data may be
converted. For an explanation of the columns and terms in the table, see page .
fSqlType
Test
SQL-STATE
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
N/A
01004
SQL_DECIMAL
SQL_NUMERIC
SQL_TINYINT
SQL_SMALLINT
SQL_INTEGER
SQL_BIGINT
N/A
01004
SQL_REAL
SQL_FLOAT
SQL_DOUBLE
SQL_BIT
SQL_BINARY
SQL_VARBINARY
SQL_LONGVARBINARY
22005
N/A
22003
22005
Data is 0 or 1
N/A
01004
22003
22005
N/A
01004
22005
731
C to SQL: Character
fSqlType
Test
SQL-STATE
SQL_DATE
N/A
N/A
01004
22008
N/A
SQL_TIME
SQL_TIMESTAMP
732
01004
22008
N/A
01004
N/A
N/A
22008
C to SQL: Numeric
When character C data is converted to numeric, date, time, or timestamp SQL data, leading and trailing blanks are ignored.
When character C data is converted to binary SQL data, each two bytes of character data
are converted to a single byte (8 bits) of binary data. Each two bytes of character data represent a number in hexadecimal form. For example, 01 is converted to a binary
00000001 and FF is converted to a binary 11111111.
The driver always converts pairs of hexadecimal digits to individual bytes and ignores
the null termination byte. Because of this, if the length of the character string is odd, the
last byte of the string (excluding the null termination byte, if any) is not converted.
All drivers that support date, time, and timestamp data can convert character C data to
date, time, or timestamp SQL data as specified in the previous table. Drivers may be able
to convert character C data from other, driver-specific formats to date, time, or timestamp
SQL data. Such conversions are not interoperable among data sources.
C to SQL: Numeric
The numeric ODBC C data types are:
SQL_C_STINYINT
SQL_C_UTINYINT
SQL_C_TINYINT
SQL_C_SSHORT
SQL_C_USHORT
SQL_C_SHORT
SQL_C_SLONG
SQL_C_ULONG
SQL_C_LONG
SQL_C_FLOAT
SQL_C_DOUBLE
733
C to SQL: Numeric
.
fSqlType
Test
SQL-STATE
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
N/A
01004
22003
SQL_DECIMAL
SQL_NUMERIC
SQL_TINYINT
SQL_SMALLINT
SQL_INTEGER
SQL_BIGINT
N/A
01004
SQL_REAL
SQL_FLOAT
SQL_DOUBLE
N/A
22003
Data is 0 or 1
N/A
01004
22003
SQL_BIT
The value pointed to by the pcbValue argument of SQLBindParameter and the value of
the cbValue argument of SQLPutData are ignored when data is converted from the
numeric C data types. The driver assumes that the size of rgbValue is the size of the
numeric C data type.
734
C to SQL: Bit
C to SQL: Bit
The bit ODBC C data type is:
SQL_C_BIT
The following table shows the ODBC SQL data types to which bit C data may be converted. For an explanation of the columns and terms in the table, see page .
fSqlType
Test
SQL-STATE
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
None
N/A
SQL_DECIMAL
SQL_NUMERIC
SQL_TINYINT
SQL_SMALLINT
SQL_INTEGER
SQL_BIGINT
SQL_REAL
SQL_FLOAT
SQL_DOUBLE
None
N/A
SQL_BIT
None
N/A
The value pointed to by the pcbValue argument of SQLBindParameter and the value of
the cbValue argument of SQLPutData are ignored when data is converted from the bit C
data type. The driver assumes that the size of rgbValue is the size of the bit C data type.
C to SQL: Binary
The binary ODBC C data type is:
SQL_C_BINARY
735
C to SQL: Date
The following table shows the ODBC SQL data types to which binary C data may be converted. For an explanation of the columns and terms in the table, see page .
fSqlType
Test
SQL-STATE
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
N/A
01004
SQL_DECIMAL
SQL_NUMERIC
SQL_TINYINT
SQL_SMALLINT
SQL_INTEGER
SQL_BIGINT
SQL_REAL
SQL_FLOAT
SQL_DOUBLE
N/A
22003
SQL_BIT
N/A
22003
SQL_BINARY
SQL_VARBINARY
SQL_LONGVARBINARY
N/A
01004
SQL_DATE
SQL_TIME
SQL_TIMESTAMP
N/A
22003
The SQL data length is the number of bytes needed to store the data on the data source.
(This may be different than the column length, as defined earlier in this appendix.)
C to SQL: Date
The date ODBC C data type is:
SQL_C_DATE
736
C to SQL: Time
The following table shows the ODBC SQL data types to which date C data may be converted. For an explanation of the columns and terms in the table, see page .
fSqlType
Test
SQL-STATE
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
Column length 10
Column length < 10
Data value is not a valid date
N/A
22003
22008
SQL_DATE
N/A
22008
SQL_TIMESTAMP
N/A
22008
For information about what values are valid in a SQL_C_DATE structure, see Extended
C Data Types, earlier in this appendix.
When date C data is converted to character SQL data, the resulting character data is in
the yyyy-mm-dd format.
The value pointed to by the pcbValue argument of SQLBindParameter and the value of
the cbValue argument of SQLPutData are ignored when data is converted from the date
C data type. The driver assumes that the size of rgbValue is the size of the date C data
type.
C to SQL: Time
The time ODBC C data type is:
SQL_C_TIME
737
C to SQL: Timestamp
The following table shows the ODBC SQL data types to which time C data may be converted. For an explanation of the columns and terms in the table, see page .
fSqlType
Test
SQL-STATE
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
Column length 8
N/A
22003
22008
N/A
22008
N/A
22008
SQL_TIME
SQL_TIMESTAMP
The date portion of the timestamp is set to the current date and the fractional seconds
portion of the timestamp is set to zero.
For information about what values are valid in a SQL_C_TIME structure, see Extended
C Data Types, earlier in this appendix.
When time C data is converted to character SQL data, the resulting character data is in
the hh:mm:ss format.
The value pointed to by the pcbValue argument of SQLBindParameter and the value of
the cbValue argument of SQLPutData are ignored when data is converted from the time
C data type. The driver assumes that the size of rgbValue is the size of the time C data
type.
C to SQL: Timestamp
The timestamp ODBC C data type is:
SQL_C_TIMESTAMP
738
C to SQL: Timestamp
The following table shows the ODBC SQL data types to which timestamp C data may be
converted. For an explanation of the columns and terms in the table, see page .
fSqlType
Test
SQL-STATE
SQL_CHAR
SQL_VARCHAR
SQL_LONGVARCHAR
N/A
01004
22003
22008
N/A
01004
SQL_DATE
N/A
N/A
01004
22008
For information about what values are valid in a SQL_C_TIMESTAMP structure, see
Extended C Data Types, earlier in this appendix.
When timestamp C data is converted to character SQL data, the resulting character data
is in the yyyy-mm-dd hh:mm:ss[.f...] format.
739
The value pointed to by the pcbValue argument of SQLBindParameter and the value of
the cbValue argument of SQLPutData are ignored when data is converted from the
timestamp C data type. The driver assumes that the size of rgbValue is the size of the
timestamp C data type.
C Data Value
Column length
SQLSTATE
SQL_C_CHAR
abcdef\0 a
SQL_CHAR
abcdef
N/A
SQL_C_CHAR
abcdef\0 a
SQL_CHAR
abcde
01004
SQL_C_CHAR
1234.56\0 a
SQL_DECIMAL
8b
1234.56
N/A
SQL_C_CHAR
1234.56\0 a
SQL_DECIMAL
7b
1234.5
01004
SQL_C_CHAR
1234.56\0 a
SQL_DECIMAL
----
22003
SQL_C_FLOAT
1234.56
SQL_FLOAT
not applicable
1234.56
N/A
SQL_C_FLOAT
1234.56
SQL_INTEGER
not applicable
1234
01004
SQL_C_FLOAT
1234.56
SQL_TINYINT
not
applicable
----
22003
SQL_C_DATE
1992,12,31 c
SQL_CHAR
10
1992-12-31
N/A
SQL_C_DATE
1992,12,31 c
SQL_CHAR
----
22003
SQL_C_DATE
1992,12,31 c
SQL_TIMESTAMP
not applicable
1992-12-31
00:00:00.0
N/A
SQL_C_TIMESTAMP
1992,12,31,
23,45,55,
120000000 d
SQL_CHAR
22
1992-12-31
23:45:55.12
N/A
740
SQLSTATE
C DataType
C Data Value
Column length
SQL_C_TIMESTAMP
1992,12,31,
23,45,55,
120000000 d
SQL_CHAR
21
1992-12-31
23:45:55.1
01004
SQL_C_TIMESTAMP
1992,12,31,
23,45,55,
120000000 d
SQL_CHAR
18
----
22003
An addition to bytes for numbers, one byte is required for a sign and another byte is
required for the decimal point.
b
The numbers in this list are the numbers stored in the fields of the DATE_STRUCT structure.
c
The numbers in this list are the numbers stored in the fields of the
TIMESTAMP_STRUCT structure.
d
741
742
Appendix E
Statement
Comments
SQLAllocEnv
none
SQLAllocConnect
none
SQLConnect
CONNECT
Association management.
SQLAllocStmt
none
743
ODBC Function
Statement
Comments
SQLPrepare
PREPARE
SQLBindParameter
SET DESCRIPTOR
SQLSetCursorName
none
SQLGetCursorName
none
SQLExecute
EXECUTE or
DECLARE
CURSOR and
OPEN CURSOR
ODBC Function
Statement
Comments
SQLExecDirect
EXECUTE
IMMEDIATE or
DECLARE
CURSOR and
OPEN CURSOR
SQLNumResultCols
GET DESCRIPTOR
SQLColAttributes
GET DESCRIPTOR
SQLDescribeCol
GET DESCRIPTOR
SQLBindCol
none
SQLFetch
FETCH
745
ODBC Function
Statement
Comments
SQLRowCount
GET
DIAGNOSTICS
SQLFreeStmt
(SQL_CLOSE option)
CLOSE
SQLFreeStmt
(SQL_DROP option)
none
SQLTransact
COMMIT WORK
or COMMIT
ROLLBACK
None.
SQLDisconnect
DISCONNECT
Association management.
SQLFreeConnect
none
SQLFreeEnv
none
SQLCancel
none
None.
SQLError
GET
DIAGNOSTICS
746
Declarative Statements
Declarative Statements
The following table lists declarative statements.
Section
SQL Statement
ODBC Function
Comments
4.3.1
none
Issued implicitly by
the driver if a cursor
specification is passed
to SQLExecDirect.
4.3.2
Dynamic SQL
DECLARE CURSOR
none
Cursor is generated
automatically by the
driver. To set a name
for the cursor, use
SQLSetCursorName.
To retrieve a cursor
name, use
SQLGetCursorName.
SQL Statement
ODBC Function
Comments
5.1.2
5.1.3
5.1.4
5.1.5
5.1.6
5.1.7
5.1.8
5.1.9
ALTER TABLE
CREATE INDEX
CREATE TABLE
CREATE VIEW
DROP INDEX
DROP TABLE
DROP VIEW
GRANT
REVOKE
SQLPrepare,
SQLExecute,
or
SQLExecDirect
None.
747
748
Section
SQL Statement
ODBC Function
Comments
5.2.1
CLOSE
SQLFreeStmt
(SQL_CLOSE option)
None.
5.2.2
Positioned DELETE
SQLExecDirect(...,D
ELETE FROM tablename WHERE
CURRENT OF cursorname)
Driver-generated
cursor-name can be
obtained by calling
SQLGetCursorName.
5.2.3
Searched DELETE
SQLExecDirect(...,
DELETE FROM
table-name WHERE
search-condition)
None.
5.2.4
FETCH
SQLFetch
None.
5.2.5
INSERT
SQLExecDirect
(...,INSERT INTO
table-name ...)
5.2.6
OPEN
none
Cursor is OPENed
implicitly by
SQLExecute or
SQLExecDirect when
a SELECT statement is
specified.
5.2.7
SELECT ...INTO
none
Not supported.
Section
SQL Statement
ODBC Function
Comments
5.2.8
Positioned UPDATE
SQLExecDirect(...,U
PDATE table-name
SET column-identifier =
expression ...WHERE
CURRENT OF cursorname)
Driver-generated
cursor-name can be
obtained by calling
SQLGetCursorName.
5.2.9
Searched UPDATE
SQLExecDirect(...,
UPDATE table-name
SET column-identifier =
expression ...WHERE
search-condition)
None.
SQL Statement
ODBC Function
Comments
5.3
(see 5.2.1)
Dynamic SQL
CLOSE
SQLFreeStmt
None.
(SQL_CLOSE option)
5.3(see5.2.2)
Dynamic SQL
Positioned
DELETE
SQLExecDirect(...,
DELETE FROM
table-name WHERE
CURRENT OF
cursor-name)
5.3(see5.2.8)
Dynamic SQL
Positioned
UPDATE
SQLExecDirect(...,
UPDATE table-name
SET column-identifier
= expression
...WHERE
CURRENT OF
cursor-name)
749
750
Section
SQL Statement
ODBC Function
Comments
5.3.3
ALLOCATE
DESCRIPTOR
None
Descriptor information
is implicitly allocated
and attached to the
hstmt by the driver.
Allocation occurs at
either the first call to
SQLBindParameter or
at SQLExecute or
SQLExecDirect time.
5.3.4
DEALLOCATE
DESCRIPTOR
SQLFreeStmt
(SQL_DROP option)
None.
5.3.5
DESCRIBE
none
None.
5.3.6
EXECUTE
SQLExecute
None.
5.3.7
EXECUTE
IMMEDIATE
SQLExecDirect
None.
5.3.8
Dynamic SQL
FETCH
SQLFetch
None.
5.3.9
GET
DESCRIPTOR
5.3.10
Dynamic
SQL OPEN
SQLExecute
None.
5.3.11
PREPARE
SQLPrepare
None.
5.3.12
SET
DESCRIPTOR
SQLBindParameter
SQLBindParameter is
associated with only
one hstmt where a
descriptor is applied to
any number of
statements with USING
SQL DESCRIPTOR.
SQL Statement
ODBC Function
Comments
5.4.1
COMMIT WORK
SQLTransact
(SQL_COMMIT
option)
None.
5.4.2
ROLLBACK WORK
SQLTransact
(SQL_ROLLBACK
option)
None.
SQL Statement
ODBC Function
Comments
5.5.1
CONNECT
SQLConnect
None.
751
752
Section
SQL Statement
ODBC Function
Comments
5.5.2
DISCONNECT
SQLDisconnect
5.5.3
SET
CONNECTION
None
Diagnostic Statement
Diagnostic Statement
The following table lists the GET DIAGNOSTIC statement.
Section
SQL Statement
ODBC Function
Comments
5.6.1
GET
DIAGNOSTICS
SQLError
SQLRowCount
753
Diagnostic Statement
754
Appendix F
Scalar Functions
ODBC specifies five types of scalar functions:
String functions
Numeric functions
System functions
The following sections list functions by function type. Descriptions include associated syntax.
String Functions
The following table lists string manipulation functions.
Character string literals used as arguments to scalar functions must be bounded by single
quotes.
Arguments denoted as string_exp can be the name of a column, a string literal, or the result
of another scalar function, where the underlying data type can be represented as
SQL_CHAR, SQL_VARCHAR, or SQL_LONGVARCHAR.
Arguments denoted as start, length or count can be a numeric literal or the result of another
scalar function, where the underlying data type can be represented as SQL_TINYINT,
SQL_SMALLINT, or SQL_INTEGER.
755
String Functions
The string functions listed here are 1-based, that is, the first character in the string is character 1.
Function
Description
ASCII(string_exp)
CHAR(code)
CONCAT(string_exp1, string_exp2)
DIFFERENCE(string_exp1, string_exp2)
INSERT(string_exp1, start,length,
string_exp2)
LCASE(string_exp)
LEFT(string_exp, count)
LENGTH(string_exp)
String Functions
Function
Description
LOCATE(string_exp1, string_exp2[,
start])
LTRIM(string_exp)
REPEAT(string_exp,count)
REPLACE(string_exp1, string_exp2,
string_exp3)
RIGHT(string_exp, count)
RTRIM(string_exp)
SOUNDEX(string_exp)
SPACE(count)
757
Numeric Functions
Function
Description
UCASE(string_exp)
Numeric Functions
The following table describes numeric functions that are included in the ODBC scalar
function set.
Arguments denoted as numeric_exp can be the name of a column, the result of another
scalar function, or a numeric literal, where the underlying data type could be represented as SQL_NUMERIC, SQL_DECIMAL, SQL_TINYINT, SQL_SMALLINT,
SQL_INTEGER, SQL_BIGINT, SQL_FLOAT, SQL_REAL, or SQL_DOUBLE.
Arguments denoted as float_exp can be the name of a column, the result of another scalar
function, or a numeric literal, where the underlying data type can be represented as
SQL_FLOAT.
Arguments denoted as integer_exp can be the name of a column, the result of another
scalar function, or a numeric literal, where the underlying data type can be represented
as SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER, or SQL_BIGINT.
758
Function
Description
ABS(numeric_exp)
ACOS(float_exp)
ASIN(float_exp)
Numeric Functions
Function
Description
ATAN(float_exp)
ATAN2(float_exp1, float_exp2)
CEILING(numeric_exp)
COS(float_exp)
COT(float_exp)
DEGREES(numeric_exp)
EXP(float_exp)
FLOOR(numeric_exp)
LOG(float_exp)
LOG10(float_exp)
MOD(integer_exp1, integer_exp2)
PI( )
POWER(numeric_exp, integer_exp)
RADIANS(numeric_exp)
759
Function
Description
RAND([integer_exp])
ROUND(numeric_exp, integer_exp)
SIGN(numeric_exp)
SIN(float_exp)
SQRT(float_exp)
TAN(float_exp)
TRUNCATE(numeric_exp, integer_exp)
Arguments denoted as date_exp can be the name of a column, the result of another scalar function, or a date or timestamp literal, where the underlying data type could be represented as
SQL_CHAR, SQL_VARCHAR, SQL_DATE, or SQL_TIMESTAMP.
Arguments denoted as time_exp can be the name of a column, the result of another scalar function, or a time or timestamp literal, where the underlying data type could be represented as
SQL_CHAR, SQL_VARCHAR, SQL_TIME, or SQL_TIMESTAMP.
Values returned are represented as ODBC data types.
Function
Description
CURDATE( )
CURTIME( )
DAYNAME(date_exp)
DAYOFMONTH(date_exp)
DAYOFWEEK(date_exp)
DAYOFYEAR(date_exp)
HOUR(time_exp)
MINUTE(time_exp)
MONTH(date_exp)
761
762
Function
Description
MONTHNAME(date_exp)
NOW( )
QUARTER(date_exp)
SECOND(time_exp)
Function
Description
TIMESTAMPADD(interval,
integer_exp, timestamp_exp)
763
Function
Description
TIMESTAMPDIFF(interval,
timestamp_exp1,
timestamp_exp2)
764
System Functions
Function
Description
WEEK(date_exp)
YEAR(date_exp)
System Functions
The following table lists system functions that are included in the ODBC scalar function
set.
Arguments denoted as exp can be the name of a column, the result of another scalar function, or a literal, where the underlying data type could be represented as
SQL_NUMERIC, SQL_DECIMAL, SQL_TINYINT, SQL_SMALLINT, SQL_INTEGER,
SQL_BIGINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE, SQL_DATE, SQL_TIME, or
SQL_TIMESTAMP.
Arguments denoted as value can be a literal constant, where the underlying data type can
be represented as SQL_NUMERIC, SQL_DECIMAL, SQL_TINYINT, SQL_SMALLINT,
SQL_INTEGER, SQL_BIGINT, SQL_FLOAT, SQL_REAL, SQL_DOUBLE, SQL_DATE,
SQL_TIME, or SQL_TIMESTAMP.
Values returned are represented as ODBC data types.
Function
Description
DATABASE( )
765
Function
Description
IFNULL(exp,value)
USER( )
SQL_SMALLINT
SQL_TIME
SQL_TIMESTAMP
SQL_TINYINT
SQL_VARBINARY
SQL_VARCHAR
The ODBC syntax for the explicit data type conversion function does not support specification of conversion format. If specification of explicit formats is supported by the
underlying data source, a driver must specify a default value or implement format specification.
The argument value_exp can be a column name, the result of another scalar function, or a
numeric or string literal. For example:
{ fn CONVERT( { fn CURDATE() }, SQL_CHAR) }
A driver that supports an ORACLE DBMS would translate the request to:
SELECT EMPNO FROM EMPLOYEES WHERE to_char(EMPNO) LIKE 1%
A driver that supports a Sybase SQL Server DBMS would translate the request to:
SELECT EMPNO FROM EMPLOYEES WHERE convert(char,EMPNO) LIKE 1%
767
A driver that supports an Oracle DBMS would translate the request to:
SELECT abs(EMPNO), to_number(EMPNAME) FROM EMPLOYEES WHERE EMPNO <> 0
A driver that supports a Sybase SQL Server DBMS would translate the request to:
SELECT abs(EMPNO), convert(smallint, EMPNAME) FROM EMPLOYEES
WHERE EMPNO != 0
A driver that supports an Ingres DBMS would translate the request to:
SELECT abs(EMPNO), int2(EMPNAME) FROM EMPLOYEES WHERE EMPNO <> 0
768
Appendix G
769
Calls SQLSetConnectOption to specify how the cursor library should be used with
a particular connection. The cursor library can be always used, used only if driver
does not support scrollable cursors, or never used.
2.
3.
Calls SQLSetStmtOptions to specify the cursor type, concurrency, and rowset size.
The cursor library supports forward-only and static cursors. Forward-only cursors
must be read-only, while static cursors may be read-only or use optimistic concurrency control comparing values.
4.
Allocates one or more rowset buffers and calls SQLBindCol one or more times to
bind these buffers to result set columns. For more information, see Assigning Storage for Rowsets (Binding) in Chapter 7, Retrieving Results.
5.
6.
Calls SQLExtendedFetch one or more times to scroll through the result set.
The application can change data values in the rowset buffers. To refresh the rowset buffers
with data from the cursor librarys cache, an application calls SQLExtendedFetch and with
the fFetchType argument set to SQL_FETCH_RELATIVE and the irow argument set to 0.
To retrieve data from an unbound column, the application calls SQLSetPos to position the
cursor on the desired row. It then calls SQLGetData to retrieve the data.
To determine the number of rows that have been retrieved from the data source, the application calls SQLRowCount.
2.
3.
Updates the rowset buffers for the current row if it will execute a positioned
update statement. After successfully executing a positioned update statement,
the cursor library copies the values from each column in the current row to its
cache.
Important: If the application does not correctly update the rowset buffers
before executing a positioned update statement, the data in the cache will be
incorrect after the statement is executed.
4.
.Executes the positioned update or delete statement using a different hstmt than
the hstmt associated with the cursor.
Important: The WHERE clause constructed by the cursor library to identify
the current row can fail to identify any rows, identify a different row, or identify more than one row. For more information, see Constructing Searched
Statements later in this appendix.
All positioned update and delete statements require a cursor name. To specify the cursor
name, an application calls SQLSetCursorName before the cursor is opened. To use the
cursor name generated by the driver, an application calls SQLGetCursorName after the
cursor is opened.
771
After the cursor library executes a positioned update or delete statement, the status
array, rowset buffers, and cache maintained by the cursor library contain the values
shown in the following table.
Statement used
Value in rgfRowStatus
Values in
rowset buffers
Values in
cache buffers
Positioned update
SQL_ROW_UPDATED
New values 1
New values 1
Positioned delete
SQL_ROW_DELETED
Old values
Old values
1 The application must update the values in the rowset buffers before executing the positioned update statement; after executing the positioned update statement, the cursor
library copies the values in the rowset buffers to its cache.
772
Code Example
Code Example
The following example uses the cursor library to retrieve each employees name, age, and
birthday from the EMPLOYEE table. It then displays 20 rows of data. If the user updates
this data, the code updates the rowset buffers and executes a positioned update statement. Finally, it prompts the user for the direction to scroll and repeats the process.
#define ROWS 20
#define NAME_LEN 30
#define BDAY_LEN 11
#define DONE -1
HENV henv;
HDBC hdbc;
HSTMT hstmt1, hstmt2;
RETCODE retcode;
UCHAR szName[ROWS][NAME_LEN], szBirthday[ROWS][BDAY_LEN];
UCHAR szNewName[NAME_LEN], szNewBday[BDAY_LEN];
SWORD sAge[ROWS], sNewAge[ROWS];
SQLLEN cbName[ROWS], cbAge[ROWS], cbBirthday[ROWS];
UDWORD fFetchType, irowUpdt;
SQLROWOFFSET irow;
SQLROWSETSIZE crow;
UWORD rgfRowStatus[ROWS];
SQLAllocEnv(&henv);
SQLAllocConnect(henv, &hdbc);
/* Specify that the ODBC Cursor Library is always used, then connect. */
SQLSetConnectOption(hdbc, SQL_ODBC_CURSORS, SQL_CUR_USE_ODBC);
SQLConnect(hdbc, "EmpData", SQL_NTS,
"JohnS", SQL_NTS,
"Sesame", SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
/* Allocate a statement handle for the result set and a statement */
/* handle for positioned update statements.
*/
SQLAllocStmt(hdbc, &hstmt1);
SQLAllocStmt(hdbc, &hstmt2);
/* Specify an updateable static cursor with 20 rows of data. Set */
/* the cursor name, execute the SELECT statement, and bind the */
/* rowset buffers to result set columns in column-wise fashion. */
SQLSetStmtOption(hstmt1, SQL_CONCURRENCY, SQL_CONCUR_VALUES);
SQLSetStmtOption(hstmt1, SQL_CURSOR_TYPE, SQL_SCROLL_STATIC);
SQLSetStmtOption(hstmt1, SQL_ROWSET_SIZE, ROWS);
SQLSetCursorName(hstmt1, "EMPCURSOR", SQL_NTS);
SQLExecDirect(hstmt1,
773
Implementation Notes
Implementation Notes
This section describes how the ODBC cursor library is implemented. It describes how
the cursor library maintains its cache, executes SQL statements, and implements ODBC
functions.
774
Column Data
The cursor library creates a buffer in the cache for each rgbValue buffer bound to the result
set with SQLBindCol. It uses the values in these buffers to construct a WHERE clause
when it emulates positioned update or delete statement. It updates these buffers from the
rowset buffers when it fetches data from the data source and when it executes positioned
update statements.
These buffers have the following restriction:
When it updates a column, a data source blank-pads fixed-length character data and zero-pads
fixed-length binary data as necessary. For example, a data source stores Smith in a CHAR(10)
column as Smith . The cursor library does not blank- or zero-pad data in the rowset buffers
when it copies this data to its cache after executing a positioned update statement. Therefore, if an
application requires that the values in the cursor librarys cache are blank- or zero-padded, it must
blank- or zero-pad the values in the rowset buffers before executing a positioned update statement.
Row Status
The cursor library creates a buffer in the cache for the row status. The cursor library
retrieves values for the rgfRowStatus array in SQLExtendedFetch from this buffer. For
each row, the cursor library sets this buffer to:
SQL Statements
SQL_ROW_SUCCESS when it successfully fetches the row from the data source
with SQLFetch.
Location of Cache
The cursor library caches data in memory and in files in the current directory. This limits
the size of the result set that the cursor library can handle only by available disk space.
If the cursor library terminates abnormally, such as when the power fails, it may leave
temporary files on the disk. These are named ~CTTnnnn.TMP and are created in the current directory.
SQL Statements
The ODBC cursor library passes all SQL statements directly to the driver except the following:
To execute positioned update and delete statements and to position the cursor on a row
to call SQLGetData for that row, the cursor library constructs a searched statement that
identifies the row.
776
SQL Statements
buffers and sets the corresponding value in the rgfRowStatus array in SQLExtendedFetch
to SQL_ROW_UPDATED. For positioned delete statements, it sets the corresponding
value in the rgfRowStatus array to SQL_ROW_DELETED.
Warning: The WHERE clause constructed by the cursor library to identify the
current row can fail to identify any rows, identify a different row, or identify
more than one row. For more information, see Constructing Searched Statements later in this appendix.
Positioned update and delete statements are subject to the following restrictions:
Positioned update and delete statements can only be used when a SELECT statement generated the result set, the SELECT statement did not contain a join, a
UNION clause, or a GROUP BY clause, and any columns that used an alias or
expression in the select list were not bound with SQLBindCol.
If the driver only supports one active hstmt, the cursor library fetches the rest of
the result set and then refetches the current rowset from its cache before it executing a positioned update or delete statement.
SQL Statements
778
Bind columns that uniquely identify the row. If the bound columns do not
uniquely identify the row, the WHERE clause constructed by the cursor library
might identify more than one row. In a positioned update or delete statement,
such a clause might cause more than one row to be updated or deleted. In a call
to SQLGetData, such a clause might cause the driver to return data for the
wrong row. Binding all the columns in a unique key guarantees that each row is
uniquely identified.
Allocate data buffers large enough that no truncation occurs. The cursor
librarys cache is a copy of the values in the rgbValue buffers bound to the result
set with SQLBindCol. If data is truncated when it is placed in these buffers, it
ODBC Functions
will also be truncated in the cache. A WHERE clause constructed from truncated
values might not correctly identify the underlying row in the data source.
Specify non-null length buffers for binary C data. The cursor library allocates
length buffers in its cache only if the pcbValue argument in SQLBindCol is nonnull. When the fCType argument is SQL_C_BINARY, the cursor library requires
the length of the binary data to construct a WHERE clause from the data. If there
is no length buffer for a SQL_C_BINARY column and the application calls
SQLGetData or attempts to execute a positioned update or delete statement, the
cursor library returns SQL_ERROR and SQLSTATE SL014 (A positioned request
was issued and not all column count fields were buffered).
Specify non-null length buffers for nullable columns. The cursor library allocates length buffers in its cache only if the pcbValue argument in SQLBindCol is
non-null. Because SQL_NULL_DATA is stored in the length buffer, the cursor
library assumes that any column for which no length buffer is specified is nonnullable. If no length column is specified for a nullable column, the cursor library
constructs a WHERE clause that uses the data value for the column. This clause
will not correctly identify the row.
ODBC Functions
When the ODBC cursor library is enabled for a connection, the Driver Manager calls
functions in the cursor library instead of in the driver. The cursor library either executes
the function or calls it in the specified driver.
SQLBindCol
An application allocates one or more buffers for the cursor library to return the current
rowset in. It calls SQLBindCol one or more times to bind these buffers to the result set.
If the application calls SQLBindCol to rebind result set columns after it has called
SQLExtendedFetch, the cursor library returns an error. Before it can rebind result set columns, the application must close the cursor.
SQLExtendedFetch
The cursor library implements SQLExtendedFetch by repeatedly calling SQLFetch. It
transfers the data it retrieves from the driver to the rowset buffers provided by the application. It also caches the data in memory and disk files. When an application requests a
779
ODBC Functions
new rowset, the cursor library retrieves it as necessary from the driver or the cache.
Finally, the cursor library maintains the status of the cached data and returns this information to the application in the rgfRowStatus buffer.
Rowset Buffers
The cursor library optimizes the transfer of data from the driver to the rowset buffer provided by the application if:
There are no unused bytes between fields in the structure the application
declares to hold a row of data.
When the application requests a new rowset, the cursor library retrieves data from its
cache and from the driver as necessary. If the new and old rowsets overlap, the cursor
library may optimize its performance by reusing the data from the overlapping sections
of the rowset buffers. Thus, unsaved changes to the rowset buffers are lost unless the
new and old rowsets overlap and the changes are in the overlapping sections of the
rowset buffers. To save the changes, an application submits a positioned update statement.
Note that the cursor library always refreshes the rowset buffers with data from the cache
when an application calls SQLExtendedFetch with the fFetchType argument set to
SQL_FETCH_RELATIVE and the irow argument set to 0.
780
The data retrieved by the cursor library may differ from the data that was available at the time the statement was executed. For example, after the cursor was
opened, rows inserted at a point beyond the current cursor position can be
retrieved by some drivers.
The data in the result set may be locked by the data source for the cursor library
and therefore unavailable to other users.
ODBC Functions
Once the cursor library has cached a row of data, it cannot detect changes to that row in
the underlying data source (except for positioned updates and deletes). This occurs
because, for calls to SQLExtendedFetch, the cursor library never refetches data from the
data source. Instead it refetches data from its cache.
Scrolling
The cursor library supports the following fetch types in SQLExtendedFetch:
Cursor Type
Fetch Types
Forward-only
SQL_FETCH_NEXT
Static
SQL_FETCH_NEXT
SQL_FETCH_PRIOR
SQL_FETCH_FIRST
SQL_FETCH_LAST
SQL_FETCH_RELATIVE
SQL_FETCH_ABSOLUTE
Errors
If the driver returns SQL_SUCCESS_WITH_INFO to the cursor library from SQLFetch,
the cursor library ignores the warning. It retrieves the rest of the rowset from the driver
and returns SQL_SUCCESS_WITH_INFO for SQLExtendedFetch. The application
cannot call SQLError to retrieve the warning information unless the warning occurred
the last time the cursor library called SQLFetch.
SQLFreeStmt
If an application calls SQLFreeStmt with the SQL_UNBIND option after it calls SQLExtendedFetch, the cursor library returns an error. Before it can unbind result set columns,
an application must call SQLFreeStmt with the SQL_CLOSE option.
781
ODBC Functions
SQLGetData
The cursor library implements SQLGetData by first constructing a SELECT statement
with a WHERE clause that enumerates the values stored in its cache for each bound
column in the current row. It then executes the SELECT statement to reselect the row
and calls SQLGetData in the driver to retrieve the data from the data source (as opposed
to the cache).
Warning: The WHERE clause constructed by the cursor library to identify the
current row can fail to identify any rows, identify a different row, or identify
more than one row. For more information, see Constructing Searched Statements earlier in this appendix.
Calls to SQLGetData are subject to the following restrictions:
SQLGetData can only be called when a SELECT statement generated the result
set, the SELECT statement did not contain a join, a UNION clause, or a GROUP
BY clause, and any columns that used an alias or expression in the select list
were not bound with SQLBindCol.
If the driver only supports one active hstmt, the cursor library fetches the rest of
the result set before executing the SELECT statement and calling SQLGetData.
SQLGetFunctions
The cursor library returns that it supports SQLExtendedFetch, SQLSetPos, and
SQLSetScrollOptions in addition to the functions supported by the driver.
782
ODBC Functions
SQLGetInfo
The cursor library returns values for the following values of fInfoType (| represents a bitwise OR); for all other values of fInfoType, it calls SQLGetInfo in the driver:
fInfoType
Returned Value
SQL_BOOKMARK_PERSISTENCE
SQL_FETCH_DIRECTION
SQL_FD_FETCH_ABSOLUTE |
SQL_FD_FETCH_FIRST |
SQL_FD_FETCH_LAST |
SQL_FD_FETCH_NEXT |
SQL_FD_FETCH_PRIOR |
SQL_FD_FETCH_RELATIVE
SQL_GETDATA_EXTENSIONS
SQL_LOCK_TYPES
SQL_LCK_NO_CHANGE
SQL_POS_OPERATIONS
SQL_POS_POSITION
SQL_POSITIONED_STATEMENTS
SQL_PS_POSITIONED_DELETE |
SQL_PS_POSITIONED_UPDATE |
SQL_PS_SELECT_FOR_UPDATE
SQL_ROW_UPDATES
SQL_SCROLL_CONCURRENCY
SQL_SCCO_READ_ONLY |
SQL_SCCO_OPT_VALUES
SQL_SCROLL_OPTIONS
SQL_SO_FORWARD_ONLY |
SQL_SO_STATIC
SQL_STATIC_SENSITIVITY
SQL_SS_UPDATES
783
ODBC Functions
Important: The cursor library implements the same cursor behavior when
transactions are committed or rolled back as the data source. That is, committing or rolling back a transaction, either by calling SQLTransact or by using
the SQL_AUTOCOMMIT connection option, can cause the data source to
delete the access plans and close the cursors for all hstmts on an hdbc. For
more information, see the SQL_CURSOR_COMMIT_BEHAVIOR and
SQL_CURSOR_ROLLBACK_BEHAVIOR information types in SQLGetInfo.
SQLGetStmtOption
The cursor library supports the following statement options with SQLGetStmtOption:
SQL_BIND_TYPE
SQL_CONCURRENCY
SQL_CURSOR_TYPE
SQL_ROW_NUMBER
SQL_ROWSET_SIZE
SQL_SIMULATE_CURSOR
SQLNativeSql
If the driver supports this function, the cursor library calls SQLNativeSql in the driver
passes the SQL statement. For positioned update, positioned delete, and SELECT FOR
UPDATE statements, the cursor library modifies the statement before passing it to the
driver.
SQLRowCount
When an application calls SQLRowCount with the hstmt associated with the cursor, the
cursor library returns the number of rows of data it has retrieved from the driver.
When an application calls SQLRowCount with the hstmt associated with a positioned
update or delete statement, the cursor library returns the number of rows affected by the
statement.
784
ODBC Functions
SQLSetConnectOption
An application calls SQLSetConnectOption with the SQL_ODBC_CURSORS option to
specify whether the cursor library is always used, used if the driver does not support
scrollable cursors, or never used. The cursor library assumes that a driver supports scrollable cursors if it returns SQL_FD_FETCH_PRIOR for the SQL_FETCH_DIRECTION
option in SQLGetInfo.
The application must call SQLSetConnectOption to specify the cursor library usage
after it calls SQLAllocConnect and before it connects to the data source. If an application
calls SQLSetConnectOption with the SQL_ODBC_CURSORS option while the connection is still active, the cursor library returns an error.
To set a statement option supported by the cursor library for all hstmts associated with an
hdbc, an application must call SQLSetConnectOption for that statement option after it
connects to the data source and before it opens the cursor. If an application calls SQLSetConnectOption with a statement option and a cursor is open on an hstmt associated with
the hdbc, the statement option will not be applied to that hstmt until the cursor is closed
and reopened.
SQLSetPos
The cursor library only supports the SQL_POSITION operation for the fOption argument
in SQLSetPos. It only supports the SQL_LOCK_NO_CHANGE value for the fLock argument.
SQLSetScrollOptions
The cursor library supports SQLSetScrollOptions only for backwards compatibility;
applications should use the SQL_CONCURRENCY, SQL_CURSOR_TYPE, and
SQL_ROWSET_SIZE statement options instead.
SQLSetStmtOption
The cursor library supports the following statement options with SQLSetStmtOption:
SQL_BIND_TYPE
SQL_CONCURRENCY
SQL_CURSOR_TYPE
SQL_ROWSET_SIZE
SQL_SIMULATE_CURSOR
785
ODBC Functions
SQLTransact
The cursor library does not support transactions and passes calls to SQLTransact
directly to the driver. However, the cursor library does support the cursor commit and
rollback behaviors as returned by the data source with the
SQL_CURSOR_ROLLBACK_BEHAVIOR and SQL_CURSOR_COMMIT_BEHAVIOR
information types. Thus:
786
For data sources that preserve cursors across transactions, changes that are
rolled back in the data source are not rolled back in the cursor librarys cache. To
make the cache match the data in the data source, the application must close and
reopen the cursor.
For data sources that close cursors at transaction boundaries, the cursor library
closes the cursors and deletes the caches for all hstmts on the hdbc.
For data sources that delete prepared statements at transaction boundaries, the
application must reprepare all prepared hstmts on the hdbc before reexecuting
them.
Description
01000
SQLExtendedFetch
01000
SQLBrowseConnect
SQLConnect
SQLDriverConnect
01000
SQLBrowseConnect
SQLConnect
SQLDriverConnect
01000
SQLBrowseConnect
SQLConnect
SQLDriverConnect
01000
Driver returned
SQL_SUCCESS_WITH_INFO. The
warning message has been lost.
SQLExtendedFetch
S1000
SQLExtendedFetch
SQLGetData
S1000
SQLExtendedFetch
SQLGetData
S1000
SQLExtendedFetch
SQLGetData
S1000
SQLFreeStmt
SL001
SQLExecDirect
SQLGetData
SQLPrepare
SL002
SQLExecute
SQLExecDirect
SQLGetData
787
788
SQLSTATE
Description
SL003
SQLExtendedFetch
SL004
SQLGetData
SL005
SQLGetData
SL006
SQLPrepare
SQLExecDirect
SL007
SQLExtendedFetch
SL008
SL009
SQLExtendedFetch
SL010
SQLExtendedFetch
SQLGetData
SL011
SQLGetStmtOption
SL012
SQLBindCol
SQLFreeStmt
SQLSetStmtOption
SL014
SQLExecDirect
SQLExecute
SQLPrepare
Index
Symbols
% (Percent sign) 208, 597
(Single-quote) 235
) 13
* (Asterisk) 249
... (Ellipsis) 13
.h files 41
? (Question mark)
browse result connection string
249
parameter markers 335, 486
_ (Underscore) 208
{ } (braces) 249
| (Vertical bar) 13
A
Access mode 318
Access plans 64, 137
deleting 487
Addresses, resolving 127
Administrator, ODBC 181
ALIAS table type 599
Aliases, column 418
Allocating memorySee Memory, allocating 69
ALTER TABLE statements
data type names 671
interoperability 61
modifying syntax 61
qualifier usage in 438
supported clauses 417
API conformance 29
Application
examples 106
Applications
described\_CH01PR.DOC-1047
22
109
examples
Architecture, ODBC
error handling 97, 171
gateways 24, 100, 176
multiple-tier 24
single-tier 24
Arguments
naming conventions 203
null pointers 44, 118
pointers 44, 118
search patterns 208
See also Parameters 44
SQLTables 597
validating 114
ArraysSee Binding columns, columnwise 83
ArraysSee Parameters, arrays 83
Association management statements
751
Asterisk (*) 249
Asynchronous execution
described 69, 144
SQLCancel 256
state transitions 649
terminating 179
terminating\_CH09PR.DOC-1012
103
Attributes
columns 263, 299
data types 460
Authentication stringsSee Connection
strings 13
Auto-commit mode
described 66, 140
See also Transactions 66
specifying 526
SQLTransact 602
B
Bar, vertical (|) 13
Batch statements
in cursor library 777
processing 463
syntax 681
Binary data
converting to C 723
converting to SQL 735
literal length 429
null termination byte 237
retrieving in parts 392, 398
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
transferring 708
Binary large object (BLOB)See
SQLGetData 224
Bindind columns
code examples 357
Binding columns
binding type 564
column attributes 80
column-wise 83, 156, 348
cursor library restrictions 775
null pointers 225
row-wise 84, 157, 349
See also Converting data 564
See also Retrieving data 564
See also Rowsets 564
single row 80, 153
SQLBindCol 223
unbinding 225, 380
Binding parametersSee Parameters,
binding 68
Bit data
converting to C 722
converting to SQL 735
specifying conversions
SQLBindCol 219
790 ODBC 2.0 Programmers Manual
SQLBindParameter 233
SQLGetData 391
BLOB, Binary large objectSee
SQLGetData 224
Block cursors 85, 159
Blocks of data See Rowsets 156
Bookmarks
described 88, 163
enabling 569
persistence 418
SQLExtendedFetch 354
Boundaries, segment 44, 118
Braces ({ }) 13, 249, 315
Browse request connection string 248
Browse result connection string 248
Buffer
input 118
output 119
validating 115
Buffers
allocating 43, 118
cursor library cache 775
input 44
interoperability 44, 118
maintaining pointers 44
NULL data 45, 118, 119
null pointers 44, 118, 119
null termination 45, 119
output 44
See also NULL data 43
See also Null termination byte 43
segment boundaries 44, 118
truncating data 45, 119
Bulk operations 477
C
C data types
conversion examples 727, 740
converting from SQL data types
714, 717, 720, 722,
723, 724, 725
converting to SQL data types 728,
45, 118,
237
retrieving in parts 392, 398
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
Character sets 58, 132
Characters, escape 208
Characters, specialSee Special characters 208
CLI (Call Level Interface)
described 38
support of 434
CLI (Call level interface)
interoperability 39
Closing cursors 380, 421
SQLCancel 256
SQLFreeStmt 103, 179
Clustered indexes 584
Code examples
ad hoc query 109
connection browsing 56, 131
cursor library 773
parameter values 65
See also specific function description 106
static SQL 106
Codes, return 95, 169
Collating 433, 585
Columns
aliases 418
attributes 263, 299
bindingSee Binding columns 354
cursor library using 775
foreign keys 372
in GROUP BY clauses 430
in indexes 430
497
pseudo 577
See also Result sets 594
See also Retrieving data 390
See also SQL data types 698
See also Tables 594
signed 266
unbinding 225, 380
uniquely identifying row 575
Column-wise bindingSee Binding columns, column-wise 156
COMMIT
SQLExecDirect 335
COMMIT statements
interoperability 66, 140, 335
SQLExecute 341
SQLPrepare 486
Committing transactions 602
Components, ODBC 22, 23
Components, ODBC\_CH01PR.DOC1030 21
Concurrency
defined 88, 162
row locking 546
serializability 88, 162
simulating transactions 546
specifying 553
supported types 440
ConfigDSN
function description 605
792 ODBC 2.0 Programmers Manual
with
SQLRemoveDSNFromIni
608
with SQLWriteDSNToIni 607
with
SQLWritePrivateProfileString 607
ConfigTranslator
function description 608
See also Translator setup shared library 605
Configuring data sourcesSee Data
sources, configuring 51
Conformance levels
API 29
by function 403
determining 41, 434, 435
in ODBC 1.0 31, 91
SQL 673, 698, 699, 701
supporting 117
Connection handles
active 417
allocating 52, 211
defined 45
freeing 180
freeing\_CH09PR.DOC-1024 104
overwriting 211
See also Handles 45
SQLFreeConnect 376
state transitions 640
with threads 211
Connection options
access mode 318
commit mode 526
current qualifier 527
dialog boxes 528
driver-specific 121
login interval 318, 527
maximum length 385, 525
packet size 528
releasing 524
reserved 524
retrieving 383
766
default conversions 707
examples 727, 740
hexadecimal characters 723, 733,
735
information types
416
45
See also Truncating data 154
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
SQL to C 714, 717, 720, 722,
723, 724, 725
SQLExtendedFetch 348
SQLFetch 224
SQLGetData 398
Core API conformance 29
Core SQL conformance 30
Correlation names 420
CREATE TABLE statements
data type names 671
interoperability 61
modifying syntax 61
NOT NULL clauses 433
qualifier usage in 438
Currency columns 264
Currency data types 458
Current qualifier 527
Current row 451
Cursor
block 159
closing
SQLFreeStmt 103, 179
described 155
scrollable 159
specifying type 161
Cursor library
batch statements 777
cache 775
code example 773
described 769
Driver Manager 769
errors 787
354
SQLFetch 364
SQLSetPos 543
Cursors
closing cursors
SQLCancel 256
deleting 421
described 82
dynamic 86, 160
getting names 389
holes in 86, 160, 441
in cursor library 769, 775, 781
keyset size 555, 557
keyset-driven 86, 160
maximum name length 431
mixed 87, 161
positioned statements 90, 164
positionSee Cursor position 544
scrollable 85
See also Concurrency 88
See also Cursor library 769
sensitivity 441
setting names 535
simulated 575
specifying type 87
SQLFreeStmt 380
SQLSetScrollOptions 554, 557
794 ODBC 2.0 Programmers Manual
Data-at-execution
canceling 256
columns 92, 165
macro 232, 235, 237, 238, 548
parameters 68, 142
SQLBindParameter 232, 235,
237, 238
SQLSetPos 548
Database
19
Databases
current 527
defined\_CH01PR.DOC-1012 19
information types 413
names 422
See
also
Data
sources
\_CH01PR.DOC-1010
19
Date data
converting to C 724
converting to SQL 736
intervals 444
literals 72, 146
scalar functions 760
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
Date functions 760
DBMS product information 413
DDL (Data Definition LanguageSee
Data Definition Language (DDL) 30
Debugging
drivers 122
Declarative statements 746
Delete rules 372
DELETE statements
affected rows 518
cascade delete 372
qualifier usage in 438
restrictive delete 372
438
Deprecated functions 537
Descriptors
columns 263, 299
driver-specific 121, 263
parameters 303
Diagnostic statements 753
Dialog boxes
disabling 528
SQLDriverConnect 316, 318
Direct invocation,SQL 36
Dirty reads 423
Display size 264, 713
DML (Data Manipulation LanguageSee
Data Manipulation Language (DML)
30
Documentation 13
Driver
errors 170
Driver keyword 315
version compatibility 250
Driver Manager
allocating handles 213
cursor library 769
described 22, 42, 113
error checking 114, 116
errors 97, 101, 177
functions supported 403
import library 113
listing data sources 292
listing drivers 323
loading drivers 127, 286
ODBC version supported 435
required files 181
SQLBrowseConnect 250
SQLConnect 286, 287
SQLDriverConnect 316
SQLError 326
SQLSTATE values 207
state transitions 635
tracing 379, 528
transactions 33, 602
unloading drivers 127, 287
validation 114
Driver setup shared library
default translation shared library
189
described 189
function summary 201
Drivers
allocating handles 213
connection options 121
cursor library 769
default 186
described 22
descriptor types 121
errors 95
file usage 426
functionality 32
functions supported 403
information types 121, 412
installating 181
keywords 323
listing installed 323
loading 127, 286
multiple-tierSee Multiple-tier drivers 23
required files 181
single-tierSee Single-tier drivers
23
SQL data types 121
SQLError 326
SQLSTATE values 207
statement options 121
testing 122
unloading 127
DROP INDEX statements 584
796 ODBC 2.0 Programmers Manual
52
overwriting 213
See also Handles 45
SQLFreeEnv 378
state transitions 637
with threads 213
Error handling
Driver Manager state transitions
114
rules 172
Error handling, Driver Manager state
transitions 115
Errors
application processing 101
clearing 327
documenting 173
Driver Manager error checking
114, 116
format 97, 171
odbc.ini 190
odbcinst.ini 182
redistributable 181
trace 114, 528
usage 426
Filtered indexes 585
Floating point data
converting to C 720
converting to SQL 733
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
Foreign keys 371
Freeing handles 376, 378, 383
Function libraries 38
Functionality, driver 32, 403, 412
Functions, ODBC
API conformance 29
asynchronous execution 69
buffers 43, 118
canceling 255
deprecated 537
Driver Manager 127
driver manager 113
in cursor library 779
list of 195
loading by ordinal 127
return codes 95, 169
See also specific function 52
SQL statement equivalents 743,
746, 747, 748, 749,
751, 753
state transitions 635
supported 403
Functions, scalar
CONVERT 74, 148, 766
date 760
numeric 758
string manipulation 755
system 765
time 760
Functions,ODBC
driver manager 113
G
Gateways 24, 100, 176
GLOBAL TEMPORARY table type
599
640
defined 45, 119
Driver Manager uses 127
error queues 327
library 425
SQLAllocConnect 211
SQLAllocEnv 213
SQLAllocStmt 216
SQLFreeConnect 376
SQLFreeEnv 378
SQLFreeStmt 383
statementSee Statement handles
562
validating 114
Hashed indexes 584
hdbcSee Connection handles 767
Header file
sql.h
contents 117
Header files
required 41, 117
sql.h
C data types 120
contents 207
SQL data type 698, 699
sqlext.h
C data types 46, 120
798 ODBC 2.0 Programmers Manual
735
SQLParamOptions 477
Installation
described 181
redistributable files 181
See also odbc.ini 181
See also odbcinst.ini file 182
Integer data
converting to C 720
converting to SQL 733
ODBC 1.0 compatibility 705
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
Integrity enhancement facility (IEF)
435, 671
Interoperability
affected rows 80
buffer length 44, 118
call level interface 39
cursor names 535
default C data type 707
defined 19
functionality 32, 412
functions 412
procedure parameters 76, 151
pseudo-columns 577
SQL statements
ALTER TABLE 61, 452
COMMIT 66, 335, 341, 486
CREATE TABLE 61, 452
industry standard 35
ODBC extensions 71, 145
ROLLBACK 335, 341, 486
syntax 135, 671
SQLGetData 83, 84, 398
transactions 66, 140
transferring data 708
Intervals, datetime 444, 762
Invocation, direct 36
Isolation levels, transaction 423
J
Joins, outer
described 75, 150
support of 435
K
Keys
foreign 370
primary 491
Keyset size 555, 557
Keyset-driven cursors 86, 160
Keywords
data source-specific 429
in SQLBrowseConnect 248
in SQLDriverConnect 315
ODBC 691
L
Language, SQL Module 36
Length, available
SQLBindParameter 238
SQLExtendedFetch 349
SQLFetch 365
SQLGetData 397
Length, buffer
input 44, 118
output 45, 119
SQLBindCol 224
SQLBindParameter 236
SQLGetData 397
Length, column
cursor library using 775
defined 712
result sets 264, 294
tables 279, 576
Length, data-at-execution 237,
548
Length, maximum
buffers 44, 118
column names length 430
columns 365, 397
connection options 385, 525
cursor names 431, 535
238,
data 566
error messages 326
indexes 431
literals 429
owner name 431
procedure names 431
qualifiers 431
rows 431
statement options 450, 562
table names 432
user names 432
Length, unknown
in length 712
in precision 709
SQLBindParameter 238
SQLExtendedFetch 349
SQLFetch 365
SQLGetData 397
Level 1 API conformance 29
Level 2 API conformance 30
Levels, conformanceSee Conformance
levels 41
Library
function call 38
Library handles, driver 425
LIKE predicates
described 75, 149
support of 429
Limitations, SQL statements 415
Literals
binary 429
character 429
date 72, 146
prefix string 456
procedure parameters 76
suffix string 456
time 72, 146
timestamp 72, 146
Loading drivers 127, 286
LOCAL TEMPORARY table type 599
Locking
800 ODBC 2.0 Programmers Manual
concurrency 554
row 546
supported locks 429
Login authorization
connection strings
description 54, 128
SQLBrowseConnect
248,
317
described 126
dialog boxes 55, 130
example 288
interval period 318, 527
See also Connections 54
SQLSetConnectOption 527
timeout 318
Long data values
length required 432
retrieving 82, 155
sending
from rowset 165
from rowsets 92
in parameters 68, 142
SQLBindParameter 238
SQLSetPos 548
SQLGetData 398
M
Macros
data-at-execution 232, 235, 237,
238, 548
SQLSetPos 551
Manual-commit mode
beginning transactions 603
described 66, 140
See also Transactions 66
specifying 526
SQLTransact 603
Manuals 13
Memory, allocating
buffers 43, 118
connection handles 45, 120
environment handles 45, 120
result sets 80
rowsets 83
SQLAllocConnect 211
SQLAllocEnv 213
SQLAllocStmt 216
SQLFreeConnect 376
SQLFreeEnv 378
SQLFreeStmt 383
statement handles 45, 120
Memory,allocating
connection handle 120
Messages, errorSee Errors 96
Minimum SQL conformance level 30
Mixed cursors 87, 161
Modes
access 318
auto-commitSee
Auto-commit
mode 66
manual-commitSee Manual-commit mode 66
Module language, SQL 36
Module language,SQL 36
Money columns 264
Money data types 458
Multiple_tier drive
identifying data sources 98
Multiple-tier driver
error messages 175
identifying data sources 172
Multiple-tier drivers
configurations 24
described 23
error messages 99
Multi-threading
canceling functions 257
with connection handles 211
with environment handles 213
with statement handles 216
N
Names
arguments 203
correlation 420
cursors 389, 535
data source 422
database 422
driver 425
index 584
localized data types 458
procedure 507
procedure columns 498
See also Terms 436
server 441
table 597
tables 599
translation shared library 190
user 447
Network traffic
maximum data length 566
packet size 528
prepared statements 64, 138
Nonrepeatable reads 423
NOT NULL clauses 433
NULL data
collating 433
concatenation behavior 418
input buffer 118
output buffer 119
output buffers 45
retrieving 224
SQLBindParameter 237
SQLExtendedFetch 349
SQLFetch 365
SQLGetData 397
SQLPutData 511
SQLSetPos 545
Null pointers
error handling 114
input buffers 44, 118
output buffers 44, 119
parameter length 237
unbinding columns 225
Null termination byte
743
history\_CH01PR.DOC-1007 19
interface 20
version compatibilitySee Version
compatibility 537
odbc.ini
192
keywords
192
ODBC adminstrator 181
ODBC architecture
error handling 97, 171
gateways 24, 100, 176
multiple-tier 24
single-tier 24
802 ODBC 2.0 Programmers Manual
191
odbcinst.ini
183, 187
odbc.ini
data source specification sections
191
default data source specification
section 192
keywords
Description 191
Driver 191
InstallDir 192
Trace 192
trace 213
TraceAutoStop 192
TraceFile 192
TranslationName 191
TranslationOption 191
TranslationSharedLibrary
191
listing drivers 323
ODBC functions using
SQLAllocEnv 213
SQLBrowseConnect 249
SQLConnect 287
SQLFreeEnv 379
SQLSetConnectOption 527
See also data sources 191
Setup shared library functions using
ConfigDSN 607
structure 182, 190
odbcinst.ini
default driver 186
described 181
driver specification sections 183
keywords 183
translator specification sections
187
Optimistic concurrency control 554
See SQLSetStmtOption 165
Optimistic concurrency controlSee
Concurrency 88
Options
connectionSee Connection options
70
driver-specific 121
fetch 353
statementSee Statement options 70
validating 114
options section 192
ORDER BY clauses
columns in select list 435
expressions in 426
maximum columns in 430
Ordinal values 127
Outer joins
described 75, 150
support of 435
Output buffers 44, 119
Output parameters 233
Owner names
maximum length 431
procedure 498, 507
table 591, 597
SQLColAttributes 264
SQLColumnPrivileges 271
SQLColumns 278
term, vendor-specific 436
P
Packet size 528
Pages, index or table 585
Parameters
arrays 69, 143, 236, 477
binding 65, 139, 231
data types 300, 672
data-at-execution 68, 142, 232,
249
parameter markers 335, 486
Queues, error 170, 327
Quoted identifiers
case sensitivity 439
R
Radix 279, 501
Railroad diagrams
conventions used in 16
Read committed isolation level 423
Read only
access mode 318
concurrency 554
data sources 422
Read uncommitted isolation level 423
Read/write access mode 318
Reads, dirty 423
Reads, nonrepeatable 423
REFERENCES statements 272
Referential integrity 435, 671
Refreshing data
SQLExtendedFetch 354
SQLSetPos 544
Remarks 280, 599
Repeatable read isolation level 423
Restricted deletes 372
Restricted updates 372
Result sets
arraysSee Rowsets 84
binding columns 80, 153
binding rowsetsSee Binding columns, column-wise 157
bookmarkSee Bookmark 163
column attributes 80, 154
described 49, 79, 123, 153
fetching data 81
fetching rowsets 84, 158
multiple 93, 167, 432
number of columns 80, 154
number of rows 80, 154
retrieving data in parts 82, 155
rowset size 83, 156
See also Cursors 85
See also Rows 518
SQLBindCol 223
SQLColAttributes 263
SQLDescribeCol 293
SQLFreeStmt 380
SQLMoreResults 463
SQLNumResultCols 470
SQLProcedures 506
SQLRowCount 518
Result statesSee State transitions 635
Retrieving data
arraysSee Rowsets 390
binding columnsSee Binding columns 390
cursor position 350, 364, 544
disabling 568
fetching data 81, 154
fetching rowsets 84, 158
in parts 82, 155, 398
341
SQLExecute 341
SQLPrepare 486
Rolling back transactions
66, 140,
602
Row status array
cursor library using 775
errors 352, 550
SQLExtendedFetch 356
SQLSetPos 544, 550
updating 166, 167, 544
Row versioning isolation level 423
ROWID 575, 577
Rows
adding 92, 166
affected 518
after last row 354
concurrency 554
current 451
deleting 90, 93, 164, 167
Scale
columns
procedures 500
result sets 296
tables 279, 577
data types 459
defined 710
Scope, rowid 578
Scrollable cursors 85, 159
Search patterns 208
Searchability
columns 265
data types 457
Searched statements 778
Segment boundaries 44, 118
SELECT FOR UPDATE statements
91, 437, 777
Select list
maximum columns in 430
ORDER BY columns in 435
SELECT statements
affected rows 518
bulk 477
cursor name 385, 535
maximum rows 567
maximum tables in 432
multiple result sets 90, 167, 463
privileges 272
qualifier usage in 438
reexecuting 341
See also Result sets 430
UNION clauses 446
Sensivity, cursor 441
Separator, qualifier 438
Serializability 88
Serializable isolation level 423
Server name 441
Setup programSee installation 181
Setup shared librarySee Driver setup
shared library 201
shared library See specific shared li-
brary 769
Signed columns 266
Signed data types 458
Simulated cursors
by applications 575
by cursor library 769
Simulating transactions 546
Single-quote () conversion 235
Single-tier driver
error messages 98, 175
Single-tier drivers
configurations 24
described 23
file usage 426
Size, display 264, 713
Sorting 433, 585
Special characters
in search patterns 208
in SQL identifiers 441
in SQLBrowseConnect 248, 249
in SQLDriverConnect 315
SQL 379, 555
data typesSee SQL data types 707
described 35
dynamic 38, 749
dynamic SQL 37
embedded
ANSI SQL-92 standards 36
described 36
described\_CH01PR.DOC1005 19
executing statements 63, 137
ODBC function equivalents
743, 746, 747, 748
positioned statements 90, 164
static SQL 36
information types 414, 415
interoperability 35, 61, 671
keywords 691
ODBC extensions to 71, 141
ODBC grammar 671
615
length 712
parameters 300, 672
precision 709
scale 710
See also C data types 735
See also Converting data 735
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
supported 456
supporting 120
SQL identifiers
special characters 441
SQL quoted identifiers
case sensitivity 439
SQL statements
batch 463, 681, 777
direct execution 63, 64, 137, 139
embedded 743, 746
ODBC function equivalents
747, 748
in cursor library 776
information types 414
interoperability 671
keywords 691
maximum length 432
modifying syntax 61, 135
native 464
ODBC-specific 146
parametersSee Parameters 38
prepared execution 63, 137
qualifier usage in 438
query timeout 567
See also Conformance levels 69
See also specific statements 69
See also SQL 69
single-tier drivers, limitations 24
SQLCancel 255
SQLExecDirect 335
SQLExecute 341
SQLPrepare 486
terminating 103
SQL_ERROR 95, 169
SQL_INVALID_HANDLE 95, 169
SQL_NEED_DATA 95, 169
SQL_NO_DATA_FOUND 95, 169
SQL_STILL_EXECUTING 95, 169
SQL_SUCCESS 95, 169
SQL_SUCCESS_WITH_INFO
95,
169
SQLAllocConnect
allocating handles 52, 126
function description 209
with SQLConnect 286
SQLAllocEnv
function description 212
808 ODBC 2.0 Programmers Manual
380
version compatibility 241, 537
with SQLParamData 235, 238
with SQLParamOptions 235, 236
with SQLPutData 238
SQLBrowseConnect
code example 251
connecting with 130
Driver Manager 250
example 56, 131
function description 243
with SQLDisconnect 251
SQLCancel
function description 254
terminating asynchronous execution 103, 179
SQLColAttributes
column attributes 80, 154
611
SQLDescribeCol 80, 154, 293
SQLDescribeParam 299
SQLDisconnect
disconnecting 127, 180
disconnecting\_CH09PR.DOC1021 104
function description 304
with SQLBrowseConnect 251
with SQLFreeConnect 377
SQLDriverConnect
connecting with 54, 128
connection strings 54, 128
dialog box 129
dialog boxes 55
Driver Manager 316
function description 309
login interval 318
odbc.ini 54, 128
SQLDrivers
function description 319
listing drivers 55, 129
dles\_CH09PR.DOC1023 104
function description 378
with SQLFreeConnect 379
SQLFreeStmt
closing cursors 82, 380
freeing statement handles 179,
383
freeing
statement
handles\_CH09PR.DOC1003 103
function description 380
in cursor library 781
unbinding columns 103, 179,
225, 380
unbinding parameters 66, 140,
231, 380
SQLGetConnectOption 383
SQLGetCursorName 386
SQLGetData
code example 399
function description 390
in cursor library 782
interoperability 83, 84
long data values 82, 155, 224
unbound columns 82, 155
with SQLExtendedFetch 84, 158
with SQLFetch 365
SQLGetFunctions
code example 405
function description 400
implementing 128, 141
in cursor library 782
using 67
SQLGetInfo
code example 447
data conversion 416
data sources 413
DBMSs 413
drivers 412
driver-specific information types
810 ODBC 2.0 Programmers Manual
121
function description 407
in cursor library 783
scalar functions 416
SQL statements 414
SQLGetStmtOption 448, 784
SQLGetTranslator 189
SQLGetTypeInfo
ALTER TABLE statements 671
CREATE TABLE statements 671
function description 452
supported data types 46, 120, 698
versus SQLColAttributes 460
SQLMoreResults 93, 167, 461
SQLNativeSql 464, 784
SQLNumParams 467
SQLNumResultCols 80, 154, 470
SQLParamData
data-at-execution parameters 68,
142
function description 473
with SQLBindParameter
235,
238
with SQLPutData 473
with SQLSetPos 548
SQLParamOptions
code example 480
function description 477
multiple parameter values
143, 477
with SQLBindParameter
69,
235,
236
SQLPrepare
function description 481
preparing statements 63, 137
with SQLExecute 341
SQLPrimaryKeys 67, 141, 488
SQLProcedureColumns
catalog 67, 142
function description 493
listing columns 77, 152
SQLProcedures
catalog 67, 142
code example 508
listing procedures 77, 152
SQLPutData
code example 515
data-at-execution parameters 68,
142, 548
function description 510
with SQLBindParameter 238
with SQLParamData 473
with SQLSetPos 548
SQLRemoveDefaultDataSource 189
SQLRemoveDSNFromIni 608
SQLRowCount
affected rows 93, 154, 167
function description 518
in cursor library 784
interoperability 80
SQLSetConnectOption
commit mode 66, 140, 526
function description 521
in cursor library 785
See also Connection options 521
translating data 58, 132
with SQLConnect 286
with SQLTransact 526
SQLSetCursorName 164, 533
SQLSetParam 241, 537
SQLSetPos
code example 551
function description 537
in cursor library 785
lock types supported 429
locking rows 88, 163
macros 551
modifying rowset 91
modifying rowsets 165
operations supported 437
refreshing rows 162
with SQLExtendedFetch 350
104
function description 600
in cursor library 786
rolling back 66, 104, 140, 180
two-phase commit 603
with SQLSetConnectOption 526
SQLWriteDSNToIni 607
SQLWritePrivateProfileString
190,
607
State transitions
connection handles 640
defined 635
environment handles 637
SQLColumnPrivileges 271
SQLColumns 278
SQLTables 597, 599
owner nameSee Owner names 271
pages 585
primary keys 371, 492
qualifierSee Qualifiers 271
rowsSee Rows 431
statistics 583
term, vendor-specific 444
types 599
versus views 207
Terminating
asynchronous execution 179
asynchronous
execution\_CH09PR.DOC1011 103
transactions 180
transactions\_CH09PR.DOC-1017
104
Termination byte, nullSee Null termination byte 44
Terms, vendor-specific
owner 436
procedure 437
qualifier 438
table 444
Testing
drivers 122
The 120
Threads, multiple
canceling functions 257
with connection handles 211
with environment handles 213
with statement handles 216
Time data
converting to C 724
converting to SQL 737
literals 72, 146
scalar functions 760
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
Time functions 760
Timeout
login 318, 527
query 567
Timestamp data
converting to C 725
converting to SQL 738
literals 72, 146
scalar functions 760
specifying conversions
SQLBindCol 219
SQLBindParameter 233
SQLGetData 391
TIMESTAMPADD intervals 444
TIMESTAMPDIFF intervals 444
Trace file 114, 528
Trace keyword
SQLAllocEnv 213
Tracing
SQLAllocEnv 213
SQLFreeEnv 379
SQLSetConnectOption 528
Traffic, network
maximum data length 566
packet size 528
prepared statements 64, 138
Transactions
access plan behavior 137
beginning 66, 140, 603
commit mode 66, 140, 526
committing 66, 140, 602
concurrencySee Concurrency 546
cursor behavior 155, 603
described 33
in cursor library 786
incomplete 306
interoperability 66, 140
isolation levels 423
635
Translation options
default 608
described 532
specifying 529
SQLConnect 287
SQLDriverConnect 319
Translation setup shared library
ConfigTranslator 605
See also Translation shared libraries 605
Translation SHARED libraries
SQLDriverToDataSource 618
Translation shared libraries
character sets 58, 132
default 189, 190, 319
default option 608
described 58, 132, 532
function summary 202
See also Converting data 714
See also odbc.ini 190
See also odbcinst.ini 187
setup shared librarySee Translation
setup shared library 605
specifying 529
SQLConnect 287
SQLDataSourceToDriver 613
814 ODBC 2.0 Programmers Manual
SQLDriverConnect 319
truncating data 614, 618
TranslationName keyword 190
TranslationOption keyword 190
TranslationSharedLibrary
keyword
190
Truncating data
during conversion 154
maximum data length 566
output buffer 119
output buffers 45
See also Binary data 697
See also Character data 697
See also Converting data 154
SQLBindCol 224
SQLBindParameter 236
SQLFetch 365
SQLGetData 398
translation shared libraries 614,
618
Two-phase commit 603
Types, information 410
Typographic conventions 13
Typographical conventions 15
U
Unbinding columns 225, 380
Unbinding parameters 380
Underscore (_) 208
UNION clauses 446
Unique indexes 584
Unloading drivers 287
Update rules 372
UPDATE statements
affected rows 518
bulk 69, 143, 477
cascade update 372
privileges 272
qualifier usage in 438
restrictive update 372
See also SQLSetPos 537
Updates, positionedSee Positioned up-
date statements 90
User names
maximum length 432
retrieving 447
V
Validation by Driver Manager
114,
115
Values
ordinal 127
procedure return 233
Values, compare before update 554
Variables, host 36, 743
Version
DBMS 423
driver 122
number 425
ODBC version 425
Driver Manager 435
Version compatibility
C data type 705
default C data types 707
fetch options 353
filtered indexes 586
information types 411
number of input parameters 507
number of output parameters 507
number of result sets 507
parameter binding 241, 537
positioned statements 31, 91
pseudo columns 577
SQLBindParameter 241, 403,
537
SQLForeignKeys 373
SQLGetTypeInfo 459
SQLSetParam 241, 403, 537
SQLSetScrollOptions 554
Versioning isolation level 423
Vertical bar (|) 13
VIEW table type 599
Views 207
W
When 379
Window handles
null 607
parent
ConfigDSN 607
quiet mode 528
See also SQLDriverConnect 607
Windows 3.1
configuring data sources 189
Windows NT registry
data sources
adding 607
configuring 608
removing 608