home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Üben von SQL-Ausdrücken

Um SQL etwas üben zu können, möchte ich Ihnen, liebe Studierende, zwei kleine Tools zur Verfügung stellen. In einem Fall handelt es sich um Java-Quellcode, mit dem Sie sich mit einer (MySQL) Datenbank verbinden können und verschiedene Ausdrücke ausprobieren können. Das andere ist eine kleine Windowsanwendung, die in C# geschrieben wurde.

Windowsanwendung

Besonders einfach ist es, mit dieser Windowsanwendung SQL-Ausdrücke zu üben. Während der Installation werden Sie aufgefordert, das .NET-Framework 2.0 zu installieren. Dies benötigen Sie, da die Anwendung mit VisualStudio 2005 erstellt wurde.

Ich empfehle, zuerst das .NET Framework 2.0 zu installieren. Sie können es sich von http://www.microsoft.com/downloads/details.aspx?FamilyID=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=en herunterladen.

Die Datei Release.zip müssten Sie entpacken und die *.msi Datei ausführen (nicht setup.exe).  Nach der Installation bitte die Datei c:\programme\johner\sqlclientinstall\SqlTestClient.exe ausführen.

 

Bitte beachten Sie, dass ich keinerlei Gewähr oder Verantwortung für mögliche Schäden übernehme, die aus der Ausführung des Programms resultieren. Ich habe es nach bestem Gewissen entwickelt, den Quellcode dazu finden Sie nachfolgend.

Bitte melden Sie mir Schwierigkeiten und Fehler, die Ihnen auffallen. Nur so kann ich das Programm weiter verbessern.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace SqlTestClient
{
    /// <summary>
    /// This class comes without any warrenties. It is just meant to help my students exercising
    /// with SQL expressions. In case of problems, please report to mail@johner.org
    /// </summary>
    public partial class Form1 : Form
    {
        private string filename = "";

        public Form1()
        {
            InitializeComponent();
        }


        /// <summary>
        /// This method is called if the SQL statement has to be executed. If the SQL statement is a
        /// query it calls updateDataGrid, otherwise it directly executes the statement. In both cases
        /// the results are reported
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Visible = false;
            System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data source= " + filename;
            try
            {
                conn.Open();
                string sqlStatement = tSqlStatement.Text;// "create table karre(nummer INTEGER, name VARCHAR(32));";
                System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(sqlStatement, conn);

                if (sqlStatement.ToUpper().Contains("SELECT"))
                {
                    updateDateGrid(conn, sqlStatement);
                }
                else
                {
                    command.ExecuteNonQuery();
                    lResult.Text = ("Hat geklappt, Glückwunsch!");//: Found data are " + dataSet1.GetXml());
                }
            }
            catch (Exception ex)
            {
                lResult.Text=("Hat nicht geklappt:\n" + ex);
            }
            finally
            {
                conn.Close();
            }
        }

        /// <summary>
        /// Method executes sqlStatement (query) and populates the dataGridView 
        /// with the results
        /// </summary>
        /// <param name="conn"></param>
        /// <param name="sqlStatement">has to be a query like 'SELECT * FROM CAR'.
        /// We consider SQL-Statements with key word 'SELECT' to be queries. The
        /// Key word is not case sensitive</param>
        private void updateDateGrid(System.Data.OleDb.OleDbConnection conn, string sqlStatement)
        {
            System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter();
            adapter.SelectCommand = new System.Data.OleDb.OleDbCommand(sqlStatement, conn);
            DataSet dataSet = new DataSet();
            adapter.Fill(dataSet);
            dataGridView1.DataSource = dataSet.Tables[0];
            lResult.Text = ("Query hat geklappt, hier die Ergebnisse:");
            dataGridView1.Visible = true;
        }

        /// <summary>
        /// Opens file dialog to search for database. Local variable filename and
        /// label lDbFilePath are update accordingly
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                lDbFilePath.Text = openFileDialog1.FileName;
                filename = openFileDialog1.FileName;
                bExecute.Enabled = true;
            }
        }
    }
}

Java-Quellcode

Und hier noch ein wenig Java-Quellcode als Beispiel:

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

public class DatabaseClient {

  public static void main(String[] argsthrows SQLException, ClassNotFoundException {
    Class.forName"sun.jdbc.odbc.JdbcOdbcDriver" );
    Connection connection = DriverManager.getConnection("jdbc:odbc:imuk1dpm""""")
    Statement statement = connection.createStatement();
    
    //Vorhandene Tabelle löschen
    statement.execute("DROP TABLE Auto");
    
    //Tabelle anlegen
    statement.execute("CREATE TABLE Auto (Seriennr INTEGER, Typ VARCHAR(32), Kaufdatum DATE, Kosten NUMERIC);");
    
    //Primärschlüssel einfügen
    statement.execute("ALTER TABLE Auto ADD PRIMARY KEY (Seriennr);");
    
    //Werte hinzufügen
    statement.execute("INSERT INTO Auto (Seriennr, Typ, Kaufdatum, Kosten) VALUES (12, 'Audi', '2005-10-09', 1332.20);");
    statement.execute("INSERT INTO Auto (Seriennr, Typ, Kaufdatum, Kosten) VALUES (13, 'VW', '2005-11-12', 15232.99);");
    statement.execute("INSERT INTO Auto (Seriennr, Typ, Kaufdatum, Kosten) VALUES (14, 'VW', '2003-1-1', 15232.99);");
    
    //Werte abfragen
    ResultSet rs = statement.executeQuery("SELECT * FROM Auto WHERE Typ='VW'");
    printResults(rs);
    
    statement.close();
    connection.close();
    System.out.println("Fertig!");
  }

  private static void printResults(ResultSet rsthrows SQLException {
    ResultSetMetaData metaData = rs.getMetaData();
    int numberColumns = metaData.getColumnCount();
    String separator = "============";
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < numberColumns; i++) {
      System.out.print(metaData.getColumnName(i + 1"\t");
      sb.append(separator);
    }
    System.out.println("\n" + sb.toString());
    while (rs.next()) {
      for (int i = 0; i < numberColumns; i++) {
        System.out.print(rs.getString(i + 1"\t");
      }
      System.out.println("\n");
    }
  }

}