example1.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
- /* -*- C -*- */
- /* The first example illustrates creating a table, adding some data
- * to it, and selecting the inserted data. The second example shows
- * interactive ad hoc query processing.
- *
- * Actual applications include more complete error checking following
- * calls to SQL/CLI routines. That material is omitted from this
- * Appendix for the sake of clarity.
- *
- * This file is adapted for PostgreSQL
- * from the CLI Annex in the SQL98 August 1994 draft standard.
- * Thomas G. Lockhart 1999-06-16
- */
- /*
- * B.1 Create table, insert, select
- *
- * This example function creates a table, inserts data into the table,
- * and selects the inserted data.
- *
- * This example illustrates the execution of SQL statement text
- * both using the Prepare() and Execute() method and using the
- * ExecDirect() method. The example also illustrates both the case
- * where the application uses the automatically-generated descriptors
- * and the case where the application allocates a descriptor of its
- * own and associates this descriptor with the SQL statement.
- *
- * Code comments include the equivalent statements in embedded SQL
- * to show how embedded SQL operations correspond to SQL/CLI function
- * calls.
- */
- #include <sqlcli.h>
- #include <string.h>
- #ifndef NULL
- #define NULL 0
- #endif
- int print_err(SQLSMALLINT handletype, SQLINTEGER handle);
- int example1(SQLCHAR *server, SQLCHAR *uid, SQLCHAR *authen)
- {
- SQLHENV henv;
- SQLHDBC hdbc;
- SQLHDESC hdesc;
- SQLHDESC hdesc1;
- SQLHDESC hdesc2;
- SQLHSTMT hstmt;
- SQLINTEGER id;
- SQLSMALLINT idind;
- SQLCHAR name[51];
- SQLINTEGER namelen;
- SQLSMALLINT nameind;
- /* EXEC SQL CONNECT TO :server USER :uid; */
- /* allocate an environment handle */
- SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
- /* allocate a connection handle */
- SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
- /* connect to database */
- if (SQLConnect(hdbc, server, SQL_NTS, uid, SQL_NTS,
- authen, SQL_NTS)
- != SQL_SUCCESS)
- return(print_err(SQL_HANDLE_DBC, hdbc));
- /* allocate a statement handle */
- SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
- /* EXEC SQL CREATE TABLE NAMEID (ID integer, NAME varchar(50)); */
- {
- SQLCHAR create[] ="CREATE TABLE NAMEID (ID integer,"
- " NAME varchar(50))";
- /* execute the CREATE TABLE statement */
- if (SQLExecDirect(hstmt, create, SQL_NTS) != SQL_SUCCESS)
- return(print_err(SQL_HANDLE_STMT, hstmt));
- }
- /* EXEC SQL COMMIT WORK; */
- /* commit CREATE TABLE */
- SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT);
- /* EXEC SQL INSERT INTO NAMEID VALUES ( :id, :name ); */
- {
- SQLCHAR insert[]= "INSERT INTO NAMEID VALUES (?, ?)";
- /* show the use of SQLPrepare/SQLExecute method */
- /* prepare the INSERT */
- if (SQLPrepare(hstmt, insert, SQL_NTS) != SQL_SUCCESS)
- return(print_err(SQL_HANDLE_STMT, hstmt));
- /* application parameter descriptor */
- SQLGetStmtAttr(hstmt, SQL_ATTR_APP_PARAM_
- DESC, &hdesc1, 0L,
- (SQLINTEGER *)NULL);
- SQLSetDescRec(hdesc1, 1, SQL_INTEGER, 0, 0L, 0, 0,
- (SQLPOINTER)&id, (SQLINTEGER *)NULL, (SQLSMALLINT *)NULL);
- SQLSetDescRec(hdesc1, 2, SQL_CHAR, 0, 0L, 0, 0,
- (SQLPOINTER)name, (SQLINTEGER *)NULL,
- (SQLSMALLINT *)NULL);
- /* implementation parameter descriptor */
- SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_
- DESC, &hdesc2, 0L,
- (SQLINTEGER *)NULL);
- SQLSetDescRec(hdesc2, 1, SQL_INTEGER, 0, 0L, 0, 0,
- (SQLPOINTER)NULL, (SQLINTEGER *)NULL,
- (SQLSMALLINT *)NULL);
- SQLSetDescRec(hdesc2, 2, SQL_VARCHAR, 0, 50L, 0, 0,
- (SQLPOINTER)NULL, (SQLINTEGER *)NULL,
- (SQLSMALLINT *)NULL);
- /* assign parameter values and execute the INSERT */
- id=500;
- (void)strcpy(name, "Babbage");
- if (SQLExecute(hstmt) != SQL_SUCCESS)
- return(print_err(SQL_HANDLE_STMT, hstmt));
- }
- /* EXEC SQL COMMIT WORK; */
- SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT);
- /* commit inserts */
- /* EXEC SQL DECLARE c1 CURSOR FOR SELECT ID, NAME FROM NAMEID; */
- /* EXEC SQL OPEN c1; */
- /* The application doesn't specify "declare c1 cursor for" */
- {
- SQLCHAR select[]= "select ID, NAME from NAMEID";
- if (SQLExecDirect(hstmt, select, SQL_NTS) != SQL_SUCCESS)
- return(print_err(SQL_HANDLE_STMT, hstmt));
- }
- /* EXEC SQL FETCH c1 INTO :id, :name; */
- /* this time, explicitly allocate an application row descriptor */
- SQLAllocHandle(SQL_HANDLE_DESC, hdbc, &hdesc);
- SQLSetDescRec(hdesc, 1, SQL_INTEGER, 0, 0L, 0, 0,
- (SQLPOINTER)&id, (SQLINTEGER *)NULL, (SQLSMALLINT *)&idind);
- SQLSetDescRec(hdesc, 2, SQL_
- CHAR, 0, (SQLINTEGER)sizeof(name),
- 0, 0, (SQLPOINTER)&name, (SQLINTEGER *)&namelen,
- (SQLSMALLINT *)&nameind);
- /* associate descriptor with statement handle */
- SQLSetStmtAttr(hstmt, SQL_ATTR_APP_ROW_DESC, &hdesc, 0);
- /* execute the fetch */
- SQLFetch(hstmt);
- /* EXEC SQL COMMIT WORK; */
- /* commit the transaction */
- SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT);
- /* EXEC SQL CLOSE c1; */
- SQLClose(hstmt);
- /* free the statement handle */
- SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
- /* EXEC SQL DISCONNECT; */
- /* disconnect from the database */
- SQLDisconnect(hdbc);
- /* free descriptor handle */
- SQLFreeHandle(SQL_HANDLE_DESC, hdesc);
- /* free descriptor handle */
- SQLFreeHandle(SQL_HANDLE_DESC, hdesc1);
- /* free descriptor handle */
- SQLFreeHandle(SQL_HANDLE_DESC, hdesc2);
- /* free connection handle */
- SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
- /* free environment handle */
- SQLFreeHandle(SQL_HANDLE_ENV, henv);
- return(0);
- }