|
Le monde du développeur: En train, il admire le scrolling du paysage.. Il rédige ses chèques en héxadécimal.. Sa dernière pensée avant de s'endormir est "shutdown completed"...
10 kind of people...: There are only 10 types of people in the world: Those who understand binary, and those who don't The UNIX way of sex: gunzip-strip-touch-finger-mount-fsck-more-yes-umount-sleep
Les aphorismes de Edsger Wybe Dijkstra: Tester un programme démontre la présence de bugs, pas leur absence. Se demander si un ordinateur peut penser, c'est aussi intéressant que de se demander si un sous-marin peut nager. La programmation par objets est une idée exceptionnellement mauvaise qui ne pouvait naître qu'en Californie. Les progrès ne seront possibles que si nous pouvons réfléchir sur les programmes sans les imaginer comme des morceaux de code exécutable.
Divers: " Ce n'est pas un bogue, c'est une fonctionnalité !" (de l'anglais It's not a bug, it's a feature). - Réponse fréquente des développeurs de logiciels à leurs utilisateurs. " Tout programme non trivial possède au moins un bogue "(de l'anglais Every non-trivial program has at least one bug) - Tiré de la loi de Murphy appliquée à l'informatique. " L'erreur est humaine, mais un vrai désastre nécessite un ordinateur "
Si vous en avez d'autre je suis preneur
Rien de plus énervants qu'un programme en C qui plante. Heureusement pour nous il existe les debuggers. Le plus utilisé sous linux est bien entendu gdb dont voici les commandes les plus courantes:
gcc -g -o nomProgramme nomSource.c // compile votre programme avec l'option debugage (-g) gdb nomDuProgramme // On lance le debugger run // lance le programme where // permet de determiner ou le programme s'est arrêté list nomSource.c:numéroLigne // permet de lire les lignes suspectes break numéroDeLigne // met un point d'arrêt à la ligne correspondante file // permet de corriger le programme set var nomVariable1=nomVariable2 // remplace variable1 par variable2 cont // continue l'éxcution du programme next // exécute la ligne suivante dans la même fonction step // exécute la ligne de code suivante dont les appels de fonctions rencontrés until numéroDeLigne // exécute le programme jusqu'a numéroDeLigne print nomVariable // permet de connaître la valeur de la variable attach PID // lie le deboguer avec un programme courant bt //backtrace, édite la stack du programme info program // affiche statut d'éxécution info locals // donne le nom des variables avec leurs valeurs dans la fonction courante info variables // donne le nom des variables avec leurs valeurs dans tout le programme info address // indique ou sont stocké les variables info frame // informations sur la structure de la pile courante quit // quitter gdb
Aujourd'hui je vais vous parler un peu de mon hébergeur: ZeBlog.com ZeBlog offre quelques avantages: - Gratuité
- Pas de pub (c'est rare et agréable il faut le reconnaître)
- Simplicité
Par contre tout cela à un prix, voici donc les inconvénients: - Peu de design
- Traitement de texte très pauvre (peu de balises phpbb)
- Statistiques quasi inexistantes
- Mauvaise gestion des commentaires
Dernièrement je me suis aperçu que certaines personnes m'avaient laissé des commentaires sur de vieux billets. Hélas à chaque fois que je viens sur mon blog je ne me rappelle pas forcément le nombre de commentaires qu'il y avait lors de ma précédente visite, ce qui fait que si les commentaires n'étaient pas postés en première page je ne m'en rendais pas compte. Enfin j'ai résolu ce problème, comment allez vous me demander? Mais en "embauchant" quelqu'un pour visiter mon blog à ma place! Cette personne se connecte à mon blog et vérifie toutes les 15 mins si j'ai un nouveau commentaire. Si tel est le cas elle m'avertit et je n'ai alors plus qu'à me connecter pour vous répondre chers visiteurs  . Ce "quelqu'un" travaille pour moi gratuitement et ne râle jamais  . Si vous aussi vous voulez faire sa connaissance ou bien l'embaucher pour travailler pour vous c'est ici et c'est gratuit. Have Fun!
Ubung 4 Datenbank Datenbankexport mit JDBC Schreiben Sie eine Java-Anwendung, mit der man einen einfachen Datenbank-Export durchführen kann. Man gibt die Tabellen an, die man exportieren möchte und das Programm erzeugt zwei SQL-Skripten: eines, das die DDL-Anweisungen zum Erzeugen der Tabellen enthält, und eines, das die Insert-Anweisungen zum Füllen der Tabellen enthält. Zusatzaufgabe: Es sollen auch Anweisungen, die die referentielle Integrität betreffen, erzeugt werden. import java.sql.*; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.sql.DatabaseMetaData; import javax.swing.JOptionPane;
public class ExportJDBC { // Datenbank private static String datenBankName = null; private static String treiberArte = null; private static String login = null; private static String password = null; // Datei private static FileWriter createFile = null; private static BufferedWriter outCreate = null; private static FileWriter fillFile = null; private static BufferedWriter outFill = null;
// main public static void main(String[] arg){ // Informationen ueber Datenquelle Connection con = null; DatabaseMetaData dbmd = null; ResultSet tables = null; treiberArte = new String("com.mysql.jdbc.Driver"); datenBankName = new String("studenplan"); login = new String("root"); password = new String(""); // Initialieren der Datei try{ // tabellename-create.sql createFile = new FileWriter(datenBankName+"-create.sql"); outCreate = new BufferedWriter(createFile); outCreate.write("/* Tabellen neu erzeugen */"); outCreate.newLine(); // tabellename-fill.sql fillFile = new FileWriter(datenBankName+"-fill.sql"); outFill = new BufferedWriter(fillFile); }catch (IOException ex){ ex.printStackTrace(); System.exit(0); } try{ /*** Schritt 1: Treiber registrieren ***/ Class.forName(treiberArte); /*** Schritt 2: Connection zur Datenbank herstellen ***/ con = DriverManager.getConnection("jdbc:mysql:///"+datenBankName, login, password); JOptionPane.showMessageDialog(null, "Connection for export OK"); /*** Schritt 3: Tabelle in die Datenbank ***/ dbmd = con.getMetaData(); System.out.println("Database Productname: "+dbmd.getDatabaseProductName()); System.out.println("Database Productversion: "+dbmd.getDatabaseProductVersion()); tables = dbmd.getTables( con.getCatalog(), // catalog null, // schemaPattern "%", // tableNamePattern "%"=irgendein Name null // types ); /*** Schritt 4: Informationen speichern ***/ while(tables.next()){ /** Tabellename **/ int spaltenanzahl = 0; String dbName = tables.getString("TABLE_NAME"); System.out.println("---[ Tabelle: "+dbName+" ]---"); /* Alle informationen ueber die Tabelle : TABLE_CAT, TABLE_SCHEM ... ResultSetMetaData ergebnisMeta = tables.getMetaData(); spaltenanzahl = ergebnisMeta.getColumnCount(); for(int i=0; i< spaltenanzahl ; i++){ String nomColonne = ergebnisMeta.getColumnName(i+1); System.out.println(nomColonne+" = "+tables.getString(i+1)); } */ outCreate.write("CREATE TABLE "+tables.getString(3)); outCreate.newLine(); outCreate.write("("); outCreate.newLine(); /** Spalten **/ ResultSet spalten = dbmd.getColumns(con.getCatalog(), null, dbName, "%"); ResultSetMetaData spaltenMeta = spalten.getMetaData(); spaltenanzahl = spaltenMeta.getColumnCount(); /** Alle Spalten for(int i=0; i < spaltenanzahl; i++){ System.out.print(spaltenMeta.getColumnName(i+1)+" | "); } System.out.println(); **/ /** create.sql **/ while( spalten.next() ) { String strColumnName = spalten.getString("COLUMN_NAME"); String strTypeName = spalten.getString("TYPE_NAME"); System.out.print(strColumnName+" "+strTypeName); outCreate.write(strColumnName+" "+strTypeName); if(strTypeName.contains("char") || strTypeName.contains("CHAR")) {// Wenn das ein CHAR ist, mussen die Lange kennen. System.out.print("("+spalten.getString("COLUMN_SIZE")+")"); outCreate.write("("+spalten.getString("COLUMN_SIZE")+")"); } System.out.println(); outCreate.append(","); outCreate.newLine(); } /** Schreiben die Ende des Dateis **/ outCreate.write(");"); outCreate.newLine(); outCreate.newLine(); /* Alle informationen in Spalten while(spalten.next()){ for(int j = 0; j < spaltenanzahl; j++){ System.out.print(spalten.getString(j+1) +"|"); } System.out.println(); } */ /** fill.sql **/ /* Kann nicht sein, muss immer eine Tabelle da sein PreparedStatement pstmtSelect = con.prepareStatement("SELECT * FROM ?"); pstmtSelect.setString(1, dbName); ResultSet ergebnis = pstmtSelect.executeQuery(); */ // Tabelle Leeren outFill.newLine(); outFill.write("/* Tabelle leeren */"); outFill.newLine(); outFill.write("delete from "+dbName); outFill.newLine(); Statement anweisung = con.createStatement(); ResultSet ergebnis = anweisung.executeQuery("SELECT * FROM "+dbName); ResultSetMetaData ergebnisMeta = ergebnis.getMetaData(); spaltenanzahl = ergebnisMeta.getColumnCount(); String [] spaltenName = new String [spaltenanzahl]; for(int i = 0; i < spaltenanzahl; i++){ spaltenName[i] = ergebnisMeta.getColumnName(i+1); System.out.print(spaltenName[i]+" | "); } System.out.println(); outFill.write("/* Tabelle "+dbName+" fuellen */"); outFill.newLine(); while(ergebnis.next()){ StringBuffer zeileInhalt = new StringBuffer("INSERT INTO "+dbName+" VALUES("); for(int i = 0; i < spaltenanzahl; i++){ System.out.print(ergebnis.getString(i+1)+" | "); if(i == spaltenanzahl-1) zeileInhalt.append("'"+ergebnis.getString(i+1)+"'"); else zeileInhalt.append("'"+ergebnis.getString(i+1)+"', "); } System.out.println(); zeileInhalt.append(");"); outFill.write(zeileInhalt.toString()); outFill.newLine(); } } } catch (ClassNotFoundException ex){ JOptionPane.showMessageDialog(null, "Class not found! "+ex.getMessage()); } catch (SQLException ex){ JOptionPane.showMessageDialog(null, "JDBC Fehler: "+ex.getMessage()); } catch (IOException ex){ ex.printStackTrace(); System.exit(0); } /*** Schritt 6: Nicht mehr benoetigte Resourcen freigeben ***/ finally{ try{ if(con != null) con.close(); outCreate.close(); outFill.close(); } catch(SQLException ex){ ex.printStackTrace(); } catch(IOException ex){ ex.printStackTrace(); } } System.exit(0); } }
|