example1.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /* -*- C -*- */
  2. /* The first example illustrates creating a table, adding some data
  3.  * to it, and selecting the inserted data. The second example shows
  4.  * interactive ad hoc query processing.
  5.  *
  6.  * Actual applications include more complete error checking following
  7.  * calls to SQL/CLI routines. That material is omitted from this
  8.  * Appendix for the sake of clarity.
  9.  *
  10.  * This file is adapted for PostgreSQL
  11.  * from the CLI Annex in the SQL98 August 1994 draft standard.
  12.  * Thomas G. Lockhart 1999-06-16
  13.  */
  14. /*
  15.  * B.1  Create table, insert, select
  16.  *
  17.  * This example function creates a table, inserts data into the table,
  18.  * and selects the inserted data.
  19.  *
  20.  * This example illustrates the execution of SQL statement text
  21.  * both using the Prepare() and Execute()  method and using the
  22.  * ExecDirect() method. The example also illustrates both the case
  23.  * where the application uses the automatically-generated descriptors
  24.  * and the case where the application allocates a descriptor of its
  25.  * own and associates this descriptor with the SQL statement.
  26.  *
  27.  * Code comments include the equivalent statements in embedded SQL
  28.  * to show how embedded SQL operations correspond to SQL/CLI function
  29.  * calls.
  30.  */
  31. #include <sqlcli.h>
  32. #include <string.h>
  33. #ifndef NULL
  34. #define NULL   0
  35. #endif
  36. int print_err(SQLSMALLINT handletype, SQLINTEGER handle);
  37. int example1(SQLCHAR *server, SQLCHAR *uid, SQLCHAR *authen)
  38. {
  39.   SQLHENV     henv;
  40.   SQLHDBC     hdbc;
  41.   SQLHDESC    hdesc;
  42.   SQLHDESC    hdesc1;
  43.   SQLHDESC    hdesc2;
  44.   SQLHSTMT    hstmt;
  45.   SQLINTEGER  id;
  46.   SQLSMALLINT idind;
  47.   SQLCHAR     name[51];
  48.   SQLINTEGER  namelen;
  49.   SQLSMALLINT nameind;
  50.   /* EXEC SQL CONNECT TO :server USER :uid; */
  51.   /* allocate an environment handle */
  52.   SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  53.   /* allocate a connection handle */
  54.   SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
  55.   /* connect to database */
  56.   if (SQLConnect(hdbc, server, SQL_NTS, uid, SQL_NTS,
  57.  authen, SQL_NTS)
  58.       != SQL_SUCCESS)
  59.     return(print_err(SQL_HANDLE_DBC, hdbc));
  60.   /* allocate a statement handle */
  61.   SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
  62.   /* EXEC SQL CREATE TABLE NAMEID (ID integer, NAME varchar(50));  */
  63.   {
  64.     SQLCHAR create[]  ="CREATE TABLE NAMEID (ID integer,"
  65.       " NAME varchar(50))";
  66.     /* execute the CREATE TABLE statement */
  67.     if (SQLExecDirect(hstmt, create, SQL_NTS) != SQL_SUCCESS)
  68.       return(print_err(SQL_HANDLE_STMT, hstmt));
  69.   }
  70.   /* EXEC SQL COMMIT WORK; */
  71.   /* commit CREATE TABLE */
  72.   SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT);
  73.   /* EXEC SQL INSERT INTO NAMEID VALUES ( :id, :name ); */
  74.   {
  75.     SQLCHAR insert[]=  "INSERT INTO NAMEID VALUES (?, ?)";
  76.     /* show the use of SQLPrepare/SQLExecute method */
  77.     /* prepare the INSERT */
  78.     if (SQLPrepare(hstmt, insert, SQL_NTS) != SQL_SUCCESS)
  79.       return(print_err(SQL_HANDLE_STMT, hstmt));
  80.     /* application parameter descriptor */
  81.     SQLGetStmtAttr(hstmt, SQL_ATTR_APP_PARAM_
  82.    DESC, &hdesc1, 0L,
  83.    (SQLINTEGER *)NULL);
  84.     SQLSetDescRec(hdesc1, 1, SQL_INTEGER, 0, 0L, 0, 0,
  85.   (SQLPOINTER)&id, (SQLINTEGER *)NULL, (SQLSMALLINT *)NULL);
  86.     SQLSetDescRec(hdesc1, 2, SQL_CHAR, 0, 0L, 0, 0,
  87.   (SQLPOINTER)name, (SQLINTEGER *)NULL,
  88.   (SQLSMALLINT *)NULL);
  89.     /* implementation parameter descriptor */
  90.     SQLGetStmtAttr(hstmt, SQL_ATTR_IMP_PARAM_
  91.    DESC, &hdesc2, 0L,
  92.    (SQLINTEGER *)NULL);
  93.     SQLSetDescRec(hdesc2, 1, SQL_INTEGER, 0, 0L, 0, 0,
  94.   (SQLPOINTER)NULL, (SQLINTEGER *)NULL,
  95.   (SQLSMALLINT *)NULL);
  96.     SQLSetDescRec(hdesc2, 2, SQL_VARCHAR, 0, 50L, 0, 0,
  97.   (SQLPOINTER)NULL, (SQLINTEGER *)NULL,
  98.   (SQLSMALLINT *)NULL);
  99.     /* assign parameter values and execute the INSERT */
  100.     id=500;
  101.     (void)strcpy(name, "Babbage");
  102.     if (SQLExecute(hstmt) != SQL_SUCCESS)
  103.       return(print_err(SQL_HANDLE_STMT, hstmt));
  104.   }
  105.   /* EXEC SQL COMMIT WORK; */
  106.   SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT);
  107.   /* commit inserts */
  108.   /* EXEC SQL DECLARE c1 CURSOR FOR SELECT ID, NAME FROM NAMEID; */
  109.   /* EXEC SQL OPEN c1; */
  110.   /* The application doesn't specify "declare c1 cursor for" */
  111.   {
  112.     SQLCHAR select[]=  "select ID, NAME from NAMEID";
  113.     if (SQLExecDirect(hstmt, select, SQL_NTS) != SQL_SUCCESS)
  114.       return(print_err(SQL_HANDLE_STMT, hstmt));
  115.   }
  116.   /* EXEC SQL FETCH c1 INTO :id, :name; */
  117.   /* this time, explicitly allocate an application row descriptor */
  118.   SQLAllocHandle(SQL_HANDLE_DESC, hdbc, &hdesc);
  119.   SQLSetDescRec(hdesc, 1, SQL_INTEGER, 0, 0L, 0, 0,
  120. (SQLPOINTER)&id, (SQLINTEGER *)NULL, (SQLSMALLINT *)&idind);
  121.   SQLSetDescRec(hdesc, 2, SQL_
  122. CHAR, 0, (SQLINTEGER)sizeof(name),
  123. 0, 0, (SQLPOINTER)&name, (SQLINTEGER *)&namelen,
  124. (SQLSMALLINT *)&nameind);
  125.   /* associate descriptor with statement handle */
  126.   SQLSetStmtAttr(hstmt, SQL_ATTR_APP_ROW_DESC, &hdesc, 0);
  127.   /* execute the fetch */
  128.   SQLFetch(hstmt);
  129.   /* EXEC SQL COMMIT WORK; */
  130.   /* commit the transaction  */
  131.   SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT);
  132.   /* EXEC SQL CLOSE c1; */
  133.   SQLClose(hstmt);
  134.   /* free the statement handle */
  135.   SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
  136.   /* EXEC SQL DISCONNECT; */
  137.   /* disconnect from the database */
  138.   SQLDisconnect(hdbc);
  139.   /* free descriptor handle */
  140.   SQLFreeHandle(SQL_HANDLE_DESC, hdesc);
  141.   /* free descriptor handle */
  142.   SQLFreeHandle(SQL_HANDLE_DESC, hdesc1);
  143.   /* free descriptor handle */
  144.   SQLFreeHandle(SQL_HANDLE_DESC, hdesc2);
  145.   /* free connection handle */
  146.   SQLFreeHandle(SQL_HANDLE_DBC,  hdbc);
  147.   /* free environment handle */
  148.   SQLFreeHandle(SQL_HANDLE_ENV,  henv);
  149.   return(0);
  150. }