Zum Inhalt springen

[VB.Net] SQL-Abfrage über mehrere Tabellen


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe folgende Abfrage gebastelt.

SELECT (UNTERNEHMEN.FIRMA1), (UNTERNEHMEN.FIRMA2), (UNTERNEHMEN.STRASSE), (UNTERNEHMEN.LKZ), (UNTERNEHMEN.PLZ), (UNTERNEHMEN.ORT), (PERSONEN.ANREDE), (PERSONEN.TITEL), (PERSONEN.VORNAME), (PERSONEN.NACHNAME), (PERSONEN.EMAIL_GESCHAEFTLICH1), (PERSONEN.TELEFON_GESCHAEFTLICH1), (PERSONEN.TELEFAX_GESCHAEFTLICH1) FROM (UNTERNEHMEN) INNER JOIN ((PERSONEN) INNER JOIN ((MEDIEN) INNER JOIN (BEZIEHUNGEN) ON (MEDIEN.MEDIUM_ID) = (BEZIEHUNGEN.MEDIUM_ID_1)) ON (PERSONEN.PERSON_ID) = (BEZIEHUNGEN.PERSON_ID_1)) ON (UNTERNEHMEN.UN_ID) = (BEZIEHUNGEN.UN_ID_1) WHERE(((BEZIEHUNGEN.KUNDE_ID_1) = 730) And ((BEZIEHUNGEN.BEZIEHUNGSTYP_ID) = 4) And ((MEDIEN.MEDIUM_ID) = 4393 ) And ((BEZIEHUNGEN.FUNKTION_ID_1) = 1) AND ((PERSONEN.AUSGESCHIEDEN) = 0)) GROUP BY (UNTERNEHMEN.FIRMA1), (UNTERNEHMEN.FIRMA2), (UNTERNEHMEN.STRASSE), (UNTERNEHMEN.LKZ), (UNTERNEHMEN.PLZ), (UNTERNEHMEN.ORT), (PERSONEN.ANREDE), (PERSONEN.TITEL), (PERSONEN.VORNAME), (PERSONEN.NACHNAME), (PERSONEN.EMAIL_GESCHAEFTLICH1), (PERSONEN.TELEFON_GESCHAEFTLICH1), (PERSONEN.TELEFAX_GESCHAEFTLICH1)

Wenn ich diese Im SQL-Server-Query-Analyzer ausführe, bekomme ich auch meine Ergebnisse. Wenn ich sie im VB-Code ausführen möchte, bekomme ich die Fehlermeldung

Ungültiger Objektname 'UNTERNEHMEN'. Ungültiger Objektname 'PERSONEN'. Ungültiger Objektname 'MEDIEN'. Ungültiger Objektname 'BEZIEHUNGEN'.

Kann mir jemand sagen, wo der Fehler liegt?

Gruß

Christian

Geschrieben

con.Open()

Dim sSQLDUP As String = "SELECT (UNTERNEHMEN.FIRMA1), (UNTERNEHMEN.FIRMA2), (UNTERNEHMEN.STRASSE), (UNTERNEHMEN.LKZ), (UNTERNEHMEN.PLZ), (UNTERNEHMEN.ORT), (PERSONEN.ANREDE), (PERSONEN.TITEL), (PERSONEN.VORNAME), (PERSONEN.NACHNAME), (PERSONEN.EMAIL_GESCHAEFTLICH1), (PERSONEN.TELEFON_GESCHAEFTLICH1), (PERSONEN.TELEFAX_GESCHAEFTLICH1) " & _

"FROM UNTERNEHMEN INNER JOIN (PERSONEN INNER JOIN (MEDIEN INNER JOIN BEZIEHUNGEN ON (MEDIEN.MEDIUM_ID) = (BEZIEHUNGEN.MEDIUM_ID_1)) ON (PERSONEN.PERSON_ID) = (BEZIEHUNGEN.PERSON_ID_1)) ON (UNTERNEHMEN.UN_ID) = (BEZIEHUNGEN.UN_ID_1) " & _

"WHERE(((BEZIEHUNGEN.KUNDE_ID_1) = " & frmHaupt.KID & ") And ((BEZIEHUNGEN.BEZIEHUNGSTYP_ID) = 4) And ((MEDIEN.MEDIUM_ID) = " & MedienID & " ) And ((BEZIEHUNGEN.FUNKTION_ID_1) = 1) AND ((PERSONEN.AUSGESCHIEDEN) = 0)) " & _

"GROUP BY (UNTERNEHMEN.FIRMA1), (UNTERNEHMEN.FIRMA2), (UNTERNEHMEN.STRASSE), (UNTERNEHMEN.LKZ), (UNTERNEHMEN.PLZ), (UNTERNEHMEN.ORT), (PERSONEN.ANREDE), (PERSONEN.TITEL), (PERSONEN.VORNAME), (PERSONEN.NACHNAME), (PERSONEN.EMAIL_GESCHAEFTLICH1), (PERSONEN.TELEFON_GESCHAEFTLICH1), (PERSONEN.TELEFAX_GESCHAEFTLICH1)"

Dim DRDUP_KuAP As DbDataReader

Dim SQLDUP_KuAP As New SqlCommand(sSQLDUP, con)

DRDUP_KuAP = SQLDUP_KuAP.ExecuteReader

Das ist der Code wo es ausgeführt wird. Danach werden die einzelnen Werte an Variablen übergeben, welche für die weitere Arbeit verwendet werden.

Geschrieben

Vermutlich gehst du mit einem anderen User auf den Server oder hast eine andere Datenbank im Connection-String, dann stimmen die Schema-Informationen nicht mehr.

Zudem (ich habe da durchaus missionarische Ansprüche) ist es eine schlechte Vorgehensweise das SQL Command auf diese Weise in den Code zu kneten, das wird irgendwann unwartbar. Besser ist es so ,funktioniert unter VB.NET genau so.

Geschrieben

Wow da vergeht einem ja die Lust die Querry zu analysieren. Versuchs mal mit einer anderen, angenehmeren Formatierung.

Kleiner Hinweis zu SQL. SQL hat gerne mal die Eigenschaft Spaltennamen die schon belegt sind oder umlaute oder sonstiges enthalten, umzubennen. Sprich der SQL server macht in solchen Fällen zwei eckige Klammern um den Namen, was man oft nicht gleich merkt.

Geh einfach mal in den Serverexplorer und schau dir mal die Spalten an. Spätestens dann siehst du ob es daran gelegen hat.

Lg

Gateway

Geschrieben

Dim sSQLDUP As String =

"SELECT [uNTERNEHMEN].[FIRMA1],

[uNTERNEHMEN].[FIRMA2],

[uNTERNEHMEN].[sTRASSE],

[uNTERNEHMEN].[LKZ],

[uNTERNEHMEN].[PLZ],

[uNTERNEHMEN].[ORT],

[PERSONEN].[ANREDE],

[PERSONEN].[TITEL],

[PERSONEN].[VORNAME],

[PERSONEN].[NACHNAME],

[PERSONEN].[email_GESCHAEFTLICH1],

[PERSONEN].[TELEFON_GESCHAEFTLICH1],

[PERSONEN].[TELEFAX_GESCHAEFTLICH1]

" & _

"FROM UNTERNEHMEN INNER JOIN

(PERSONEN INNER JOIN

(MEDIEN INNER JOIN BEZIEHUNGEN ON

[MEDIEN].[MEDIUM_ID] = [bEZIEHUNGEN].[MEDIUM_ID_1]) ON [PERSONEN.PERSON_ID] = [bEZIEHUNGEN.PERSON_ID_1]) ON [uNTERNEHMEN.UN_ID] = [bEZIEHUNGEN.UN_ID_1]

" & _

"WHERE(([bEZIEHUNGEN].[KUNDE_ID_1] = " & frmHaupt.KID & ")

And ([bEZIEHUNGEN].[bEZIEHUNGSTYP_ID] = 4) And

([MEDIEN].[MEDIUM_ID] = " & MedienID & " )

And ([bEZIEHUNGEN].[FUNKTION_ID_1] = 1)

AND ([PERSONEN].[AUSGESCHIEDEN] = 0)) "

& _

"GROUP BY [uNTERNEHMEN].[FIRMA1],

[uNTERNEHMEN].[FIRMA2],

[uNTERNEHMEN].[sTRASSE],

[uNTERNEHMEN].[LKZ],

[uNTERNEHMEN].[PLZ],

[uNTERNEHMEN].[ORT],

[PERSONEN].[ANREDE],

[PERSONEN].[TITEL],

[PERSONEN].[VORNAME],

[PERSONEN].[NACHNAME],

[PERSONEN].[email_GESCHAEFTLICH1],

[PERSONEN].[TELEFON_GESCHAEFTLICH1],

[PERSONEN].[TELEFAX_GESCHAEFTLICH1]"

Hoffe es ist nun leichter zu lesen. Ich habe es nun mit den eckigen-Klammer versucht, bekomme aber die gleiche Fehlermeldung.

Geschrieben

" gilt nur für eine Zeile.

Ergo:

Dim sSQLDUP As String = _

"SELECT [UNTERNEHMEN].[FIRMA1], " & _

"[UNTERNEHMEN].[FIRMA2], " & _

"[UNTERNEHMEN].[STRASSE], " & _

"[UNTERNEHMEN].[LKZ], " & _

"[UNTERNEHMEN].[PLZ], " & _

"[UNTERNEHMEN].[ORT], " & _

"[PERSONEN].[ANREDE], " & _

"[PERSONEN].[TITEL], " & _

"[PERSONEN].[VORNAME], " & _

"[PERSONEN].[NACHNAME], " & _

"[PERSONEN].[EMAIL_GESCHAEFTLICH1], " & _

"[PERSONEN].[TELEFON_GESCHAEFTLICH1], " & _

"[PERSONEN].[TELEFAX_GESCHAEFTLICH1] " & _

usw.

[Editerle]

Probiers mal mit StoredProcedures + Parameter sonst kommt noch jemand auf die Idee SQL-Injektion zu betreiben. :floet:

Geschrieben (bearbeitet)

Ok, das ist soweit ichs seh kein .Net Fehler (dein Programm das de da schreibst), das ist SQL Fehler.

Also, was haben wir da an Fehlerquellen, wenns im SQL Managmentstudio tut, ich würd sagen der Connection String, da der nicht gepostet wurd, und wir auch nicht wissen wie was wo die DB aussieht, kann mans nicht beschreien.

Aber, eines is recht offensichtlich, deine Tabellen werden nicht gefunden.

Mach mal folgendes, statt im From Teil deiner Abfrage nur den Tabellennamen zu schreiben, nimm da mal den DB namen mit.

Also im Sinne von

SELECT *

FROM meineDB.dbo.Tabelle1

Das schadet nie wenn man sagen mer mal die ausführliche Schreibweise benutzt, gibt ja Aliase damit man sich nich tot schreibt dran.

Und mhhm, so n bissl einrücken tut auch SQL sehr gut wenn mans hinterher lesen können will.

Zusätzlich würd ich mal n paar Aliase vergeben, und nicht Klammern setzen damit Klammern gesetzt sind, sonder nur da Klammern, wo man ne Klammer semantisch auch braucht.

Gruß

Sven

Bearbeitet von streffin

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...