C# Datenbank SQL mit Daten füllen



  • habe eine fertige Datenbank, die ich mit Eingabedaten aus Editfeldern usw. füllen möchte. Es soll eine Zimmerreservierung für ein Hotel werden. Nach der Eingabe der Hotelgastdaten soll man über einen Button die Datenbank füllen können. Meine Datenbankverbindung funktioniert bereits. Wie kann ich jetzt zB einen Wert aus einem Editfeld in die Datenbank schreiben?



  • INSERT INTO tabelle (Spalte1,Spalte2) VALUES ('wert1',2)

    z.B.

    Wenn Du Code meinst. Das findert Du mit google sicher in 5 Sekunden. Gibt da tausende Examples. Auch die MSDN ist voll davon.



  • mit SQL-Befehlen kannte ich das auch. Also muss ich die Textbox dort einbauen?
    Also:

    befehl = new SQLCommand();
    befehl.CommandText = "INSERT INTO Kunde(Name, Vorname)" + 
        "VALUES('" +
        textBox1.Text +
        "'," +
        textBox2.Text +
        ")";
    

    Gibt es da nicht eine bessere Möglichkeit in C#?



  • Vielleicht schaust du dir mal Linq-To-Sql oder die ADO.NET Entities an, das könnte dir vielleicht einiges an Arbeit abnehmen und macht die Sache gleich noch sicherer.



  • rudpower schrieb:

    mit SQL-Befehlen kannte ich das auch.

    Aber bitte wenn mit SQL-Parametern. SQL-Statements sollte man nicht durch aufaddieren von Strings erzeugen. Nehmen wir mal an der Kunde hat ein Hochkomma in seinen Nachnamen (Und das ist durchaus Praxisrelevant) - mit aufaddieren kommst du nicht weit.

    Zudem lässt sich mittels aufaddieren auch beliebiger SQL-Code eingeben.

    Was passiert wohl wenn ich in den Vorname folgendes bei dir eingeben würde:
    "a'); DROP TABLE KUNDE;" (usw.).



  • Das Projekt ist für eine mündliche Prüfung. Linq-To-Sql hör ich zum ersten Mal und das hatten wir auch nicht in der Vorlesung.

    WIe sähe das untere Beispiel denn korrekt aus ohne LingToSql?



  • Lies dir z.B. mal diesen Artikel zum Thema "Parameter von SQL-Befehlen" durch: http://www.mycsharp.de/wbb2/thread.php?threadid=66704



  • rudpower schrieb:

    Das Projekt ist für eine mündliche Prüfung. Linq-To-Sql hör ich zum ersten Mal und das hatten wir auch nicht in der Vorlesung.

    WIe sähe das untere Beispiel denn korrekt aus ohne LingToSql?

    wenn ihr es nicht hattet macht es vll. einen besseren eindruck in einer mündl. prüfung, weil stabiler u sicherer!



  • hab mir das mit dem ADO mal angeschaut und das scheint ja das zu sein was wir gemacht haben. Hier mal ein Codebeispiel aus der Vorlesung:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    // namespace für DB-Verbindungen:
    using System.Data.SqlClient;
    // für Verbindung zu SQL-Server
    
    namespace CS_WS2007_DB1
    {
        public partial class Form1 : Form
        {
            // Variablen deklarieren für DB-zugriff
            private SqlConnection myConnection;
            public SqlCommand myCommand;
            public Form1()
            {
                InitializeComponent();
                // Definition der konkreten DB-Verbindung:
    
                /*  myConnection = new SqlConnection(
                    "workstation id=Environment.MachineName;" +
                    "data source=Environment.MachineName;" +
                    "integrated security=SSPI;" +
                    "initial catalog=Northwind;");
                 */
    
                myConnection = new SqlConnection(
                "data source=localhost;" +
                "Trusted_Connection=yes;" +
                "initial catalog=Northwind;");
                // oder:
                myConnection = new SqlConnection();
                // Zuordnen von Eigenschaften zu dieser connection:
                myConnection.ConnectionString =
                    "data source=localhost;" +
                    "Trusted_Connection=yes;" +
                    "initial catalog=Northwind;";
    
                // Öffnen der DB-Verbindung:
                try
                {
                    myConnection.Open();
                    MessageBox.Show("DB-Verbindung geöffnet");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler" + ex.Message);
                }
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                // Nach erfolgreichem Öffnen Kommandos ausführen:
                // 1. EIN Rückgabewert:
                // Definieren des SQL-Kommandos:
                myCommand = new SqlCommand();
                myCommand.CommandText = 
                    textBox1.Text;
                // Zuordnen des Kommandos zu einer Connection:
                myCommand.Connection = myConnection;
                // Ausführen und Auffangen des Rückgabewertes:
                try
                {
                    int Ergebnis =
                        (int)myCommand.ExecuteScalar();
                    // MessageBox.Show(Ergebnis.ToString());
                    textBox2.Text = Ergebnis.ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler: " + ex.Message);
                }
            }
    
            private void textBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                // Ausführen von Anweisungen OHNE Wertrückgabe
                // (z.B. INSERT, UPDATE, DELETE, CREATE, DROP,
                // ALTER)
                // Dazu eigene DB anlegen:
                // DB_20071205 (mittels SQL-Manager)
                // Öffnen einer Verbindung mit dieser DB:
                // dazu Schließen der Verbindung mit Northwind
                myConnection.Close();
                // Zuweisen des neuen Connection Strings:
                myConnection.ConnectionString =
                     "data source=localhost;" +
                    "Trusted_Connection=yes;" +
                    "initial catalog=DB_20071205;";
                try
                {
                    myConnection.Open();
                    MessageBox.Show("DB-Verbindung geöffnet");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler" + ex.Message);
                }
                // Definieren des SQL-KOmmandos:
                myCommand = new SqlCommand();
                myCommand.CommandText =
                    "INSERT INTO tb_Nikolaus " + 
                    "VALUES('Oma','Zähne',25.10)";
                // Zuordnung des Kommandos zu Connection:
                myCommand.Connection = myConnection;
                try
                {
                    myCommand.CommandText =
                        "DELETE FROM tb_Nikolaus";
                    myCommand.ExecuteNonQuery();
                    myCommand.CommandText = "INSERT INTO tb_Nikolaus " +
                        "VALUES('Oma','Zähne',25.10)";
                    myCommand.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler" + ex.Message);
                }
            }
        }
    }
    
    // Abfrage der DB dann in Form1 in der Textbox1:
    // "Select count (*) from products"
    // ==> dann gibt er in der TextBox2 das Ergebnis 77 aus
    


  • Leider ein ganz schlechtes Beispielprogramm:
    - Connections sollten nur so kurz wie möglich geöffnet werden
    - Der Connection-String sollte nur einmalig verwendet werden (nicht per C&P)
    - Die DB-Objekte sollten (auch im Fehlerfall!) korrekt disposed werden (d.h. am besten Verwendung von using(...))

    Hier nun, wie es (auch nach MS-Richtlinien) korrekt aussehen sollte:

    // ConnectionString ist eine Eigenschaft
    
    using(SqlConnection connection = new SqlConnection(ConnectionString))
        using(SqlCommand command = new SqlCommand(connection))
        {
           connection.Open();
    
           command.CommandText = ...;
    
           command.ExecuteNonQuery();
    
           // wegen dem using wird für 'connection' und 'command' automatisch 'Dispose' aufgerufen (daher braucht man nicht explizit 'Close' aufzurufen)
        }
    


  • hab mir das mal bei MSDN angeschaut und mein Verbindungsaufbau abgeändert. Datenbankverbindung funktioniert auch. SO sollte es besser sein oder?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient; //Bekanntmachung des Namensraums für den SqlClient-Datenprovider
    
    namespace DatenbankMitADO
    {
        public partial class Form1 : Form
        {
            SqlConnection verbindung = null;
            SqlCommand befehl = null;
            SqlConnectionStringBuilder conBuilder = new SqlConnectionStringBuilder();
    
            public Form1()
            {
                InitializeComponent();
    
                conBuilder.DataSource = ".\\SQLExpress";
                conBuilder.IntegratedSecurity = true; //Windows-Anmeldung zur Authentifizierung
                conBuilder.AttachDBFilename = "C:\\Users\\Andreas\\Desktop\\DatenbankProjekt\\DatenbankMitADO\\Database1.mdf";
                conBuilder.UserInstance = true;
    
                using (verbindung = new SqlConnection(conBuilder.ConnectionString))
                {
                    try
                    {
                        verbindung.Open();
                        MessageBox.Show("DB-Verbindung erfolgreich hergestellt");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Fehler: " + ex.Message, "Datenbankfehler");
                    }
                }
            }
    
            private void button1_Click_1(object sender, EventArgs e)
            {
                using (verbindung = new SqlConnection(conBuilder.ConnectionString))
                using (befehl = new SqlCommand(textBox1.Text, verbindung))
                {
                    try
                    {
                        verbindung.Open();
                        textBox2.Text = befehl.ExecuteScalar().ToString();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Fehler: " + ex.Message, "Datenbankfehler");
                    }
                }
            }
    
            private void button2_Click_1(object sender, EventArgs e)
            {
                using (verbindung = new SqlConnection(conBuilder.ConnectionString))
                using (befehl = new SqlCommand(textBox3.Text, verbindung))
                {
                    try
                    {
                        verbindung.Open();
                        befehl.ExecuteNonQuery(); //schickt SQL-Kommando ab
                        MessageBox.Show("Kommando erfolgreich abgeschickt");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Fehler: " + ex.Message, "Datenbankfehler");
                    }
                }
            }
        }
    }
    

Anmelden zum Antworten