ActiveX Data Objects (ADO) dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole zlipinski@math.uni.opole.



Podobne dokumenty
4 Web Forms i ASP.NET Web Forms Programowanie Web Forms Możliwości Web Forms Przetwarzanie Web Forms...152

Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

I - Microsoft Visual Studio C++

Ćwiczenia 2 IBM DB2 Data Studio

Manipulowanie danymi przy użyciu DAO

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Paweł Rajba

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

1.1. System otwartych baz danych ODBC. System otwartych baz danych ODBC. Interfejs ODBC. Interfejs ODBC. System otwartych baz danych ODBC

Oracle PL/SQL. Paweł Rajba.

'otwarcie i ustawienie zbioru rekordow na podstawie tabeli Studenci Set rs = CurrentDb.OpenRecordset("Studenci", dbopensnapshot)

Database Connectivity

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Podstawy programowania III WYKŁAD 2

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Część 4 życie programu

Administracja i programowanie pod Microsoft SQL Server 2000

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Programowanie i struktury danych

Zdarzenia (events, connection points)

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Obsługa wyjątków. Język C++ WW12

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

Materiały do laboratorium MS ACCESS BASIC

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Kursory. A. Pankowska 1

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Kurs programowania. Wykład 9. Wojciech Macyna

DYNAMICZNE PRZYDZIELANIE PAMIECI

4 bity zarezerwowane dla przyszłych zastosowań 11 bitów określających źródło błędu 16 bitów określających rodzaj błędu.

Instrukcja laboratoryjna cz.3

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

TEMAT : KLASY POLIMORFIZM

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład I. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

PL/SQL. Zaawansowane tematy PL/SQL

Programowanie MorphX Ax

Wstęp do programowania

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

Programowanie w językach

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Połączenie AutoCad'a z bazą danych

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Db4o obiektowa baza danych wersja.net

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Zapytania i wstawianie etykiet z bazy danych do rysunku

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Język C++ wykład VIII

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp { inti; public:

Informatyka I : Tworzenie projektu

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

PODSTAWY BAZ DANYCH 13. PL/SQL

Programowanie obiektowe W3

Agregacja. Wykorzystanie innego komponentu bez użycia agregacji. Simple calculator. Extended calculator

Wprowadzenie. Rozdział 23 PDO. Podstawowe kroki aplikacji. Źródło danych

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Materiały pomocnicze do zajęć z przedmiotu Projekt ADP

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Podstawy programowania skrót z wykładów:

Programowanie w języku Java. Bazy danych SQLite w Javie

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

akademia androida Składowanie danych część VI

Wprowadzenie do JDBC z wykorzystaniem bazy H2

STWORZENIE BIBLIOTEKI SŁUŻĄCEJ DO WCZYTYWANIA

Programowanie obiektowe

Dostęp do baz danych w ASP.NET.

Programowanie 2. Język C++. Wykład 1.

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Metody dostępu do danych

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

JDBC (Java Database Connectivity vit )

Przypisywanie bibliotek w architekturze SAS

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Operacje wejścia/wyjścia (odsłona druga) - pliki

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Wykład 4. Architektura ADO.NET Dostawcy danych Modele dostępu do danych model połączeniowy Model bezpołączeniowy. Bazy danych 2

Wprowadzenie do programowania i programowanie obiektowe

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

SQL 4 Structured Query Lenguage

Transkrypt:

Komunikacja z bazami danych ActiveX Data Objects (ADO) dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole zlipinski@math.uni.opole.pl

Co to jest ActiveX Data Objects? ADO jest technologią firmy Microsoft. komponentem Active-X (ACTIVE exchange). automatycznie instalowany z serwerem WWW Microsoft IIS. interfejsem programowym dostępu do baz danych. Kontrolka Active-X - wcześniejsza nazwa kontrolką OLE, jest przykładem obiektu typu COM. Komponent realizujący określoną funkcjonalność, który może być zagnieżdżany w aplikacje, okna dialogowe, strony HTML. Kontrolka Active-X to plik z rozszerzeniem *.ocx Obiekty ADO: ADO Command ADO Connection ADO Error ADO Field ADO Parameter ADO Property ADO Record ADO Recordset ADO Stream ADO DataTypes 2

Obiekty ADO Obiekt Command stosowany do wykonania kwerend do bazy danych w celu utworzenia, uaktualnienia, dodania, pobrania, usunięcia (create, add, retrieve, delete, update) rekordu. Jeżeli kwerenda służyła do pobrania danych, to dane są zwracane jako obiekt RecordSet (zbiór rekordów). Aby odzyskać dane z obiektu RecordSet należy posłużyć się metodami, properties, collections, obiektu Recordset. Tworzenie obiektu w asp.net set objcommand=server.createobject("adodb.command") Obiekt Connection obiekt służy do budowy i otwarcia połączenia z bazą danych. Tworzenie obiektu w asp.net set objconnection=server.createobject("adodb.connection") 3

Obiekty ADO Obiekt Error - obiekt zawiera dane o błędach powstałych przy wykonaniu pojedynczych operacji na bazie danych. Przykład użycia. for each objerr in objconn.errors response.write(objerr.description ) response.write(objerr.helpcontext) response.write(objerr.helpfile) response.write(objerr.nativeerror) response.write(objerr.number) response.write(objerr.source) response.write(objerr.sqlstate) Next Obiekt Field obiekt przechowuje informacje o kolumnie danych w obiekcie Recordset. Tworzenie obiektu w asp.net set objfield=server.createobject("adodb.field") 4

Obiekty ADO Obiekt Parameter obiekt służy do uzyskania informacji o parametrach użytych w procedurach składowanych (stored procedures) lub kwerendach. Cztery typy parametrów: input, output, input/output, return. Przykład składni. objectname.property objectname.method Obiekt Property - obiekt reprezentuje dynamiczne charakterystyki obiektów ADO zdefiniowanych dla różnych typów baz danych (db providers). Tworzenie obiektu w asp.net set objproperty=server.createobject("adodb.property") 5

Obiekty ADO Obiekt Record (ADO ver. 2.5) obiekt służy do przechowania wiersza danych z Recordsetu, katalogu lub pliku. Przykład użycia: objectname.property objectname.method Obiekt Recordset - obiekt służy do przechowywania danych (zbioru rekordów) z tabeli. Obiekt Recordset składa się z rekordów i kolumn (pól, ang. Fields). Recordset może uaktualnić dane na dwa sposoby: immediate updating, batch updating. Tworzenie obiektu w asp.net set objrecordset=server.createobject("adodb.recordset") Obiekt Stream (ADO version 2.5) obiekt stosowany do czytania, zapisywania, zarządzania strumieniem danych. 6

Kursory ADO Kursory ADO są parametrami metod obiektów ADO. Kursory definiują usługi kursora (cursor service). Typy kursorów ADO: Dynamic cursor pozwala na przegląd operacji dodania, zmiany, usunięcia wykonane przez innego użytkownika. Keyset cursor usługa podobna do usługi kursora dynamic, za wyjątkiem - braku możliwości przeglądania operacji dodania przez innego użytkownika, - braku dostępu do rekordów które inny użytkownik usunął. Dane zmienione (update) przez innego użytkownika są widoczne. Static cursor pozwala dokonać statycznego kopiowania rekordsetów w celu znalezienia danych lub wygenerowania raportów. Operacje dodania, zmiany, usunięcia wykonane przez innego użytkownika są niewidoczne. Typ kursora dostępny tylko dla obiektów typu klient rekordset. Forward-only cursor pozwala przejrzeć rekordset. Operacje dodania, zmiany, usunięcia wykonane przez innego użytkownika są niewidoczne. Kursor Forward-only może być ustawiony poprzez property CursorType lub poprzez parametr CursorType w metodzie Open(). 7

Budowa połączenia z bazą danych Proces budowy połączenia z bazą danych za pomocą obiektów ADO: 1. Utworzenie połączenia ADO z bazą danych. 2. Otwarcie połączenia. 3. Utworzenie recordseta. 4. Otwarcie recordseta. 5. Pobranie danych do recordseta. 6. Zamknięcie recordseta. 7. Zamknięcie połączenia. 8

Połączenie z bazą danych za pomocą serwera WWW 1-2. Utworzenie i otwarcie połączenia z bazą danych. Baza northwind.mdb., Northwind_en 2007.accdb, northwind_pl 2007.accdb, northwind.accdb. set conn = Server.CreateObject("ADODB.Connection") conn.provider="microsoft.jet.oledb.4.0" conn.open "c:/webdata/northwind.mdb Utworzenie i otwarcie połączenia z bazą danych za pomocą komponentu ODBC (Open DataBase Connectivity). set conn = Server.CreateObject("ADODB.Connection") conn.open "northwind" 3. Utworzenie recordseta. set rs = Server.CreateObject("ADODB.recordset") 9

Połączenie z bazą danych za pomocą serwera WWW 4-5. Otwarcie i pobranie danych do recordseta. Czytanie danych z rekordseta. rs.open "Select * from Customers", conn for each x in rs.fields response.write(x.name) response.write(" = ") response.write(x.value) Next 6. Zamknięcie recordseta. rs.close 7. Zamknięcie połączenia. conn.close 10

Metody dostępu do bazy danych Tabular Data Stream (TDS) dla SOAP Metody dostępu do bazy danych. Źródło biblioteka MSDN. 11

Połączenie z bazą danych Microsoft Access Silniki dla baz danych MS Access: Microsoft JET engine (Joint Engine Technology, 1992), ACE Engine (Microsoft Access Engine, 2007). Cechy ACE Engine: nowy format danych.accdb, dodano obsługę złożonych typów danych, nowe mechanizmy szyfrowania, możliwość integracji z Windows SharePoint Services 3.0, Microsoft Office Outlook 2007. Typy dostępu do danych Microsoft Access: ADO (ActiveX Data Objects), ATL OLE DB (Active Template Library Object Linking and Embedding DB), Direct DAO (Data Access Objects), ODBC (Open Database Connectivity), MFC ODBC (Microsoft Foundation Classes Open Database Connectivity). 12

Funkcje biblioteki COM. Połączenie z bazą danych Microsoft Access za pomocą obiektów ADO Funkcja : CoInitialize(). HRESULT CoInitialize( _In_opt_ LPVOID pvreserved); Argumenty: pvreserved [in, optional] - parametr zarezerwowany, musi być NULL. Zwracana wartość: S_OK - biblioteka COM zainicjowana. S_FALSE - biblioteka COM jest już zainicjowana. RPC_E_CHANGED_MODE - inicjowany proces wielowątkowy multithread apartment (MTA). Opis: Funkcja inicjuje bibliotekę obiektów COM, zwraca wskaźnik do pamięci COM i funkcji COM. 13

Połączenie z bazą danych Microsoft Access - ADO Funkcje biblioteki COM. Funkcja: CoUninitialize(). Argumenty: brak Zwracana wartość: void void CoUninitialize(void); Opis: Funkcja zamyka bibliotekę obiektów COM. Funkcje Windows: GetCount(), GetItem(), GetName(), GetValue(). Funkcje służą do manipulacji złożonymi typami danych. Property (język CLI C++): Description zwraca opis błędu. get_fields zwraca informacje o konfiguracji zasobów. Klasy i struktury: _bstr_t, _variant_t - klasy służące do zarządzania zasobami przy wywoływaniu funkcji. 14

Struktura programu - połączenie z bazą danych Microsoft Access - ADO Konfiguracja projektu. Kompilator: MS Visual Studio 2008 Projekt: Visual C++, Win32, Win32 Console application, Console application, empty project. Baza danych: Northwind_pl 2007.accdb Northwind_uk 2007.accdb #import <C:\\Program Files\\Common Files\\System\\ado\\msado15.dll> \ rename( "EOF", "AdoNSEOF" ) #include <iostream> #include <tchar.h> using namespace std; // string identyfikujący bazę danych _bstr_t bstrconnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Northwind 2007.accdb;"; 15

Struktura programu - połączenie z bazą danych Microsoft Access - ADO int _tmain(int argc, _TCHAR* argv[]) HRESULT hr = CoInitialize(NULL); // inicjowanie obiektu COM if (FAILED(hr)) cout << "Błąd wywołania funkcji CoInitialize()" << endl; return hr; try // obsługa błędów COM w bloku try catch ADODB::_ConnectionPtr pconn("adodb.connection"); hr = pconn->open(bstrconnect, "admin", "", ADODB::adConnectUnspecified); if (SUCCEEDED(hr)) cout<<"połącznie z bazą: \n " << pconn->getconnectionstring() << endl; _bstr_t query = // kwerenda SQL "SELECT Customers.[Company], Customers.[First Name] FROM Customers;"; // cout << "SQL query:\n " << query << endl; // wysłanie kwerendy, utworzenie record set a ADODB::_RecordsetPtr prs("adodb.recordset"); hr = prs->open(query, _variant_t((idispatch *) pconn, true), //cast Idispatch, ADO jest interf. typu ADODB::adOpenUnspecified, ADODB::adLockUnspecified, ADODB::adCmdText); // Idispatch dziedziczy od interfesju IUnknown 16

Struktura programu - połączenie z bazą danych Microsoft Access - ADO if (SUCCEEDED(hr)) cout << "Informacja o strukturze: " << endl; ADODB::Fields* pfields = NULL; hr = prs->get_fields(&pfields); if (SUCCEEDED(hr) && pfields && pfields->getcount() > 0) for (long nindex=0; nindex < pfields->getcount(); nindex++) cout<<" "<<_bstr_t(pfields->getitem(nindex)->getname()); cout << endl; else cout << "Błąd, liczba pól ma wartość zero." << endl; cout << "Pobieranie danych: " << endl; int rowcount = 0; while (!prs->adonseof) for (long nindex=0; nindex < pfields->getcount(); nindex++) cout<<" "<<_bstr_t(pfields->getitem(nindex)->getvalue()); cout << endl; prs->movenext(); rowcount++; cout << "Liczba pobranych wierszy: " << rowcount << endl; prs->close(); pconn->close(); cout << "Połączenie zamknięte" << endl; 17

Struktura programu - połączenie z bazą danych Microsoft Access - ADO else cout << "Błąd połączenia z bazą: " << bstrconnect << endl; catch(_com_error& e) cout << "Błąd COM: " << e.description() << endl; CoUninitialize(); // zwolnienie biblioteki COM return hr; 18

Połączenie z bazą danych metodą ATL OLE DB Konfiguracja projektu. Kompilator: MS Visual Studio 2008 Projekt: Visual C++, Win32, Win32 Console application, Console application + ATL lub empty project. Baza danych: Northwind_pl 2007.accdb Northwind_uk 2007.accdb Parametry projektu: Character Set: Use Multi-Byte Character Set. Active Template Library (ATL) biblioteka szablonów klas C++ do tworzenie obiektów COM. CDataSource - klasa, reprezentuje typ danych OLE DB. CSession - klasa, reprezentuje typ danych służący do dostępu do danych w pojedynczej sesji. CComVariant - klasa ATL, typ zawierający typy przechowywanych danych. Metody biblioteki ATL: GetInitializationString() - metoda klasy CDataSource pobiera dane inicjujące z otwartego źródła danych. OpenFromInitializationString() metoda otwiera źródło danych zidentyfikowane przez dane inicjujące. OLE2T(), COLE2T() makra konwertujące stringi ATL. Funkcje Windows: GetColumnCount(), GetColumnInfo(). 19

Struktura programu - połączenie z bazą danych metodą ATL OLE DB #include <atldbcli.h> #include <atldbsch.h> #include <iostream> using namespace std; // string identyfikujący bazę danych LPCOLESTR lpcoleconnect = L"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Northwind 2007.accdb; User Id=admin; Password=;"; 20

Struktura programu - połączenie z bazą danych metodą ATL OLE DB int _tmain(int argc, _TCHAR* argv[]) HRESULT hr = CoInitialize(NULL); // inicjowanie obiektu COM if (FAILED(hr)) cout <<"Błąd wywołania funkcji CoInitialize()" << endl; return hr; // deklaracja obiektów klas CDataSource and CSession z biblioteki ATL CDataSource dbdatasource; CSession dbsession; // użycie makra ATL konwertującego stronę kodową USES_CONVERSION; // otwarcie połączenia hr = dbdatasource.openfrominitializationstring(lpcoleconnect); if (FAILED(hr)) cout<<" Błąd połączenia z bazą " << OLE2T(lpcOleConnect)<<endl; else hr = dbsession.open(dbdatasource); if (FAILED(hr)) cout<<" Błąd, budowy sesji z bazą "<< OLE2T(lpcOleConnect)<<endl; else CComVariant var; hr = dbdatasource.getproperty(dbpropset_datasourceinfo, DBPROP_DATASOURCENAME, &var); if (FAILED(hr) (var.vt == VT_EMPTY)) cout <<"Niewłaściwa nazwa bazy " << endl; 21

Struktura programu - połączenie z bazą danych metodą ATL OLE DB else cout<<"połączenie z bazą:\n " << COLE2T(var.bstrVal)<<endl; // kwerenda SQL LPCOLESTR query = L"SELECT Customers.[Company], Customers.[First Name] FROM Customers;"; // cout<<"kwarenda SQL:\n " << OLE2T(query)<<endl; // Wysłanie kwarendy, utworzenie record set a CCommand<CDynamicStringAccessor> cmd; hr = cmd.open(dbsession, query); DBORDINAL colcount = cmd.getcolumncount(); if (SUCCEEDED(hr) && 0 < colcount) cout<<" Pobranie informacji o strukturze danych "<<endl; DBORDINAL ccolumns; DBCOLUMNINFO* rginfo = NULL; OLECHAR* pstringsbuffer = NULL; cmd.getcolumninfo(&ccolumns, &rginfo, &pstringsbuffer); for (int col=0; col < (int)colcount; col++) cout<<" "<<OLE2T(rgInfo[col].pwszName); cout<<endl; 22

Struktura programu - połączenie z bazą danych metodą ATL OLE DB cout<<"pobranie danych: "<<endl; int rowcount = 0; CRowset<CDynamicStringAccessor>* prs =(CRowset<CDynamicStringAccessor>*)&cmd; // Pobranie wierszy z danymi while (prs->movenext() == S_OK) for (int col=1; col <= (int)colcount; col++) CHAR* szvalue = cmd.getstring(col); cout<<" "<<szvalue; cout<<endl; rowcount++; cout<<" Liczba wierszy: " << rowcount<<endl; else cout<<"błąd, liczba pól zero."<<endl; dbdatasource.close(); dbsession.close(); CoUninitialize(); return hr; 23

Połączenie z bazą danych metodą Direct ODBC Konfiguracja projektu. Kompilator: MS Visual Studio 2008 Projekt: Visual C++, Win32, Win32 Console application, Console application, empty project. Baza danych: Northwind_pl 2007.accdb Northwind_uk 2007.accdb Parametry projektu: Character Set: Use Multi-Byte Character Set Funkcje biblioteki ODBC: SQLAllocEnv(), SQLAllocConnect(), SQLAllocStmt() -funkcje alokują uchwyty do zmiennych środowiskowych, połączenia, wyrażeń. SQLDriverConnect() funkcaj buduje połączenie, zwracając string połączenia. SQL_SUCCEEDED() SQLPrepare() SQLBindCol() SQLExecute() SQLNumResultCols() SQLDescribeCol) SQLFetch() SQLFreeStmt(), SQLFreeHandle() funkcje zwalniają uchwyty. 24

Struktura programu - połączenie z bazą danych metodą Direct ODBC #include <windows.h> #include <stdio.h> #include <sqlext.h> // string identyfikujący bazę danych w ODBC char szdsn[256] = "Driver=Microsoft Access Driver (*.mdb, *.accdb); DSN=''; DBQ=C:\\Northwind 2007.accdb;"; 25

Struktura programu - połączenie z bazą danych metodą Direct ODBC main() HENV henv; // property, uchwyt do zmiennej środowiskowej HDBC hdbc; // property, uchwyt do połączenia odbc RETCODE rc; // ODBC API return status int iconnstrlength2ptr; char szconnstrout[256]; unsigned char* query = "SELECT Customers.[Company], Customers.[First Name] FROM Customers;"; SQLCHAR chval1[128], chval2[128], colname[128]; int ret1; int ret2; // Number of rows and columns in result set SQLINTEGER rowcount = 0; SQLSMALLINT fieldcount = 0, currentfield = 0; HSTMT hstmt; //property, uchwyt do wyrażeń odbc rc = SQLAllocEnv(&hEnv); // alokacja zmiennej środowiskowej henv rc = SQLAllocConnect(hEnv, &hdbc); // alokacja uchwytu do połączenia hdbc // Połączenie z bazą rc = SQLDriverConnect(hDbc, NULL, (unsigned char*)szdsn, SQL_NTS, (unsigned char*)szconnstrout, 255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT); if (SQL_SUCCEEDED(rc)) printf("połączenie z bazą: \n %s \n", szconnstrout); // printf("sql query:\n %s\n", query); // Kwerenda SQL rc = SQLAllocStmt(hDbc,&hStmt); rc = SQLPrepare(hStmt, query, SQL_NTS); // Połączenie (bind) danych pobranych z bazy z buforem rc = SQLBindCol(hStmt, 1, SQL_C_CHAR, chval1, 128, (SQLINTEGER*)&ret1); rc = SQLBindCol(hStmt, 2, SQL_C_CHAR, chval2, 128, (SQLINTEGER*)&ret2); 26

Struktura programu - połączenie z bazą danych metodą Direct ODBC // wykonanie kwerendy i utworzenie recordset a rc = SQLExecute(hStmt); if (SQL_SUCCEEDED(rc)) printf("pobranie informacji o strutkurze danych:\n"); SQLNumResultCols(hStmt, &fieldcount); if (fieldcount > 0) for (currentfield=1; currentfield <= fieldcount; currentfield++) SQLDescribeCol(hStmt, currentfield, colname, sizeof(colname), 0, 0, 0, 0, 0); printf(" %s", colname); printf("\n"); else printf("błąd, liczba pól zero. \n"); printf("pobranie danych.\n"); rc = SQLFetch(hStmt); while (SQL_SUCCEEDED(rc)) printf(" %s %s\n", chval1, chval2); rc = SQLFetch(hStmt); rowcount++; ; printf("liczba wierszy: %d\n", rowcount); rc = SQLFreeStmt(hStmt, SQL_DROP); else printf("brak połaczenia z %s.\n", szdsn); // rozłączenie, zwolnienie uchwytów SQLDisconnect(hDbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); 27