none
Custom-Verbindungen im Data Connection UI

    Frage

  • Hallo Leute,

    ich hoffe, ich bin hier im richtigen Forum: Der Code für das Data Connection UI Tool ist ja freigegeben. Ich möchte diesen verwenden, um dem Benutzer eine Möglichkeit zu geben, einen Connection-String zusammen zu stellen.

    Allerdings möchte ich ihm nicht die Standard-Provider vorgeben, sondern diese anzeigen, welche er lokal zur Verfügung hat.

    Diesw kann ich mit der entsprechenden DBProviderFactory rauslesen und auch dem Tool so hinzufügen, allerdings gibt es Probleme beim Detail-Fenster: Diese Controls müsste man ja einzeln zusammen setzen, je nachdem was die Connection untertützt. Dies ist aber durch das dynamische Laden ja nicht möglich.

    Im Visual Studio werden jedoch ja auch alle Connections angezeigt und diese haben die entsprechenden Controls. Daher ist meine Frage: Wie setzt das Visual Studio diese? Da dort ja auch z.B. eine devArt Connection angezeigt wird, muss ja dies auch dynamisch aufgebaut sein.

    Oder gibt es da eine Art globale Konfiguration, wo alle Möglichkeiten gespeichert sind? Falls ja, wo wäre diese resp. kann diese verwendet werden?

    Ich bedanke mich im Voraus für alle Antworten und ein schönes Wochenende

    Müller Matthias

    Freitag, 24. Mai 2013 17:18

Alle Antworten

  • Hallo Matthias,

    ehrlich gesagt hab ich die Frage(n) nicht verstanden.

    Eine Connection hat keine Controls. Man kann über ein Control/Formular Steuerelemente zur Bearbeitung/Angabe der Eigenschaft einer Connection anbieten. Da jeder Provider seine eigenen Eigenschaften hat, kommt man um unterschiedliche Controls je Typ nicht umhin.

    Was Du mit "Controls einzeln zusammensetzen .. ist aber durch das dynamische Laden ja nicht möglich" meinst, versteh ich nicht. Was soll da warum wo nicht gehen?

    Die Provider wie devArt, Connector/NET, ... bieten spezifisch für ihre Verbindungen entsprechende Formulare zum bearbeiten der jeweiligen Eigenschaften. Das ist also nichts, was VS von Haus aus könnte. Diese Sachen sind ja auch erst vorhanden, wenn man die entsprechenden Provider installiert hat.

    Also entweder nutzt Du die jeweiligen Formulare oder Du baust dir eigene. Anders wird es nicht gehen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 24. Mai 2013 17:48
  • Hallo Stefan,

    ich nehme an, wir reden vom selben: Vom zweiten Formular im Connection UI, welches verbindungsspezifische Controls bereit hält.

    Im Code vom ConnectionDialog sehe ich folgenden Abschnitt:

            public static DataProvider SqlCeDataProvider        {            get            {                if (_sqlCeDataProvider == null)                {                    Dictionary<string, string> descriptions = new Dictionary<string, string>();                    descriptions.Add(SqlCeDataSource.Name, Resources.DataProvider_SqlEverywhere_Description);                    Dictionary<string, Type> uiControls = new Dictionary<string, Type>();                    uiControls.Add(String.Empty, typeof(SqlCeConnectionUIControl));

    Wenn ich das also richtig sehe, werden hier die Controls für DIESEN Provider hinzugefügt, nämlich das SQLCeConnectionUIControl.

    Das selbe muss ja auch für bis dato unbekannte Provider passieren, da diese ja dynamisch ausgelesen werden.

    Meine Frage ist daher, wo dies eben geschieht, wenn es kein Standard-Provider ist.

    Danke und schönes Wochenende

    Matthias


    • Bearbeitet DrMueller Samstag, 25. Mai 2013 11:53
    Samstag, 25. Mai 2013 11:53
  • Hallo Matthias,

    ich gehe davon aus Du meinst: Release of Data Connection Dialog Source Code
    Faktisch ist das eher die halbe Miete, siehe DDEX Data Connection UI

    Die Provider wiederum finden sich in der Registry, u. a.: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\<VS_Version>_Config\DataProviders

    Siehe auch: Introduction to Visual Studio Data Designer Extensibility (DDEX)

    Das Nutzen von weiteren Providern scheitert z. B. in den Express-Editionen, da diese nur die Standard-Provider zulassen.

    Gruß Elmar

    Samstag, 25. Mai 2013 12:25
  • Hallo Elmar,

    danke für die Antwort, ich habe mich da etwas reingelesen, allerdings denke ich immer noch, wir reden von verschiedenen Dingen. Ich schreibe am besten meine Anforderung und meinen Denkprozess auf, dann sagt ihr mir, wo ich den Fehler mache:

    Ich möchte dem Benutzer mittels einer Oberfläche die Möglichkeit geben Connectionstrings nach seinen Vorschlägen zusammen zufügen. Als Auswahl sollten die lokal verfügbaren Provider zur Verfügung stehen. Ich wollte zu diesem Zweck das Data Connection Dialog, welches auch im VS Verwendung findet, für diese Anforderung AUSSERHALB von VS verwenden.

    Wenn ich das Data Connection Dialog im VS verwende, erhalte ich bei Custom Providern, z.B. DevArt, folgende Maske:

    Server Explorer --> Data Connections --> Add Connection. In dieser Maske Other --> DotConnect for Oracle --> Continue



    Nun genau diese Funktionalität möchte ich auch ausserhalb. Dazu verwende ich folgenden Code um das Dialog aufzurufen:

            private void ShowCreateConnectionString(DBDataSource ds)
            {
                var dlg = new DataConnectionDialog();
                FillDataProviders(dlg);
    
                if (DataConnectionDialog.Show(dlg) == DialogResult.OK)
                {
                    ds.ConnectionString = dlg.ConnectionString;
                    ds.ProviderName = dlg.SelectedDataProvider.DisplayName;
                }
            }
    
            private void FillDataProviders(DataConnectionDialog dlg)
            {
                DataTable dtTable = DbProviderFactories.GetFactoryClasses();
                var ds = new DataSource("dsLocalConnections", "Local Data Sources");
    
                dtTable.Rows.Cast<DataRow>()
                       .OrderBy(d => d["Name"])
                       .ToList()
                       .ForEach(
                           d =>
                           ds.Providers.Add(new DataProvider(d["InvariantName"].ToString(), d["Name"].ToString(),
                                                             d["Name"].ToString(), d["Description"].ToString())));
    
                dlg.DataSources.Add(ds);
            }
    

    Nun habe ich das gewünschte Fenster, alle lokalen Data-Provider, wenn ich nun jedoch auf Continue klicke, erhalte ich folgendes Fenster:


    Und das war eigentlich meine Frage: Wie löst VS Studio das Problem? Soweit ich sehe benötigt DDEX ja VS, aber ich will ja diese Funktionalität für User ohne VS zur Verfügung stellen.

    Oder ist dies so gar nicht umsetzbar?

    Vielen Dank und einen guten Start in die neue Woche


    Müller Matthias

    PS: Anscheinend ist es mir verboten Bilder hochzuladen, bis mein Konto geprüft wurde. Kann das irgendwie beschleunigt werden resp. muss ich da etwas tun?

    Montag, 27. Mai 2013 07:00
  • Hallo Matthias,

    und ich vermute, Du erhoffst Dir zu viel.

    Der veröffentliche Code beschränkt sich auf den Leistungsumfang der Express Editionen. Bei denen war es nie möglich zusätzliche Provider zu verwenden außer denen die Microsoft zuließ, Access, Sql Server (lokal) und Compact... - was auch so den einen oder anderen geärgert hat ;)

    Visual Studio Professional und höher nutzen die erweiterten Schnittstellen, wie sie der verlinkte Artikel beschreibt. Am Beispiel von SqlCompact (und VS 2012) durchgeprobt:

    Unter HKCU\Software\Microsoft\VisualStudio\11.0_Config\DataProviders\{0CFB2EEB-3E0E-4909-99B7-8AE9E1C3E871} findet man den Eintrag:
    Assembly = Microsoft.VisualStudio.Data.Providers.SqlCompact, Version=4.0.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91

    Die Assembly befindet sich im GAC und schaut man sie sich im Reflector an, so verwendet sie IVsDataConnectionUIControl und als Basis Microsoft.VisualStudio.Data.Framework.dll.Und unterstützt neben den übrigen Verbindungsdialogen einiges mehr.

    Nur: Alle diese Assemblies sind nicht für die Weiterverbreitung freigegeben - womit Du rechtliche Probleme bekämst.

    Andersherum betrachtet:
    Andere Provider könnte man zwar einklinken, wenn sie die "freien" Schnittstellen (IDataConnectionUIControl, IDataConnectionProperties) implementieren, in dem man sie dynamisch lädt - was auch Visual Studio tut.  Aber das hängt wieder von den einzelnen Provider ab. Iich habe hier keine devArt Provider etc. auf dem Rechner, so dass ich das nicht beurteilen kann.

    Und soweit ich den Sourcecode angesehen habe, ist die Funktionalität zum Laden weiterer Provider nicht vorhanden. Ergo müsstest man es selbst implementieren. Auf die Registry-Einträge, die VS verwendet, kann man sich nicht verlassen, wenn es unabhängig davon laufen soll. Einfacher dürfte das sein, eine (XML)-Konfiguration zu verwenden.

    Gruß Elmar

    P. S. Um Dein Konto zu verifizieren verwende: Verify Your Account 2

    • Als Antwort vorgeschlagen Stefan FalzMVP Samstag, 31. August 2013 17:55
    Montag, 27. Mai 2013 17:12