C# OLEDB Acces abfrageproblem

KampfGurke_J

Lieutenant
Registriert
Sep. 2008
Beiträge
820
Hallo ihr Coder,

hab mal wieder ein Problem...
also zum Hintergrund. ich bau ne Filmdatenbank in C# mit OleDbConnection.
dieses projekt is für die Schule.... und ja jetzt hab ich alles eigentlich so weit
hab aber das problem das meine filme nicht alle angezeigt werden.
folgendes ist mein code und die anzeige bis jetzt^^







Code:
private void btnanle_Click(object sender, EventArgs e)
        {
            
           
                m_Db.save("Filme", tbtitel.Text, tberst.Text, tbschausp.Text, tbGenre.Text, tbRegi.Text, tbImdb.Text, rtbbeschr.Text, pbfilm.ImageLocation);
                dataGridView1.DataSource = null;
                m_Db.standanz1("Filme");
                dataGridView1.DataSource = m_Db.m_ds.Tables[0];
                dataGridView1.Columns[0].Visible = false;
                dataGridView1.Columns[8].Visible = false;
                btnanle.Visible = false;
                btnBild.Visible = false;
                btnReset.Visible = false;
                btnanl.Visible = true;
                btnfilbearbeiten.Visible = true;
                btnloesch.Visible = true;
                btnback.Visible = false;
                btnaendern.Visible = false;
                dgfGenre.Visible = false;
                dgfSchausp.Visible = false;
                dgvffregis.Visible = false;
                filmanlegen = false;
          
            
            
        }

Code:
public void save(string tabname, string Titel, string Erstausstrahlung, string Schauspieler, string Genre, string Regiseur, string IMDBRating, string Beschreibung, string bildpfad)
        {

            string strSQL = "Insert into " + tabname + " ([Titel],[Bildpfad],[Erstausstrahlung],[Genre],[Regisseur],[IMDBRating],[Schauspieler],[Beschreibung])  values ('" + Titel + "','" + bildpfad + "','" + Erstausstrahlung + "','" + Genre + "','" + Regiseur + "','" + IMDBRating + "','" + Schauspieler + "','" + Beschreibung + "')";

            OleDbCommand m_cmd = new OleDbCommand(strSQL, m_verb);
            m_cmd.ExecuteNonQuery();
            MessageBox.Show("Film wurde angelet", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }


SQL Befehl der im STrSQL steht:
Code:
SELECT Filme.Nr, Filme.Titel, Filme.Erstausstrahlung, Gerne.Name AS Gerne, Schauspieler.Name AS Schauspieler, Filme.Beschreibung, Regi.Name AS Regisseur, Filme.IMDBRating, Filme.Bildpfad
FROM Schauspieler INNER JOIN (Regi INNER JOIN (Gerne INNER JOIN Filme ON Gerne.Nr=Filme.Genre) ON Regi.Nr=Filme.Regisseur) ON Schauspieler.Nr=Filme.Schauspieler;


könnt ihr mir sagen was ich da falsch mach?
muss dazu sagen ich hab so gut wie keine ahnung von SQL....
 
Habe ich das richtig verstanden das es die Filme nicht ausgibt?
Hat das einen speziellen Grund, dass du soviele INNER JOIN Verknüpfungen reinpackst?

So könnte das alles ja auch leichter funktionieren:
Code:
Select Nachname, Vorname, Geschlecht, Geburtsdatum, Startnummer, Sportclub FROM Teilnehmer GROUP by Nachname, Vorname, Geschlecht, Geburtsdatum, Startnummer, Sportclub

mfg
 
ich hab keine ahnung von SQL
Dann musst du es lernen. Sonst kannst du es ja nicht verwenden. :) Zum Problem: Wenn du Inner Joins verwendest, fällt der Satz weg, falls es den korrespondierenden Satz in der anderen Tabelle nicht gibt oder das Feld in der primären Tabelle NULL ist. Du kannst das schon im Ansatz ersticken, indem du das Feld in der Detailtabelle zu einem Pflichtfeld machst (in Access: Eingabe erforderlich = Ja) und außerdem die referentielle Integrität aktivierst. Letzteres musst du im Datenbankentwurf (IIRC bei "Referenzen"; weiß nicht mehr genau) festlegen.

Sollte das Feld, z.B. der Regisseur (Filme.Regisseur) auch leer bleiben dürfen, dann musst du statt der Inner Joins Left Joins verwenden. Dann ist der Film in der Ergebnismenge enthalten, auch wenn kein Regisseur eingetragen ist. Ich würde den SQL dann auch anders aufbauen. Wenn das Hauptaugenmerk auf Filmen liegt, dann kannst du von der Tabelle "Filme" ausgehend zu allen anderen Tabellen verzweigen.

EDIT: Außerdem kann ich dir nur dringend empfehlen, die Parameters-Eigenschaft des OleDbCommand-Objekts zu verwenden. Das manuelle Zusammengepfrimel des SQLs ist nicht nur nervig. Du musst auch auf die richtige Formatierung, z.B. von Datumswerten, achten. Hinzu kommt, dass du ein Problem bekommst, wenn du innerhalb der einzelnen Strings ein Hochkomma (') stehen hast. Das müsstest du verdoppeln, um einen korrekten SQL zuerhalten. Beispiel: Peter O'Toole. Der SQL würde dann enthalten. .... 'Peter O'Toole' ... Wie du siehst, würde der String dann schon nach dem "O" aufhören. Ein Syntaxfehler ist die Folge. Unter Verwendung der Parameters-Eigenschaft ersparst du dir das alles. Mal ganz zu schweigen vom Thema SQL-Injection (s. Google)
 
Zuletzt bearbeitet: (ergänzt)
Ja wenn du nur anzeigen möchtest kannst du die einfache Select Anweisung nehmen (wie ich oben gepostet habe), da brauchst du keine JOIN Abfragen! Wäre halt die einfachere Methode...

mfg
 
Hallo KampfGurke,

ich hab mir mal erlaubt deinen SQL-Befehl etwas um zu stricken:
Code:
SELECT 
  Filme.Nr,
  Filme.Titel,
  Filme.Erstausstrahlung,
  Filme.Beschreibung,
  Filme.IMDBRating,
  Filme.Bildpfad,
  Genre.Name AS Genre,
  Schauspieler.Name AS Schauspieler, 
  Regi.Name AS Regisseur
FROM Filme
LEFT OUTER JOIN Genre ON Genre.Nr=Filme.Genre
LEFT OUTER JOIN Schauspieler ON Schauspieler.Nr=Filme.Schauspieler
LEFT OUTER JOIN Regi ON Regi.Nr=Filme.Regisseur

So wie ich das sehe ist die Filme Tabelle die zentrale Tabelle um die sich alles dreht, deswegen habe ich die mal als die Haupttabelle in die FROM Klausel gesetzt. Nun zu den JOINS. Es gibt verschieden JOINS womit du Tabellen, Views etc. mit einander verknüpfen kannst. Wenn jetzt aber der entsprechende Eintrag für den Regisseur etc. für den Film fehlt, dann ist ein INNER JOIN nicht richtig, da es ja den Film gibt, aber der Regisseur noch nicht im Programm festgelegt wurde. Der INNER JOIN verlangt aber das für jeden Film auch der Regisseur bereits eingetragen wurde. Deswegen ein OUTER JOIN im speziellen der LEFT OUTER JOIN. Der LEFT OUTER JOIN zeigt alle Filme an, egal ob eine Verknüpfung mit dem Regisseur existiert oder nicht. Gleiches gilt für Genre und Schauspieler. Im übrigen habe ich "Gerne" durch "Genre" ersetzt, weil ich denke das es ein Tippfehler ist, sollte das nicht so sein, kannst du ja wieder "Genre" durch "Gerne" ersetzen.

Viel Erfolg.
Rossibaer
 
hey des umstellen ist super danke bekomme aber in Access leider eine Fehlermeldung
jap gerne war ein Schreibfehler danke :)

Unbenannt.png
 
Dann versuche mal den Fehler etwas einzugrenzen. Ich würde da so vorgehen, dass ich zuerst alle Spalten durch einen einzigen Stern ersetze d.h. statt "SELECT Filme.Nr, Filme.Titel, Filme.Erstausstrahlung, Filme.Beschreibung FROM ...", würde ich "SELECT * FROM ..." schreiben. Diese Abfrage würde ich mal testen und schauen was dabei rauskommt. Ist die Fehlermeldung die gleiche? Wenn ja dann gibts vielleicht ein Problem bei den JOINS. Also die Abfrage (mit Stern) nur ohne die Joins ausführen. Wenn keine Fehlermeldung dann den 1. Join dazu nehmen, wenn keine Fehlermeldung, dann den 2. JOIN dazu usw. Sobald du wieder die Fehlermeldung hast, weißt du welcher Join den Fehler verursacht.

Also viel Erfolg.
 
KampfGurke_J, setze die Joins wie nach folgendem Muster in Klammern:

((t1 left join t2 on ...) left join t3 on ...) left join t4 on ...
 
Zurück
Oben