• Nenhum resultado encontrado

Open Database Connectivity. Nuno Castro Ferreira

N/A
N/A
Protected

Academic year: 2021

Share "Open Database Connectivity. Nuno Castro Ferreira"

Copied!
28
0
0

Texto

(1)

Open Database Connectivity

Nuno Castro Ferreira

nacf@dei.isep.ipp.pt

Open Database Connectivity

Nuno Castro Ferreira

nacf@dei.isep.ipp.pt

(2)

ODBC - 1

ODBC - 1 ISEPISEP

Sumário

Sumário

!

ODBC

!

Arquitectura ODBC

!

Estrutura de uma aplicação

!

API do ODBC

!

ODBC

!

Arquitectura ODBC

!

Estrutura de uma aplicação

!

API do ODBC

(3)

ODBC - 2

ODBC - 2 ISEPISEP

ODBC

ODBC

!

ODBC – Open Database Connectivity:

"

Permite o acesso a vários DBMS (Database Management

System) através de uma só API

"

Isolado da aplicação e do DBMS

!

ODBC – Open Database Connectivity:

"

Permite o acesso a vários DBMS (Database Management

System) através de uma só API

(4)

ODBC - 3

ODBC - 3 ISEPISEP

Arquitectura ODBC

Arquitectura ODBC

!

Aplicação

"

Executa processamento e chama o ODBC

!

Gestor de Drivers

"

Passa as funções de ODBC para o driver

!

Drivers

"

Processa as funções do ODBC

!

Origem dos Dados

"

Dados a que pretendemos aceder

!

Aplicação

"

Executa processamento e chama o ODBC

!

Gestor de Drivers

"

Passa as funções de ODBC para o driver

!

Drivers

"

Processa as funções do ODBC

!

Origem dos Dados

(5)

ODBC - 4

ODBC - 4 ISEPISEP

Arquitectura ODBC

Arquitectura ODBC

Origem dos Dados Origem dos Dados

Driver

Driver

Driver

Driver

Gestor de Drivers Gestor de Drivers

Driver

Driver

Origem dos Dados Origem dos Dados Origem dos Dados Origem dos Dados

Aplicação

Aplicação

(6)

ODBC - 5

ODBC - 5 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

1- Estabelecer a Conexão

"

Lógica de funcionamento

• Primeiro, alocar o ambiente • Segundo, alocar a conexão • Finalmente, ligar

!

1- Estabelecer a Conexão

"

Lógica de funcionamento

• Primeiro, alocar o ambiente

• Segundo, alocar a conexão

• Finalmente, ligar

Ambiente

Ambiente

Conexão n

Conexão n

Conexão 1

Conexão 1

(7)

ODBC - 6

ODBC - 6 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

1- Estabelecer a Conexão – Sem Transações

"

SQLAllocHandle(...Ambiente...)

"

SQLAllocHandle(...Conexão...)

"

SQLConnect

!

1- Estabelecer a Conexão – Sem Transações

"

SQLAllocHandle(...Ambiente...)

"

SQLAllocHandle(...Conexão...)

"

SQLConnect

Alocar

Handles

Alocar

Handles

rc = SQLAllocHandle(SQL_HANDLE_ENV,

SQL_NULL_HANDLE, &hAmbiente);

rc = SQLAllocHandle(SQL_HANDLE_DBC,

hAmbiente, &hConexao);

rc = SQLConnect(hConexao, “SERVIDOR”,

SQL_NTS, “UTILIZADOR”, SQL_NTS,

“PASSWORD”, SQL_NTS);

rc = SQLAllocHandle(SQL_HANDLE_ENV,

SQL_NULL_HANDLE, &hAmbiente);

rc = SQLAllocHandle(SQL_HANDLE_DBC,

hAmbiente, &hConexao);

rc = SQLConnect(hConexao, “SERVIDOR”,

SQL_NTS, “UTILIZADOR”, SQL_NTS,

“PASSWORD”, SQL_NTS);

(8)

ODBC - 7

ODBC - 7 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

O que é uma transacção?

!

O que é uma transacção?

Uma transacção é uma sequência de operações

executadas numas só unidade lógica de trabalho. Uma

unidade lógica de trabalho tem que ter quatro

propriedades, chamadas propriedades ‘ACID’ (Atómica,

Consistente, Isolada e Durável) de modo a ser

considerada uma transacção.

Uma transacção é uma sequência de operações

executadas numas só unidade lógica de trabalho. Uma

unidade lógica de trabalho tem que ter quatro

propriedades, chamadas propriedades ‘ACID’ (Atómica,

Consistente, Isolada e Durável) de modo a ser

(9)

ODBC - 8

ODBC - 8 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

1- Estabelecer a Conexão – Com Transacções!

"

Alocar Handles ...

"

SQLSetConnectAttr(...SQL_ATTR_AUTOCOMMIT,

SQL_AUTOCOMMIT_OFF...)

"

SQLConnect

!

1- Estabelecer a Conexão – Com Transacções!

"

Alocar Handles ...

"

SQLSetConnectAttr(...SQL_ATTR_AUTOCOMMIT,

SQL_AUTOCOMMIT_OFF...)

"

SQLConnect

rc = SQLSetConnectAttr(hConexao,

SQL_ATTR_AUTOCOMMIT,

(void*)SQL_AUTOCOMMIT_OFF, 0);

rc = SQLConnect(hConexao, “SERVIDOR”,

SQL_NTS, “UTILIZADOR”, SQL_NTS,

“PASSWORD”, SQL_NTS);

rc = SQLSetConnectAttr(hConexao,

SQL_ATTR_AUTOCOMMIT,

(void*)SQL_AUTOCOMMIT_OFF, 0);

rc = SQLConnect(hConexao, “SERVIDOR”,

SQL_NTS, “UTILIZADOR”, SQL_NTS,

“PASSWORD”, SQL_NTS);

Desligar o tratamento automático de transacções Desligar o tratamento automático de transacções

(10)

ODBC - 9

ODBC - 9 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

Transacções...

!

Transacções...

Num ambiente transaccional, as transacções, iniciam

quando é executado um comando com as

características ACID e terminam quando é chamado o

SQLEndTran, fazendo um pedido de COMMIT ou

ROLLBACK para todos os comandos associados a uma

conexão ou a um ambiente.

Quando o SQLEndTran é invocado, é iniciada uma

nova transacção.

Num ambiente transaccional, as transacções, iniciam

quando é executado um comando com as

características ACID e terminam quando é chamado o

SQLEndTran, fazendo um pedido de COMMIT ou

ROLLBACK para todos os comandos associados a uma

conexão ou a um ambiente.

Quando o SQLEndTran é invocado, é iniciada uma

nova transacção.

(11)

ODBC - 10

ODBC - 10 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

2- Iniciar

"

SQLGetInfo

"

SQLAllocHandle(...Comando...)

"

SQLSetStmtOption

!

2- Iniciar

"

SQLGetInfo

"

SQLAllocHandle(...Comando...)

"

SQLSetStmtOption

rc = SQLAllocHandle(SQL_HANDLE_STMT,

hConexao,

&hComando);

rc = SQLAllocHandle(SQL_HANDLE_STMT,

hConexao,

&hComando);

(12)

ODBC - 11

ODBC - 11 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

3- Executar

"

SQLBindParameter

"

SQLExecute

!

3- Executar

"

SQLBindParameter

"

SQLExecute

rc = SQLBindParameter(hComando, 1,

SQL_PARAM_INPUT, SQL_CHAR, SQL_VARCHAR,

30, 0, strColuna1, 30, &iTamCol1);

rc = SQLExecDirect(hComando, “SELECT *

FROM CLIENTES WHERE NOME = ?”, SQL_NTS);

rc = SQLBindParameter(hComando, 1,

SQL_PARAM_INPUT, SQL_CHAR, SQL_VARCHAR,

30, 0, strColuna1, 30, &iTamCol1);

rc = SQLExecDirect(hComando, “SELECT *

(13)

ODBC - 12

ODBC - 12 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

Vantagens do uso dos parâmetros

"

Simplificação do código

"

Aumento de desempenho em chamadas consecutivas às

rotinas de execução (necessita de um Prepare,

BindParameter e depois, em ciclo, o Execute)

"

Preparar uma só vez os comandos e executar as vezes

necessárias

"

...

!

Vantagens do uso dos parâmetros

"

Simplificação do código

"

Aumento de desempenho em chamadas consecutivas às

rotinas de execução (necessita de um Prepare,

BindParameter e depois, em ciclo, o Execute)

"

Preparar uma só vez os comandos e executar as vezes

necessárias

"

...

CALL spClientes(?, ?, ?)

INSERT INTO CLIENTES VALUES (?, ?)

SELECT * FROM STOCK WHERE PRODUTO=?

CALL spClientes(?, ?, ?)

INSERT INTO CLIENTES VALUES (?, ?)

SELECT * FROM STOCK WHERE PRODUTO=?

(14)

ODBC - 13

ODBC - 13 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

4a- Se for um SELECT - Recuperar os Resultados

"

SQLNumResultCols

"

SQLDescribeCol

"

SQLBindCol

"

SQLFetch

"

SQLGetData

!

4a- Se for um SELECT - Recuperar os Resultados

"

SQLNumResultCols

"

SQLDescribeCol

"

SQLBindCol

"

SQLFetch

"

SQLGetData

rc = SQLBindCol(hComando, 1, SQL_C_CHAR,

strCampo1, 30, &lTamCampo1);

while(SQL_Fetch(hComando)==SQL_SUCCESS)

{...

}

rc = SQLBindCol(hComando, 1, SQL_C_CHAR,

strCampo1, 30, &lTamCampo1);

while(SQL_Fetch(hComando)==SQL_SUCCESS)

{...

}

(15)

ODBC - 14

ODBC - 14 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

4b-Se for um Update, Delete ou Insert

"

SQLRowCount

!

4b-Se for um Update, Delete ou Insert

"

SQLRowCount

rc = SQLRowCount(hComando, &iNumeroRegistos);

rc = SQLRowCount(hComando, &iNumeroRegistos);

(16)

ODBC - 15

ODBC - 15 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

5- Terminar a Transacção

"

SQLEndTran

!

5- Terminar a Transacção

"

SQLEndTran

rc = SQLEndTran(SQL_HANDLE_ENV,

hAmbiente,

SQL_COMMIT);

rc = SQLEndTran(SQL_HANDLE_ENV,

hAmbiente,

SQL_COMMIT);

(17)

ODBC - 16

ODBC - 16 ISEPISEP

Estrutura de uma Aplicação

Estrutura de uma Aplicação

!

6- Desligar

"

SQLFreeHandle(...Comando...)

"

SQLDisconnect

"

SQLFreeHandle(...Conexão...)

"

SQLFreeHandle(...Ambiente...)

!

6- Desligar

"

SQLFreeHandle(...Comando...)

"

SQLDisconnect

"

SQLFreeHandle(...Conexão...)

"

SQLFreeHandle(...Ambiente...)

rc = SQLFreeHandle(SQL_HANDLE_STMT, hComando);

rc = SQLDisconnect(hConexao);

rc = SQLFreeHandle(SQL_HANDLE_DBC, hConexao);

rc = SQLFreeHandle(SQL_HANDLE_ENV, hAmbiente);

rc = SQLFreeHandle(SQL_HANDLE_STMT, hComando);

rc = SQLDisconnect(hConexao);

rc = SQLFreeHandle(SQL_HANDLE_DBC, hConexao);

rc = SQLFreeHandle(SQL_HANDLE_ENV, hAmbiente);

(18)

ODBC - 17

ODBC - 17 ISEPISEP

API do ODBC

API do ODBC

!

Includes necessários

!

Estabelecer a Conexão e Iniciar

!

Executar um comando

!

Recuperar os resultados

!

Desligar

!

Includes necessários

!

Estabelecer a Conexão e Iniciar

!

Executar um comando

!

Recuperar os resultados

!

Desligar

(19)

ODBC - 18

ODBC - 18 ISEPISEP

API do ODBC

API do ODBC

!

Includes necessários

"

#include <sql.h>

"

#include <sqlext.h>

"

#include <sqltypes.h>

!

Includes necessários

"

#include <sql.h>

"

#include <sqlext.h>

"

#include <sqltypes.h>

(20)

ODBC - 19

ODBC - 19 ISEPISEP

API do ODBC

API do ODBC

!

Estabelecer a Conexão e Iniciar

!

Estabelecer a Conexão e Iniciar

BOOL InicializaODBC(SQLHENV *hEnv, SQLHDBC *hDBC) { SQLRETURN RetCode=SQL_SUCCESS; // Alocar o Ambiente RetCode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, hEnv); if(RetCode!=SQL_SUCCESS) MostraErroSQL(RetCode, SQL_NULL_HANDLE, SQL_NULL_HANDLE, SQL_NULL_HANDLE); ...

BOOL InicializaODBC(SQLHENV *hEnv, SQLHDBC *hDBC) { SQLRETURN RetCode=SQL_SUCCESS; // Alocar o Ambiente RetCode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, hEnv); if(RetCode!=SQL_SUCCESS) MostraErroSQL(RetCode, SQL_NULL_HANDLE, SQL_NULL_HANDLE, SQL_NULL_HANDLE); ...

(21)

ODBC - 20

ODBC - 20 ISEPISEP

API do ODBC

API do ODBC

!

Estabelecer a Conexão e Iniciar - Continuação

!

Estabelecer a Conexão e Iniciar - Continuação

...

/* Indicar qual a versão do ODBC que vai ser usada */ RetCode=SQLSetEnvAttr(*hEnv, SQL_ATTR_ODBC_VERSION,

(void*)SQL_OV_ODBC3, 0); if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, SQL_NULL_HANDLE, SQL_NULL_HANDLE);

// Alocar a Conexão

RetCode=SQLAllocHandle(SQL_HANDLE_DBC, *hEnv, hDBC); if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, SQL_NULL_HANDLE, SQL_NULL_HANDLE);

...

...

/* Indicar qual a versão do ODBC que vai ser usada */ RetCode=SQLSetEnvAttr(*hEnv, SQL_ATTR_ODBC_VERSION,

(void*)SQL_OV_ODBC3, 0); if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, SQL_NULL_HANDLE, SQL_NULL_HANDLE);

// Alocar a Conexão

RetCode=SQLAllocHandle(SQL_HANDLE_DBC, *hEnv, hDBC); if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, SQL_NULL_HANDLE, SQL_NULL_HANDLE);

(22)

ODBC - 21

ODBC - 21 ISEPISEP

API do ODBC

API do ODBC

!

Estabelecer a Conexão e Iniciar - Fim

!

Estabelecer a Conexão e Iniciar - Fim

...

// Configurar o tipo de commit

RetCode=SQLSetConnectAttr(*hDBC, SQL_ATTR_AUTOCOMMIT, (void*)SQL_AUTOCOMMIT_OFF, 0);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, *hDBC, SQL_NULL_HANDLE);

// Ligar

RetCode=SQLConnect(*hDBC, (unsigned char*)"LojaInform", SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, *hDBC, SQL_NULL_HANDLE);

return TRUE; }

...

// Configurar o tipo de commit

RetCode=SQLSetConnectAttr(*hDBC, SQL_ATTR_AUTOCOMMIT, (void*)SQL_AUTOCOMMIT_OFF, 0);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, *hDBC, SQL_NULL_HANDLE);

// Ligar

RetCode=SQLConnect(*hDBC, (unsigned char*)"LojaInform", SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, *hEnv, *hDBC, SQL_NULL_HANDLE);

return TRUE; }

(23)

ODBC - 22

ODBC - 22 ISEPISEP

API do ODBC

API do ODBC

!

Executar um comando

!

Executar um comando

// Alocar o comando RetCode=SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStmt); if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, hEnv, hDBC, SQL_NULL_HANDLE);

// Executar o Comando

RetCode=SQLExecDirect(hStmt, (unsigned char*)”SELECT * FROM PRODUTOS”, SQL_NTS); if(RetCode!=SQL_SUCCESS) MostraErroSQL(RetCode, hEnv, hDBC, hStmt); // Alocar o comando RetCode=SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStmt); if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, hEnv, hDBC, SQL_NULL_HANDLE); // Executar o Comando

RetCode=SQLExecDirect(hStmt, (unsigned char*)”SELECT * FROM PRODUTOS”, SQL_NTS);

if(RetCode!=SQL_SUCCESS)

(24)

ODBC - 23

ODBC - 23 ISEPISEP

API do ODBC

API do ODBC

!

Recuperar os resultados

!

Recuperar os resultados

RetCode=SQLBindCol(hStmt, 1, SQL_INTEGER, &iProduto, sizeof(int), &TamProduto);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, hEnv, hDBC, hStmt);

RetCode=SQLBindCol(hStmt, 2, SQL_CHAR, cDescricao, 50, &TamDescricao);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, hEnv, hDBC, hStmt);

...

RetCode=SQLBindCol(hStmt, 1, SQL_INTEGER, &iProduto, sizeof(int), &TamProduto);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, hEnv, hDBC, hStmt);

RetCode=SQLBindCol(hStmt, 2, SQL_CHAR, cDescricao, 50, &TamDescricao);

if(RetCode!=SQL_SUCCESS)

MostraErroSQL(RetCode, hEnv, hDBC, hStmt);

(25)

ODBC - 24

ODBC - 24 ISEPISEP

API do ODBC

API do ODBC

!

Recuperar os resultados - Fim

!

Recuperar os resultados - Fim

... do { RetCode=SQLFetch(hStmt); if(RetCode!=SQL_SUCCESS) MostraErroSQL(RetCode, hEnv, hDBC, hStmt);

if(RetCode==SQL_SUCCESS && RetCode!=SQL_NO_DATA) { printf("Produto: [%d]\n", iProduto); printf("Descricao: [%s]\n", cDescricao); } } while(RetCode==SQL_SUCCESS || RetCode!=SQL_NO_DATA); ... do { RetCode=SQLFetch(hStmt); if(RetCode!=SQL_SUCCESS) MostraErroSQL(RetCode, hEnv, hDBC, hStmt);

if(RetCode==SQL_SUCCESS && RetCode!=SQL_NO_DATA) { printf("Produto: [%d]\n", iProduto); printf("Descricao: [%s]\n", cDescricao); } } while(RetCode==SQL_SUCCESS || RetCode!=SQL_NO_DATA);

(26)

ODBC - 25

ODBC - 25 ISEPISEP

API do ODBC

API do ODBC

!

Fechar o Handle de comando

!

Fechar o Handle de comando

SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

(27)

ODBC - 26

ODBC - 26 ISEPISEP

API do ODBC

API do ODBC

!

Desligar

!

Desligar

void FinalizaODBC(SQLHENV hEnv, SQLHDBC hDBC) {

// Desligar da Base de Dados SQLDisconnect(hDBC);

// Libertar o handle de Conexão

SQLFreeHandle(SQL_HANDLE_DBC, hDBC);

// Libertar o handle de Ambiente

SQLFreeHandle(SQL_HANDLE_ENV, hEnv); }

void FinalizaODBC(SQLHENV hEnv, SQLHDBC hDBC) {

// Desligar da Base de Dados SQLDisconnect(hDBC);

// Libertar o handle de Conexão

SQLFreeHandle(SQL_HANDLE_DBC, hDBC);

// Libertar o handle de Ambiente

SQLFreeHandle(SQL_HANDLE_ENV, hEnv); }

(28)

ODBC - 27

ODBC - 27 ISEPISEP

ODBC

ODBC

Fim

Fim

Obrigado pela atenção!

Obrigado pela atenção!

Referências

Documentos relacionados

Neste estudo foi possível identificar 7 compostos no extrato oleoso de própolis: 4 ácidos fenólicos e 3 flavonóides, sendo que o flavonóide dihidrocanferida foi

Do mesmo modo, foi possível conhecer os resultados de outros produtos, tais como a tabuada do 9, por meio da soma resultante da multiplicação por 4 e por 5; por 7 e por 2, ou

Assim, e como forma de minimizar estes problemas, têm-se efectuado estudos que permitam relacionar a intensidade das cargas eléctricas a utilizar com a

O processo seletivo será realizado através da avaliação do desempenho escolar da pessoa inscrita, para isso se faz necessário o cadastro do boletim escolar

Quanto aos depósitos de doações acima de R $ 10,00 realizadas na conta bancária, o candidato esclarece que foram efetuadas mediante transferências 'on-line', sendo portanto

Pelo gráfico mostrado na Figura 4, conclui-se que os produtos Poliglicerol a 1% e a 3% e o glicerol são caracterizados como fluidos dilatantes com

A Secretaria de Educação estará encarregada da execução de ações educacionais do município, planejando, coordenando e administrando as atividades inerentes, bem

 Comparar e argumentar acerca das características existentes entre os diversos tipos de representações cênicas existentes no Teatro Popular Tradicional Brasileiro;.. 