Announcement

Collapse
No announcement yet.

String + String

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • String + String

    Hallo Leute,

    ich hab hier ein kleines Problem.

    Ich hab ein Projekt von einem Kollegen übernommen. Das Projekt hat bis jetzt nur mit MS-SQL funktioniert und ich soll es jetzt um mySQL erweitern.

    Einen großen Teil hab ich schon hin bekommen. Das Problem ist, dass ich eine DLL habe, in der die ganzen SQL-Statements sind z.B:

    Code:
    public function GetKunde as string
         return "SELECT LTRIM(Vorname + ' ' + Nachname) FROM Kunden"
    end function
    Das Problem ist jetzt, ich hab in dieser DLL ca. 500 SQL Statements. Die kann ich unmöglich alle ändern, nochdazu soll die Funktionalität für den MS-SQLServer bestehen bleiben.

    Mein Problem ist, dass ich Statements wie beschrieben habe, diese aber der mySQL-Server nicht so versteht, wie ich es gerne hätte. Das Ergebnis sollte sein:

    Vorname Nachname

    Ich weiß, bei mySQL gibt es CONCAT, aber das hilft mir nicht viel, denn wie gesagt, ich kann die Statements nicht ändern.

    Bei verschiedenen Sachen hab ich es einfach so gemacht (z. B. ISNULL):

    myCommand = GetIrgendwas.Replace("ISNULL", "IFNULL")

    Das funktioniert auch ganz gut, nur eben bei Stringverknüpfungen kann ich es nicht machen, da ich keine Regelmäßigkeit hab.

    Danke schon mal, Markus

  • #2
    Statements in DLL ausgelagert? Vermutlich auch noch keine verwendung von parametrisierten Abfragen (Sicherheitslücke!)?

    Schau dir mal das Bridge-Pattern an? Mit diesem kann man sehr gut eine DB-Zugriff für unterschiedliche DBMS realisieren der auch noch pfleg und wartbar ist.

    Mit welcher Programmiersprache/IDE arbeitest du denn?

    Comment


    • #3
      Naja, das Problem ist, dass diese DLL als Schnittstelle für mehrere Programme funktioniert. Die Sicherheits-Sache wurde anders gelöst, aber um das gehts nicht.

      Ich arbeite mit VB .NET 2008.

      Das Problem, das ich auch noch irgendwo seh ist, wenn die DLL erweitert werden soll ... ich kann nicht jede Abfrage 2, 3 oder vielleicht 4 mal (wer weiß welche Datenbanken noch dazu kommen ...) schreiben. Da sind Fehler vorprogrammiert.

      Das "Bridge-Pattern" sagt mir jetzt mal garnix ;o)

      Comment


      • #4
        Bridge-Pattern.

        Für VB.NET schau dir doch mal die möglichkeiten des ADO.NET Entity Frameworks oder N/Hibernate an.

        Comment


        • #5
          Ok, das schaut ja alles nicht schlecht aus, aber leider hab ich nicht die Zeit, mein komplettes Programm umzureißen.
          Ich muss es für einen Kundenauftrag anpassen und hätte auf eine schnelle Lösung gehofft. Wie das ganze dann weiter läuft weiß ich noch nicht. Irgendwass muss ich mir da sowieso einfallen lassen.

          Gibt es eine Möglichkeit, Strings so zu verketten (mit +) z. B. über ein Stored Procedure?

          Comment


          • #6
            Hallo,

            wenn man die MySQL-DB im ANSI-Mode betreibt, liese sich statt des + der Verkettungsoperator || nutzen.

            [highlight=sql]
            set sql_mode='ansi';
            select 'Falk' || ' ' || 'Prüfer' Name;
            [/highlight]

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo Falk,

              danke für Deine Antwort.

              Leider hilft mir das auch nicht wirklich viel.
              Ich könnte zwar das + durch || ersetzen, aber was mache ich wenn in irgend einem SQL-Statement gerechnet wird?

              Comment


              • #8
                Hallo Gironymo,
                Originally posted by Gironymo View Post
                ...Das Problem ist jetzt, ich hab in dieser DLL ca. 500 SQL Statements. Die kann ich unmöglich alle ändern, nochdazu soll die Funktionalität für den MS-SQLServer bestehen bleiben.
                Originally posted by Gironymo View Post
                ... ich kann nicht jede Abfrage 2, 3 oder vielleicht 4 mal (wer weiß welche Datenbanken noch dazu kommen ...) schreiben.
                Originally posted by Gironymo View Post
                Ok, das schaut ja alles nicht schlecht aus, aber leider hab ich nicht die Zeit, mein komplettes Programm umzureißen.
                Um all die Dinge wirst du mittelfristig nicht herumkommen und du wirst genau diese Dinge tun müssen wenn dein Prog verschiedene DBMS unterstützen soll. Wenn die momentan verwendete Syntax stark auf den MSSQL zugeschnitten ist, dann wird das "+" noch dein kleinstes Problem sein

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Ok, soweit so schlecht ...

                  und wie würdet ihr das lösen? ich mein, eine schnittstelle ist ja was feines, aber erst mal eine schnittstelle für 1000 funktionen und so zu bauen is ja die eine sache, aber dann jedes statement für jeden server extra zu schreiben? das ist ein enormer aufwand und da red ich noch nicht mal von der entwicklung. denkt doch mal an die tests. wenn ich eine neue abfrage einbaue muss ich jeden test zwei, drei, vier mal machen ...

                  irgendwie seh ich da nicht wirklich ein licht am ende des tunnels ... obwohl ich im moment in der stimmung wäre drauf zu zu gehen

                  ok, mal angenommen, ich bau alles sql-statements um. wie könnte ich das machen, dass ich die nur ein mal schreiben muss und nicht einmal für sql, ein mal für mysql, ein mal für oracle ...

                  oder eine andere frage ... der kunde braucht eine datenbank, die auf einem linux-rechner läuft. gibt es eine datenbank für linux die zu ms-sql kompatibel ist? es geh mir in erster linie um die sql-statements. die stored procedures sind mir egal ... die hau ich sowieso bald mal raus das klump

                  markus

                  Comment


                  • #10
                    Lösungen wurde doch schon gesagt: Bridge-Pattern/Frameworks.

                    Dort schreibst du nur noch in der Art:

                    Code:
                    GetRecords(tabelle, Felder, WhereFelder, WhereFelderWerte)
                    und auf unterer Ebene werden die SQL-Unterschiede gehandhabt. Frameworks wie N/Hibernate haben auch möglichkeiten JOINS so zu formulieren das du dir auf oberer Ebene keine gedanken machen must ob du nun JOIN/LEFT/RIGHT/... oder per WHERE ... = ... die verknüpfung machen musst.

                    Comment


                    • #11
                      Ok, ich bin aber mit der Antwort immer noch nicht recht glücklich ... wahrscheinlich wird auf Dauer auch kein Weg an so einer Lösung vorbei führen, aber jetzt für den Moment passt das nicht ...

                      Gibt es denn einen fertigen Parser für SQL-mySQL?

                      Oder die Frage nochmal: gibt es eine Datenbank, dere SQL-Statemant kompatible zu der des MS-SQL-Servers ist und die auf Linux läuft?

                      Comment


                      • #12
                        Die Grundlage von TSQL ist SyBase diese gibt es auch für Linux.
                        Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

                        Comment


                        • #13
                          Also, Sybase schaut nicht so schlecht aus ... nur funktioniert irgendwie der Zugriff über ODBC oder OLEDB nicht. Auch nicht über Sybase ADO ...
                          Über Sybase-Central funktionierts. Hat jemand da eine Idee zu?

                          Danke

                          Comment

                          Working...
                          X