Laden...

SQL-Query Filter mit Textboxen im Query angeben

Erstellt von myworld vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.223 Views
M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren
SQL-Query Filter mit Textboxen im Query angeben

verwendetes Datenbanksystem: <SQL Server>

Guten Tag,
Ich habe eine Tabelle aus dem SQL Server, indem es ein Datum in dem Format vorliegt : '2016-01-01' und eine Einrichtung in dem Format 9213.


SqlDataAdapter adapter = new SqlDataAdapter("select a.I_FALL, m.CODE, m.ANZ, m.TDAT From test m with (nolock) inner join test2 a with (nolock) on a.aid = m.aid where m.TDAT >= '2016-01-01' and m.Einrichtung= '9213' order by a.I_FALL", "Server = tre; Database = vbn;Trusted_Connection = True");

Ich will statt dem Datum und die Einrichtungszahl indem SQL Code auf zwei TextBoxen hinweisen. In der ersten TextBox will ich das Jahr filtern und in der Zweiten die Einrichtungszahl. Aber leider sind meine Versuche gescheitert die TextBoxen in dem SQL Code aufzurufen, ganzer SQL Code wird rot unterwellt. Kann mir jemand zeigen wie es in den obigen Code aussehen sollte?

Danke!

16.841 Beiträge seit 2008
vor 7 Jahren

Man sollte nicht direkt von der UI auf den Datenbanklayer greifen.
[Artikel] Drei-Schichten-Architektur

Für den SQL Command bitte Parameter nutzen
[Artikelserie] SQL: Parameter von Befehlen

Über die Parameter kannst Du dann auch die Werte übergeben, die zB von einem Methodenkopf kommen.
Schau Dir dazu das Repository Pattern an, das hier gängig ist.
Dem Repository bzw. der Methode des Repositories gibst Du dann die Werte aus den Textboxen.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Danke für die Antwort werde es mir mal anschauen melde mich bei Unklarheiten wieder.

Danke!

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ok habe mir die Links angeschaut helfen tun die mir aber leider nicht. Wenn ich versuche die TextBoxen im SQL Code einzufügen (wie im Link wird alles rot angewellt).Ich will nur wissen wie das im obigen Code ausschauen sollte.

Danke!

16.841 Beiträge seit 2008
vor 7 Jahren

Du hast nach 10 Minuten aufgegeben?
Sorry, ich schreibe Dir Deinen Code nicht. Nicht, wenn Du eigentlich gar nicht wissen willst, wie es funktioniert sondern es nur auf den Präsentierteller haben willst.
[Hinweis] Wie poste ich richtig? Punkt 4.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ich will nur wissen wie das aussieht da muss man nur die TextBox einfügen, das soll mir nur als Vorlage dienen, im Internet wird es so wie in deinem Link angezeigt aber bei mir funktioniert es halt nicht deshalb würde ich gerne wissen wie dass aussieht. Aber auf dem Präsentierteller möchte ich hier gar nichts haben!

Edit : Habe Punkt 4 gelesen, und wo bei dir entsteht jetzt der Eindruck das ich fertige Lösungen haben will ? Ich habe weder mein ganzes Projekt noch mein eigentliches SQL Statement gepostet sondern nu eine Vorlage. Ich will nur wissen wie die Syntax dort aussehen soll denn bei mir funktioniert es nicht.

Danke!

709 Beiträge seit 2008
vor 7 Jahren

Was hast du denn bereits probiert?

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ich habe zum Beispiel das versucht :


SqlDataAdapter adapter = new SqlDataAdapter("select a.I_FALL, m.CODE, m.ANZ, m.TDAT From test m with (nolock) inner join test2 a with (nolock) on a.aid = m.aid where m.TDAT = '" + textBox1.Text + "'"  and m.Einrichtung= '" +textBox2.Text"'"order by a.I_FALL", "Server = tre; Database = vbn;Trusted_Connection = True");

Egal was ich daran ändere es werden mir über 20 Fehler angezeigt zum Beispiel fehlende Klammern und Strichpunkte, deshalb will ich jedeglich wissen was ich genau falsch mache.

Danke!

16.841 Beiträge seit 2008
vor 7 Jahren

Ich hab Dir nicht umsonst [Artikelserie] SQL: Parameter von Befehlen gezeigt.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Und ich habe dir schon mehrmals gesagt das es bei mir rot an gewellt wird!

3.825 Beiträge seit 2006
vor 7 Jahren

Benutze unbedingt die Tipps die Du hier bekommst, auch wenn das etwas länger dauert.

Mit Parametern sieht das SQL-Kommando so aus :

SqlDataAdapter adapter = new SqlDataAdapter("select a.I_FALL, m.CODE, m.ANZ, m.TDAT From test m with (nolock) inner join test2 a with (nolock) on a.aid = m.aid where m.TDAT = @tdat and m.Einrichtung = @einricht order by a.I_FALL", "Server = tre; Database = vbn;Trusted_Connection = True");

Ich hoffe das Datum liegt in der Datenbank im Datetime-Format vor. Wandele den Text aus der Textbox in ein Datetime und übergebe das als Parameter.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Danke für die Antwort aber wie genau übergibt man die TextBoxen an Parameter? Ich habe gerade in der Datenbank nachgeschaut und als Dateientyp wir DATUM8 angegeben ist das denn ein Problem?

Danke!

709 Beiträge seit 2008
vor 7 Jahren

In dem von Abt mehrfach verlinkten Artikel gibt es den Punkt "Problem: Die Zeichenfolge wurde nicht als gültiges DateTime erkannt.".
Dort wirst du fündig.

Edit: Den Hinweis von BerndFfm bzgl. DateTime solltest du berücksichtigen.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ok danke für Eure werde das mal versuchen!

edit: Weiß jemand was der DateiTyp "Datum8" ist ? Kann ich auch damit zu DateTime konvertieren?

edit2: Und ich will nur das jahr filtern tag und Monat interessiert mich nicht muss ich dabei was beachten?

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ok ich habe es jetzt ausprobiert. Wenn ich ein Datum eingebe wird die Datensätze dazu nicht gezeigt was wahrscheinlich daran liegt das der Datentyp Datum8 ist. Aber das ist eigentlich nicht so wichtig denn ich will nur das Jahr filtern was müsste ich dazu ändern?

edit: Der Filter von Einrichtungen hat problemlos funktioniert
Danke!

16.841 Beiträge seit 2008
vor 7 Jahren

Reden wir hier vom Microsoft SQL Server?
Der kann nur vollständige Datumsformate (day, month, year) oder DateTime speichern.
DATUM8 gibts in MSSQL so nicht. Datums- und Uhrzeitdatentypen und zugehörige Funktionen (Transact-SQL) - aber den Link hast Du bei Deiner Recherche nach DATUM8 sicherlich schon gefunden.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ja wir reden hier von einem Microsoft SQL Server. Von Datum8 höre ich zum Ersten mal und im Internet habe ich darüber auch noch nix gefunden also danke für den Link werde in mir mal anschauen.

edit: Wie filtert man den das Jahr aus Datum8? würde das mit der Funktion year gehen wenn ja wie genau?

Danke!

M
184 Beiträge seit 2012
vor 7 Jahren

Ist Datum8 ein benutzerdefinierter Datentyp?
Schau mal im SQL Management Studio nach:
Datenbank > Programmierbarkeit > Typen > Benutzerdefinierte Datentypen
Da müsstest du dann auch den nativen Datentypen dazu finden.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ich arbeite nicht mit SQL Server Mangment Studio das mach ich alles gleich in Visual Studio. Gibt es dort eine Möglichkeit um nach den Datentyp zu sehen?

Danke!

habe mangment Studio doch noch auf mein Pc gefunden. Da steht das der Systemtype ein datetime ist

M
184 Beiträge seit 2012
vor 7 Jahren

Dann kannst du die Abfrage genau so bauen als wäre es eine native datetime-Spalte. (wenn sonst nichts spezielles im Datentyp eingestellt ist)
quasi (ungetestet):

SqlDataAdapter adapter = new SqlDataAdapter("select a.I_FALL, m.CODE, m.ANZ, m.TDAT From test m with (nolock) inner join test2 a with (nolock) on a.aid = m.aid where year(m.TDAT) = @jahr and m.Einrichtung = @einricht order by a.I_FALL", "Server = tre; Database = vbn;Trusted_Connection = True");

Dem Parameter @jahr weist du dann einen Wert von Typ int zu.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

danke werde es gleich versuchen.

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Ok es hat geklappt aber ein kleines Problem gibt es noch und zwar kommen erst die die Datensätze wenn die Einrichtung das Jahr eingegeben worden sind. Ich hätte aber gerne auch das wenn ich nur die Einrichtung eingebe das alle Jahre diese Einrichtung aufgelistet werden und umgekehrt. Liegt es vielleicht am and im SQL Statement? Was müsste ich da genau ändern?

Danke!

M
myworld Themenstarter:in
41 Beiträge seit 2013
vor 7 Jahren

Nein geht leider nicht. Kommt immer eine Fehlermeldung wegen der Syntax weiß nicht genau ob ich das jetzt richtig eingefügt habe, habe es einmal nach dem and einmal davor und einmal statt dem and gemacht. Kommt aber immer ein Fehler.

1.040 Beiträge seit 2007
vor 7 Jahren

Dann zeig doch mal die Fehlermeldung bzw. dein Statement...