A continuación se muestra un ejemplo de un programa CLI de DB2 diseñado para:
Este programa se puede ejecutar en AIX, Solaris o Windows NT. La sintaxis y la salida específica de Windows NT se indica con comentarios parecidos al siguiente:
/* ****************** En Windows NT ... ****************** */ /****************************************************************************** **
** Nombre archivo fuente = datalink.c ** ** Material bajo licencia - Propiedad de IBM ** ** (C) COPYRIGHT International Business Machines Corp. 1998 ** Todos los derechos reservados. ** ** Nota a los usuarios de los EE.UU. - El uso, duplicación o distribución ** están restringidos por el contrato GSA ADP Schedule con IBM Corp. ** ** OBJETIVO: ** Versión modificada del ejemplo de CLI clisampl.c para demostrar la ** creación y análisis ** ** Se llevan a cabo las siguientes operaciones: ** - Conexión con una base de datos. ** - Creación de una tabla con una sola fila datalink ** - Inserción de una sola fila mediante SQLBuildDataLink() y ** SQLBindParameter() ** - Búsqueda y carga de información de análisis de datos de ** la fila datalink recuperada mediante SQLGetDataLinkAttr() ** - Eliminación de la tabla ** - Desconexión de la base de datos. ** ******************************************************************************/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlcli1.h> #include "samputil.h" /* Archivo de cabecera para el código de ejemplo de CLI */ /* * Variables globales para id de usuario y contraseña. * Es para mantener la simplicidad de los ejemplos; no es una práctica recomendada. */ extern SQLCHAR server[SQL_MAX_DSN_LENGTH + 1] ; extern SQLCHAR uid[MAX_UID_LENGTH + 1] ; extern SQLCHAR pwd[MAX_PWD_LENGTH + 1] ; void getattr( SQLHSTMT hStmt, SQLSMALLINT AttrType, SQLCHAR* DataLink, SQLCHAR* Attribute, SQLINTEGER BufferLength ) { SQLINTEGER StringLength ; SQLRETURN rc ; rc = SQLGetDataLinkAttr( hStmt, AttrType, DataLink, strlen( (char *)DataLink), Attribute, BufferLength, &StringLength ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hStmt, rc ) ; printf("Attribute #%d) <%s>\n", AttrType, Attribute) ; return ; } int main(int argc, char * argv[] ) { SQLHANDLE henv, hdbc, hstmt ; SQLRETURN rc ; SQLCHAR szCreate[] = "CREATE TABLE DL_SAMPL " "( " "DL1 DATALINK " "LINKTYPE URL " "FILE LINK CONTROL " "INTEGRITY ALL " "READ PERMISSION DB " "WRITE PERMISSION BLOCKED " "RECOVERY NO " "ON UNLINK RESTORE " ")"; SQLCHAR szInsert[]= "INSERT INTO DL_SAMPL VALUES (?)" ; SQLCHAR szFileLink[] = "http://mycomputer.company.com/nfsdlink/userid/test_1.jpg" /* ***************************************************************** En Windows NT, sustituya "http://...jpg" por: "unc:\\mycomputer.company.com\nfsdlink\userid\test_1.jpg" ; ***************************************************************** */ SQLCHAR szComment[] = "My First Datalink" ; SQLCHAR szSelect[]= "SELECT * FROM DL_SAMPL" ; SQLCHAR szDrop[] = "DROP TABLE DL_SAMPL" ; SQLCHAR szDLCol[254] ; SQLCHAR szBuffer[254] ; SQLSMALLINT cCol ; SQLCHAR szColName[33] ; SQLSMALLINT fSqlType ; SQLUINTEGER cbColDef ; SQLSMALLINT ibScale ; SQLSMALLINT fNullable ; SQLINTEGER siLength= SQL_NTS ; /* macro para inicializar el servidor, uid y pwd */ INIT_UID_PWD ; /* asignar un handle de entorno */ rc = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv ) ; if ( rc != SQL_SUCCESS ) return(terminate( henv, rc ) ) ; /* asignar un handle de conexión y conectar */ rc = DBconnect( henv, &hdbc ) ; if ( rc != SQL_SUCCESS ) return( terminate( henv, rc ) ) ; rc = SQLAllocHandle( SQL_HANDLE_STMT, hdbc, &hstmt ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ); /* * Crear la tabla de ejemplo. En este código se da por supuesto * que la tabla DL_SAMPL no existe. */ printf( "Crear tabla - %s\n", szCreate ) ; rc = SQLExecDirect( hstmt, szCreate, SQL_NTS ) ; CHECK_HANDLE(SQL_HANDLE_STMT, hstmt, rc ) ; /* Comprometer los cambios. */ rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT ) ; CHECK_HANDLE(SQL_HANDLE_DBC, hdbc, rc ) ; /* Preparar una sentencia insert. */ printf( "Insertar - %s\n", szInsert ) ; rc = SQLPrepare( hstmt, szInsert, SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Crear Datalink */ rc = SQLBuildDataLink( hstmt, (SQLCHAR *)"URL", strlen("URL"), szFileLink, strlen((char*)szFileLink), szComment, strlen((char *)szComment), szDLCol, sizeof(szDLCol), &siLength ); CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Definir parámetro de entrada. */ rc = SQLBindParameter( hstmt, 1, SQL_PARAM_INPUT, SQL_C_DATALINK, SQL_DATALINK, sizeof(szDLCol), 0, (SQLPOINTER)szDLCol, sizeof(szDLCol), NULL ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Insertar fila en la base de datos. */ rc = SQLExecute( hstmt) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Comprometer los cambios. */ rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* Restaurar parámetro de entrada. */ rc = SQLFreeStmt( hstmt, SQL_RESET_PARAMS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Ejecutar la sentencia select. */ printf( "Seleccionar - %s\n", szSelect ) ; rc= SQLExecDirect( hstmt, szSelect, SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Devolver el número de columnas y describir el grupo de resultados. */ rc = SQLNumResultCols( hstmt, &cCol ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; printf( "Número de columnas - %d\n", cCol ) ; rc = SQLDescribeCol(hstmt, 1, szColName, sizeof( szColName ), NULL, &fSqlType, &cbColDef, &ibScale, &fNullable ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; printf( "Nombre columna - %s\n", szColName ) ; printf( "Tipo columna - %d\n", fSqlType ) ; printf( "Precisión columna - %ld\n", cbColDef) ; printf( "Escala columna - %d\n", ibScale ) ; printf( "Columna anulable - %s\n", ( fNullable ) ? "TRUE" : "FALSE" ) ; /* Vincular el parámetro de salida. */ rc = SQLBindCol( hstmt, 1, SQL_C_DATALINK, szDLCol, sizeof(szDLCol), NULL ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Buscar y cargar datos. */ rc = SQLFetch( hstmt ) ; CHECK_HANDLE(SQL_HANDLE_STMT, hstmt, rc ) ; printf( "Valor columna - %s\n", szDLCol ) ; getattr(hstmt, 1, szDLCol, szBuffer, sizeof(szBuffer) ); getattr(hstmt, 2, szDLCol, szBuffer, sizeof(szBuffer) ); getattr(hstmt, 3, szDLCol, szBuffer, sizeof(szBuffer) ); getattr(hstmt, 4, szDLCol, szBuffer, sizeof(szBuffer) ); getattr(hstmt, 5, szDLCol, szBuffer, sizeof(szBuffer) ); getattr(hstmt, 6, szDLCol, szBuffer, sizeof(szBuffer) ); getattr(hstmt, 7, szDLCol, szBuffer, sizeof(szBuffer) ); /* Cerrar cursor y liberar columnas vinculadas. */ /* Liberar recursos de sentencia */ rc = SQLFreeStmt(hstmt, SQL_UNBIND ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; rc = SQLFreeStmt( hstmt, SQL_CLOSE ) ; CHECK_HANDLE(SQL_HANDLE_STMT, hstmt, rc ) ; /* Eliminar tabla. */ rc = SQLExecDirect(hstmt, szDrop, SQL_NTS ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; /* Comprometer los cambios. */ rc = SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; /* Desconectar y liberar recursos de CLI. */ rc = SQLFreeHandle(SQL_HANDLE_STMT, hstmt ) ; CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ; printf( "\n>Desconectando .....\n" ) ; rc = SQLDisconnect(hdbc ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; rc= SQLFreeHandle( SQL_HANDLE_DBC, hdbc ) ; CHECK_HANDLE( SQL_HANDLE_DBC, hdbc, rc ) ; rc = SQLFreeHandle( SQL_HANDLE_ENV, henv ) ; if ( rc != SQL_SUCCESS ) return( terminate( henv, rc ) ) ; return(SQL_SUCCESS ) ; } /* fin parte principal */ /* =============================================================== ** Salida de ejemplo: ** ** >Entre nombre de servidor: ** ejemplo ** >Entre nombre de usuario: ** idusuario ** >Entre contraseña: ** contraseña ** >Conectado a ejemplo ** Crear tabla - CREATE TABLE DL_SAMPL ** ( DL1 DATALINK LINKTYPE URL FILE LINK CONTROL INTEGRITY ALL ** READ PERMISSION DB WRITE PERMISSION BLOCKED RECOVERY NO ON UNLINK RESTORE ) ** Insertar - INSERT INTO DL_SAMPL VALUES (?) ** Seleccionar - SELECT * FROM DL_SAMPL ** Número de columnas - 1 ** Nombre columna - DL1 ** Tipo columna - -400 ** Precisión columna - 254 ** Escala columna - 0 ** Columna anulable - TRUE ** Valor columna - 1,URL,79,17,19,HTTP://mycomputer.company.com/nfsdlink/userid/ ** HVJ5NXGC0WQ.I5KKB6;test_1.jpgMyFirst Datalink /* ************************************************************** En Windows NT, la salida del ejemplo será: ** Valor columna - 1,UNC:\\mycomputer.company.com\nfsdlink\userid\ HVJ5NXGC0WQ.I5KKB6;test_1.jpgMyFirst Datalink ************************************************************** */ ** Atributo 1) <My First Datalink> ** Atributo 2) <URL> ** Atributo 3) <HTTP://mycomputer.company.com/nfsdlink/userid/ ** HVJ5NXGC0WQ.I5KKB6;test_1.jpg> /* ****************************************************************** En Windows NT, la salida del ejemplo será: ** Atributo 3) <UNC:\\mycomputer.company.com\nfsdlink\userid\ ** HVJ5NXGC0WQ.I5KKB6;test_1.jpg> ****************************************************************** */ ** Atributo 4) </nfsdlink/userid/HVJ5NXGC0WQ.I5KKB6;test_1.jpg> /* ******************************************************************** En Windows NT, la salida del ejemplo será: ** Atributo 4) <\nfsdlink\userid\HVJ5NXGC0WQ.I5KKB6;test_1.jpg> ******************************************************************** */ ** Atributo 5) </nfsdlink/userid/test_1.jpg> /* ******************************************************* En Windows NT, la salida del ejemplo será: ** Atributo 5) <\nfsdlink\userid\test_1.jpg> ******************************************************* */ ** Atributo 6) <HTTP> /* ***************************************** En Windows NT, la salida del ejemplo será: ** Atributo 6) <UNC> ***************************************** */ ** Atributo 7) <mycomputer.company.com> ** ** >Desconectando ..... ** ** =============================================================== */