Datenbanksysteme, Prof. Dr. Martin Hulin Übungsblatt 4: C-Programm mit ODBC 4/8/2017 Wählen Sie eine der beiden folgenden Aufgaben für ein C-Programm mit ODBC aus Berechnung eines Korrelationskoeffizienten 1. Erstellen Sie eine Tabelle Verkauf mit den Feldern VERKAUF_ID, PRODUKT_ID und ANZAHL. Am einfachsten kopieren Sie die Tabelle Hulin.Verkauf. Dabei bedeutet der Datensatz (7, x, 12): Der Artikel x wurde beim Verkauf 7 insgesamt 12 mal gekauft. 2. Erstellen Sie ein C-Programm, das für alle Verkäufe den Korrelationskoeffizienten zwischen der Anzahl der gekauften Stücke von Produkt x und der Anzahl der gekauften Stücke von Produkt y berechnet. Wird bei einem Verkauf eines der Produkte x oder y nicht gekauft, so ist die Anzahl auf 0 zu setzen. Verwenden Sie ODBC zur Koppelung an die Datenbank. Die Formel für den Korrelationskoeffizienten lautet: n x y n x y i 1 i i n n 2 2 2 2 xi n x yi n y i 1 i 1 , mit x n 1 n x i 1 i und y n 1 n y i 1 i Dabei sind xi und yi die Ergebnisse einer n-fachen Stichprobe für die Zufallsgrößen x und y. Siegerliste erstellen 1. Fügen Sie in die Tabelle Veranstaltung eine Veranstaltung "Weitsprung Damen" ein. In der Tabelle Sportler_nimmtteil_Veranst sollen mindestens 4 Teilnehmer mit ihren Ergebnissen eingetragen werden. Außerdem soll der "400 m Lauf" auch mindestens 4 Teilnehmer erhalten mit Ergebnissen. 2. Erstellen Sie ein C-Programm, das für alle Veranstaltungen bei denen bereits Ergebnisse vorliegen, den Namen der Veranstaltung und dann in den nächsten drei Zeilen die Namen der besten drei Sportler bei dieser Veranstaltung mit den erzielten Ergebnissen ausdruckt. Dabei sollen für diese Aufgabe nur zwei Arten von Ergebnissen betrachtet werden: Ergebnisse in Sekunden (z. B. 20,5 s), Kennzeichen ist der Buchstabe "s" am Ende, und Ergebnisse in Metern (z. B. 6,5 m), Kennzeichen ist der Buchstabe "m" am Ende. Bei Sekunden muss aufsteigend, bei Metern absteigend sortiert werden. Hinweise Verwenden Sie am besten den Microsoft C++ Compiler Erzeugen Sie ein neues Projekt und zwar eine Konsole-Anwendung Der DataSourceName (DSN) heißt defaultmäßig "ai2" Das folgende Beispielprogramm, d. h. dieses Aufgabenblatt steht unter \\FH-Nov1\Sys\user\pub\Veranstaltungen\hulin\dabs\ODBC_Korrelation.doc zur Verfügung Achtung !!!! Loginname und Passwort für Oracle auf der Sun muß jeder für sich dort auch abändern !!! Die Funktionsaufrufe je nachdem, was gemacht werden soll, natürlich auch! Datenbanksysteme, Prof. Dr. Martin Hulin Übungsblatt 4: C-Programm mit ODBC 4/8/2017 Beispielprogramm mit ODBC für die Datenbank Adressen #include #include #include #include #include #include #include #include <Stdiostr.h> <stdio.h> <string.h> <stdlib.h> <windows.h> <sql.h> <sqlext.h> <odbcinst.h> const int MAX_DATA = 300; static char * szDSN = "ai2"; int main (void) { struct adrstruktur { long int anr; UCHAR ort[30]; UCHAR strasse[50]; }; adrstruktur erg; RETCODE rc; // Rückgabewert von ODBC-Funktionen HENV henv; // Umgebungs-Handle HDBC hdbc; // Verbindungs-Handle HSTMT hstmtS, hstmtU; // Anweisungs-Handle char * szSQL = "select ANr, Ort, Strasse from Adr where PLZ = '88255'"; // SQL-Kommando SDWORD cbData0, cbData1, cbData2; // Ausgabelaenge der Daten char szSQLSTATE[6]; SDWORD nErr; char msg[200]; SWORD cbmsg; SQLAllocEnv(&henv); SQLAllocConnect(henv, &hdbc); rc = SQLConnect(hdbc, (unsigned char *) szDSN, SQL_NTS, "hulin", 15, "Password_hulin", 14); if (rc != SQL_SUCCESS) printf("Fehlerconnect\n"); SQLAllocStmt(hdbc, &hstmtS); SQLAllocStmt(hdbc, &hstmtU); // Abfrage ausführen SQLBindCol(hstmtS, 1 ,SQL_C_LONG, &erg.anr, sizeof(erg.anr), &cbData0); SQLBindCol(hstmtS, 2 ,SQL_C_CHAR, erg.ort, sizeof(erg.ort), &cbData1); SQLBindCol(hstmtS, 3 ,SQL_C_CHAR, erg.strasse, sizeof(erg.strasse), &cbData2); rc = SQLExecDirect(hstmtS, (unsigned char *) szSQL, SQL_NTS); // Daten ausgeben if (rc != SQL_SUCCESS) { printf("Fehler_exec\n"); SQLError(0, 0, hstmtS, (unsigned char *) szSQLSTATE, &nErr, (unsigned char *) msg, sizeof(msg), &cbmsg); cout << "SQLState= " << szSQLSTATE << "msg " << msg; } else for(rc = SQLFetch(hstmtS); rc == SQL_SUCCESS; Datenbanksysteme, Prof. Dr. Martin Hulin Übungsblatt 4: C-Programm mit ODBC 4/8/2017 rc = SQLFetch(hstmtS)) // for1 { cout << erg.anr << "\t" << erg.ort << "\t" << erg.strasse << "\n"; wsprintf(szSQL,"UPDATE Adr SET Ort = 'Baienfurt' WHERE ANr = %ld", erg.anr); rc = SQLExecDirect(hstmtU, (unsigned char *) szSQL, SQL_NTS); cout << szSQL << "\n"; if (rc != SQL_SUCCESS) { cout << "Fehler beim update \n"; break; } } //end for1 //end if //Aufräumen SQLFreeStmt(hstmtS, SQL_DROP); SQLFreeStmt(hstmtU, SQL_DROP); SQLDisconnect(hdbc); SQLFreeConnect(hdbc); SQLFreeEnv(henv); return(TRUE); } Überblick über wichtige ODBC-Funktionen Umgebungshandle einrichten: SQLAllocEnv(&handlevariable_environment) Verbindungshandle einrichten: SQLAllocConnect (handlevariable_environment, &handlevariable_verbindung) Verbindung zur Datenbank aufbauen: SQLConnect( handlevariable_verbindung, Datenquellenname /* logischer Name der Datenbank */, Art_Zeichenkette /* z.B. SQL_NTS = Null Terminatet String */, Benutzername /* z.B. "hulin" */, Länge_Benutzername /* z.B. 15 */, Passwort, Länge_Passwort /* z.B. 14 */) Anweisungshandle einrichten: SQLAllocStmt(handlevariable_verbindung, &handlevariable_anweisung) Bindung von Tabellenspalten zu C-Variablen SQLBindCol( handlevariable_anweisung, Spaltennummer /* z.B. 1 */, Datentyp_der_Spalte, /* z.B. SQL_INTEGER oder SQL_C_CHAR */, &Zielvariable /* Variable der UWA an die die Spalte gebunden wird */, sizeof(Zielvariable) /* maximale Größe */, &Datenlänge /* Ergebnisparameter für die tatsächliche Größe */) Datenbanksysteme, Prof. Dr. Martin Hulin Übungsblatt 4: C-Programm mit ODBC Ausführen einer SQL-Anweisung: SQLExecDirect( handlevariable_anweisung, string_mit_SQL_Anweisung /* z.B. "SELECT * FROM Sportler" */, Art_Zeichenkette /* z.B. SQL_NTS = Null Terminatet String */) Datensatz holen; die Tabellenspalten werden automatisch in den durch SQLBindCol festgelegten Variablen abgelegt: SQLFetch(handlevariable_anweisung) Fehlermeldung holen: SQLError(0, 0, handlevariable_anweisung, Stringvariable_für_Status, &Fehlerzahl, Stringvariable_für_Fehlermeldung, sizeof(Stringvariable_für_Fehlermeldung), &Fehlermeldunglänge); Verbindung beenden: SQLDisconnect(handlevariable_verbindung) Handlevariable deallocieren: SQLFreeConnect(handlevariable_verbindung) 4/8/2017