Finalidad
Especificación:
| CLI de DB2
| ODBC 1.0
| ISO CLI
|
SQLSetConnectAttr() establece opciones relacionadas con una
conexión
Sintaxis
SQLRETURN SQLSetConnectAttr (SQLHDBC ConnectionHandle,
SQLINTEGER Attribute,
SQLPOINTER ValuePtr,
SQLINTEGER StringLength);
Argumentos de la función
Tabla 80. Argumentos de SQLSetConnectAttr
Tipo de datos
| Argumento
| Uso
| Descripción
|
SQLHDBC
| ConnectionHandle
| entrada
| Descriptor de contexto de conexión.
|
SQLINTEGER
| Attribute
| entrada
| Opción para definir.
|
SQLPOINTER
| ValuePtr
| entrada
| Si Attribute es un atributo definido por ODBC y
ValuePtr apunta a una serie de caracteres o almacenamiento intermedio
binario, este argumento debe ser igual a la longitud de
ValuePtr. Si Attribute es un atributo definido por
ODBC y ValuePtr es un entero, no se tiene en cuenta
StringLength.
Si Attribute es un atributo de CLI de DB2, la aplicación indica la
naturaleza del atributo estableciendo el argumento
StringLength. StringLength puede tener los valores
siguientes:
- Si ValuePtr es un puntero que apunta a una serie de
caracteres, StringLength es la longitud de la serie o
SQL_NTS.
- Si ValuePtr es un puntero que apunta a un almacenamiento
intermedio binario, la aplicación coloca el resultado de la macro
SQL_LEN_BINARY_ATTR(length) en StringLength. Esto coloca un
valor negativo en StringLength.
- Si ValuePtr es un puntero que apunta a un valor distinto de
una serie de caracteres o serie binaria, el valor de StringLength
debe ser SQL_IS_POINTER.
- Si ValuePtr contiene un valor de longitud fija,
StringLength es SQL_IS_INTEGER o SQL_IS_UINTEGER, según
corresponda.
|
SQLINTEGER
| StringLength
| entrada
| Si ValuePtr apunta a una serie de caracteres o almacenamiento
intermedio binario, este argumento debe ser igual a la longitud de
ValuePtr. Si ValuePtr es un puntero, pero no apunta a
una serie de caracteres ni a un almacenamiento intermedio binario,
StringLength debe tener el valor SQL_IS_POINTER. Si
ValuePtr no es un puntero, el valor de StringLength debe ser
SQL_IS_NOT_POINTER.
|
Uso
Los atributos de una conexión permanecen vigentes hasta que son modificados
por otra llamada a SQLSetConnectAttr() o hasta que la conexión se
descarta mediante una llamada a SQLDisconnect().
SQLSetConnectAttr() acepta información sobre atributos en uno de
dos formatos diferentes: una serie de caracteres terminada en nulo o un
valor entero de 32 bits. El formato del atributo está indicado en la
descripción del atributo. Las series de caracteres a las que apunta el
argumento ValuePtr de SQLSetConnectAttr() tienen una
longitud igual a StringLength.
Atributos de conexión
A continuación se muestran los atributos definidos
actualmente.
- SQL_ATTR_AUTOCOMMIT (DB2 CLI/ODBC)
- Valor entero de 32 bits que especifica el tipo de modalidad. Los
valores soportados son:
- SQL_AUTOCOMMIT_ON = Cada sentencia se confirma automáticamente. Es
el valor por omisión.
En la modalidad de confirmación automática, todas las actualizaciones
hechas por una sentencia pasan automáticamente a ser permanentes una vez
ejecutada la sentencia. La modalidad de confirmación automática es el comportamiento por omisión. Por omisión, no está
habilitado el soporte de transacciones, y además, no se garantiza la
atomicidad en el ámbito de sentencia. Por ejemplo, la siguiente
sentencia UPDATE puede fallar durante el proceso y puede que sólo se actualice
un subconjunto de filas:
UPDATE T SET A = A + 1
Pueden haber varias razones por las que fallen las operaciones
update/delete/insert. Por ejemplo, puede violarse una restricción de
comprobación durante una actualización. Como consecuencia, puede
haberse actualizado adecuadamente una parte de la tabla, mientras que el resto
no, y los cambios no se pueden retrotraer.
- SQL_AUTOCOMMIT_OFF = La aplicación debe manual y explícitamente
comprometer o retrotraer una transacción. El compromiso o la
retrotracción de una transacción se lleva a cabo invocando
SQLEndTran(). Para obtener más información sobre la
utilización de SQLEndTran(), consulte SQLEndTran--Solicitar COMMIT o ROLLBACK.
En la modalidad de confirmación manual, las transacciones se inician
implícitamente con el primer acceso a la base de datos utilizando SQLPrepare()
y SQLExecDirect(). En este momento ya ha comenzado una transacción,
aunque haya fallado la llamada. La transacción termina cuando se
utiliza SQLEndTran() para retrotraer (ROLLBACK) o confirmar (COMMIT) la
transacción.
En la modalidad de confirmación manual, las transacciones pueden emitir
cualquier sentencia SQL, incluyendo DDL y DML (por ejemplo, las sentencias
CREATE TABLE o UPDATE)
- SQL_ATTR_CONNECTION_DEAD (DB2 CLI/ODBC)
- Un valor entero de 32 bits READ ONLY que indica si la conexión está o no
está aún activa. DB2 CLI devolverá uno de los valores siguientes:
- SQL_CD_FALSE - la conexión sigue estando activa.
- SQL_CD_TRUE - la conexión está inactiva.
- SQL_ATTR_LOGIN_TIMEOUT (DB2 CLI/ODBC)
- Valor entero de 32 bits que corresponde al número de segundos que se
deberá esperar a que finalice una petición de inicio de sesión antes de
devolver el control a la aplicación.
- SQL_ATTR_FILENAME_FORMAT (DB2 Everyplace)
- Un entero de 32 bits especifica si el motor de bases de datos DB2e debe
crear nombres de archivo en formato largo o de 8.3. Las
aplicaciones sólo tienen permitido cambiar el formato de nombres de archivo si
no existe ningún archivo de catálogo en la vía de acceso conectada cuando se
invoca a SQLSetConnectAttr. Se devolverá SQL_ERROR con SQLState HY000
si se deniega un cambio del formato de nombres de archivo debido a que
previamente existían archivos de catálogo. Por ejemplo, si una
aplicación conecta con una vía de acceso en que ya existe archivos de catálogo
de DB2 Everyplace, cualquier intento de cambiar el formato de nombres de
archivo fallará. Si una aplicación conecta con una vía de acceso en que
no existe ningún archivo de catálogo e intenta cambiar el formato de nombres
de archivo después de la primera sentencia CREATE TABLE, SQLSetConnectAttr
también devolverá SQL_ERROR. Esto es debido a que se crean archivos de
catálogo durante la realmente primera sentencia CREATE TABLE, y no está
permitido cambiar el formato de nombres de archivo después de la creación de
archivos de catálogo. El formato de nombres de archivo por omisión
depende de la plataforma. Actualmente, SQL_FILENAME_FORMAT_LONG es el
valor por omisión para todas las plataformas soportadas.
Valores de atributos:
SQL_FILENAME_FORMAT_LONG - los archivos se
crearán en formato de nombre de archivo largo.
SQL_FILENAME_FORMAT_83- los archivos se crearán en formato de
nombre de archivo 8.3.
Códigos de retorno
- SQL_SUCCESS
- SQL_SUCCESS_WITH_INFO
- SQL_ERROR
- SQL_INVALID_HANDLE
Diagnósticos
Tabla 81. SQLSTATEs de SQLSetConnectAttr
SQLSTATE
| Descripción
| Explicación
|
HY000
| Error general.
| El formato de nombres de archivo no se puede cambiar.
|
HY001
| Error de asignación de memoria.
| CLI de DB2 no puede asignar la memoria necesaria para ejecutar o
finalizar la función.
|
HY014
| No hay más descriptores de contexto.
| CLI de DB2 no pudo asignar un descriptor de contexto debido a recursos
internos.
|
HY090
| Longitud no válida de la serie de caracteres o del almacenamiento
intermedio.
| El valor de uno de los argumentos de longitud de nombre era menor que 0,
pero no era igual a SQL_NTS.
|
Restricciones
- El número de tablas que se pueden actualizar en una transacción está
limitado. DB2 Everyplace permite un número máximo de 256 archivos
abiertos dentro de una transacción, suponiendo que el sistema operativo
también permita este número de archivos abiertos. Normalmente esto
significa que puedan actualizarse aproximadamente 100 tablas. El número
de tablas depende del uso de índices y del número de descriptores de
sentencia. Cuanto mayor sea el número de descriptores de contexto de
sentencia activos, menos tablas se pueden actualizar potencialmente.
Cada tabla se contabiliza una sola vez, aunque se acceda a ella y/o se
actualice varias veces en una transacción.
- Se han añadido transacciones a DB2 Everyplace para permitir una
actualización e inserción coherentes de varios registros asociados en varias
tablas. Los cambios se escriben en las tablas de datos una vez que la
aplicación confirme la transacción.
- Si la aplicación ha finalizado prematuramente sin confirmar la transacción
actual, las actualizaciones contenidas en esa transacción se retrotraen
automáticamente.
- Una vez que SQLEndTran vuelve, la transacción se confirma o se
retrotrae.
- Cuando una aplicación conecta con una base de datos y ésta termina
prematuramente (durante una transacción activa), la transacción se
recupera. La base de datos recupera transacciones utilizando la lógica
siguiente:
- Si la transacción no ha finalizado, la base de datos no se
actualiza.
- Si la transacción ha finalizado, la base de datos sí que se
actualiza con la información proporcionada por la transacción.
- Si la recuperación se interrumpe, se realiza la acción apropiada en la
próxima conexión.
Consulta relacionada