1. Sobald eine Veranstaltung neu eingetragen wird, oder die AID

Werbung
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
Herunterladen