Brauche Hilfe beim Vergleich von Strings (auch mit Wildcard)
-
Hi,
also ich hab eine SQL-Server-Datenbank, in die ich beim Start meines Programms bestimmte URLs schreibe, wie z.B. eben http://www.google.de
Wenn eine Website in meinem Webbrower-Control aufgerufen wird, will ich überprüfen, ob die aufgerufene Seite in meiner Datenbank steht oder nicht.
Wenn nicht, dann wird automatisch die Startseite aufgerufen.Hab es bis jetzt so:
SQLComm = new SqlCommand("SELECT * FROM MyDB..MyTable", SQLConnect); SQLConnect.Open(); SqlDataReader SQLReader = SQLComm.ExecuteReader(); while (SQLReader.Read()) URLList.Add(SQLReader[0].ToString()); ... if (SQLConnect.State == System.Data.ConnectionState.Open) SQLConnect.Close();
URLList ist eine List<String>.
Nur fehlt mir jetzt eine Idee, wie ich in meiner Funktion den übergebenen Parameter mit den Einträgen in der List vergleichen kann.
Das Problem dabei ist, dass ja auch Links mit enthaltenem Wildcard (, also z.B. http://www.google.) in der Datenbank stehen können.Wenn also z.B. http://www.google.* in der Tabelle steht, sind also logischerweise alle Links, die bis zum Stern mit dem Eintrag übereinstimmen, erlaubt.
Nur hab ich keinen so richtigen Plan, wie ich das umsetzen kann.
Wie kann ich sowas am besten lösen bzw. welche Wege fallen euch noch so ein (Ideen) ??Ich bedanke mich schonmal für die Unterstützung.
-
Moin,
erstmal etwas zu deiner Gestaltung der SQLConnection.
Besser wäre das using-Idiom zu nutzen als den State zu überprüfen,ungefähr so:using(SqlConnection con = new SqlConnection("...")) { //dein Zeug }
Dann sparst du dir das geprüfe auf den Status der Connection und der using-Block kümmert sich um das schließen.
Mach das am besten immer dann wenn eine Klasse IDisposable implementiert.So nun zum eigentlichen. Ich würd dir empfehlen da mit Regex ranzugehen, da kannst auch die Wildcards als prüfkriterium mit einbeziehen.
-
Hi,
danke erstmal für die Antwort.Ok werde das mit using so umsetzen, hast Recht.
Habe auch schon an Regex gedacht. Stimmt natürlich, werde es dann gleich mal probiern und mich später nochmal melden.
-
Wenn es tatsächlich URLs sind, dann könntest Du diese Parsen und zum Beispiel die top level domain und domain in explizit speichern. Das sollte schon mal ein guter Vorfilter sein. google.* führt dann zum beispiel zu der Abfrage
Select * from URLs where domain='google', oder "google.de" zu
Select * from URLs where domain='google' and tld='de'Danach kannst Du mit regulären Ausdrücken weitermachen. Ansonsten könnte es schnell zu Performance-Problemen führen.
-
Hi,
also hab das mit dem using-Statement umgesetzt und noch eine Frage dazu:
Wenn innerhalb von using eine Exception auftritt, wird dann trotzdem die Verbindung zum SQL Server getrennt und das Objekt zerstört ?Und habe das mit RegEx gelöst ! Hier mal die komplette Methode:
public bool CheckLink(string LinkToCheck) { if (!LinkToCheck.StartsWith("http://") && !LinkToCheck.StartsWith("https://") && !LinkToCheck.StartsWith("ftp://")) return false; bool success = false; List<String> URLList = new List<String>(); try { using (SqlConnection SQLConnect = new SqlConnection(SQLConnectionString)) { SQLComm = new SqlCommand("SELECT * FROM MyDB..MyTable", SQLConnect); SQLConnect.Open(); SqlDataReader SQLReader = SQLComm.ExecuteReader(); while (SQLReader.Read()) URLList.Add(SQLReader[0].ToString()); for (int i = 0; i < URLList.Count; i++) { // übergebener Parameter wird mit Einträgen in Datenbank geprüft... if (Regex.IsMatch(LinkToCheck, URLList[i])) { success = true; break; } else success = false; } } } catch (SqlException sqlEx) { MessageBox.Show(sqlEx.Message); } catch (Exception e) { MessageBox.Show(e.Message); } return success; }
Funktioniert auch, habe bloß gestern den Search-String und das Pattern bei Regex im Prinzip verdreht gehabt.
Kaann man das hier so lassen oder gibts noch etwas daran zu verbessern ? Mir gefällt ncith das Lesen aus der Datenbank und das anschließende Vergleichen.
Ich muss ja auch beachten, dass die Methode hier ziemlich oft aufgerufen wird.Vielleicht kann man daran noch was verbessern, werde ansonsten mal den Profiler drüberjagen.
PS: Die Sache hier mit dem using entspricht dann RAII ??
-
Sieht doch gut aus.
also hab das mit dem using-Statement umgesetzt und noch eine Frage dazu: Wenn innerhalb von using eine Exception auftritt, wird dann trotzdem die Verbindung zum SQL Server getrennt und das Objekt zerstört ?
Ja, dass ist ja das gute an der Sache.Es wird immer garantiert das die unmanaged Ressourcen wieder freigegeben werden. Der using-Block wird intern eh in einen try-finally block umgewandelt.
Was mir noch auffällt.Der SqlDataReader implementiert doch auch das IDisposable Interface, also gehört er auch in einen using-Block.MERKEN: Alles was IDisposable implementiert kommt in den using-Block.
-
Ok danke.
Stimmt, hab den SQLReader total übersehen.
Gut, werd mir merken, dass alles, was IDisposable implementiert, in ein using-Statement gehört.Werde noch ein paar kleine Optimierungen vornehmen.
Vielen Dank für die Hilfe !!!
-