Laden...

Forenbeiträge von Madleen Ingesamt 35 Beiträge

07.08.2014 - 11:33 Uhr

Okay,
hat sich erledigt.

Ich denke einfach noch zu sehr in relationalen Datenbanken und zu wenig in Objekten 😭

07.08.2014 - 11:06 Uhr

@witte
In den Naviagtionspropertys stehen nur die Tabellen, an die die Tabellen halt angebunden sind.

Ahh ich seh schon.
Okay, dann muss ich noch herausfinden wie ich die anpacken kann 😃

07.08.2014 - 11:04 Uhr

Huhu,
also das die Tabelle in der DB vorhanden ist, ist ja klar, da hab ich ja das Model her 😃

Die Frage ist, wie komme ich denn an die Daten in der Tabelle ran?
Ich verstehs nicht so recht.

Also muss ich jetzt quasi manuell noch einmal eine Klasse für die Tabelle erstellen, und diese dann mit den Daten aus der db befüllen, damit ich Zugriff auf die Verknüpfung habe?

07.08.2014 - 10:44 Uhr

SQL Server 2012

Guten Morgen,
ich bin gerade auf ein Problem gestoßen, nachdem ich nicht so recht googln kann, weil ich nicht genau weiss wonach ich da suchen muss.
Mir fällt einfach nichts ein.

Wie dem auch sei, das Problem:
Ich hole mir Daten aus einer FoxProDB, passe diese an, und Speichere die in unserem SQL Server ab.
Das machte bisher auch keine Probleme, da wir eigentlich nie n:m Beziehungen hatten(und ich somit auch nicht wusste das dies mir Probleme bereiten wird 😃 ).
So, nun aber bin ich auf eine gestoßen und ich weiss nicht genau wie ich damit umgehen soll.

Im SQL Server wäre das ja kein Problem, da hat man die Hilfstabelle und werkelt damit rum.
Im Enitity Framework hab ich diese Tabelle aber nichtmehr?!?!

Was mir Probleme bereitet:
Ich lade mir Pakete von 50k Datensaetze aus den FoxPro Daten, und gehe die einzeln durch.
So, jetzt habe ich die Tabelle **Postleitzahl **(wobei diese nur aus der Postleitzahl besteht und dies auch der Schluessel ist), diese ist per n:m Beziehung mit Orte Verknüpft, wobei ich hier den Ortsnamen, ein paar unwichtige andere Felder und die OrtsID habe.

Also sind die Postleitzahl und die OrtsID in der Hilfstabelle drinne und stellen die m:n Beziehung dar.
Das so abzuspeichern mit den zugehörigen usw ist kein Problem, das nimmt mir das EF ja ab.

Aber:
Ich will vorher prüfen ob der Ort bereits vorhanden ist.
Dazu muss ich auf den Ortsnamen und die dazugehörige Postleitzahl prüfen.
Doch wie stelle ich das an?
Ich habe ja im EF nicht die Zusatztabelle?!?!
(Zumal der Ort ja quasi noch garnicht in der Tabelle vorhanden ist, da ich ja erstmal prüfen will ob es den schon gibt, und somit noch keine ID hat)

Also im Prinzip bräuchte ich sowas:
Finde Ortsnamen in Ortetabelle, nimm zu jedem gefundenen Ortsnamen die Plz und vergleiche den momentanen Datensatz ob es bei eine in Bezug übereinstimmung in Bezug auf Ortsname und Plz gibt.

Eigentlich kein Problem, aber wie gesagt, ich weiss irgendwie nicht so recht wie ich damit umgehen soll das im EF die Tabelle nicht vorhanden ist 😭

Ich hoffe ich konnte das halbwegs verständlich erklären.

09.07.2014 - 10:30 Uhr

Hi, du musst dann die Margin Eigeneschaft nutzen um den Button innerhalb des Panels zu verschieben 😃

09.07.2014 - 10:07 Uhr

Huhu,
Nach längerem krank sein bin ich nun wieder am werkeln.

Das Fensterproblem ist nun gelöst, durch die neustrukturierung meines Projektes ;D
(und dann wie schon jemand erwähnte einfach mit X.Show(), was ja nun möglich ist. Man kann es sich halt auch unnötig schwer machen)

Ich hätte da dennoch noch 2 Fragen:

  1. Tastendrücke usw. für das MainWindow() (sowas wie Escape und Hotkeys), kann man die auch im Codebehind machen? Sind ja dann immer nur 2 Zeiler und so, oder sollte das auch ins ViewModel mit rein?
  2. @ Coffeebean
    Ich versuche gerade dein gepostetes Beispiel für die Fassade auf meine Commands anzuwenden, aber irgendwie versteh ich nicht so recht wie ich das in dem Falle machen soll.
    Kannst du mir da ein wenig weiter helfen?

Bei dem Beispiel ist das ja noch recht verständlich, nur rufe ich ja bei mir ein Execute auf und weiss nicht so recht wie ich das anstellen soll.

So in etwa sieht das dann für nen Insert aus:

 //----------------------------------- insert -------------------------------------------- 

        private ICommand insertcommand;

        public ICommand Insertcommand
        {
            get
            {
                if (insertcommand == null)
                {
                    insertcommand = new RelayCommand(p => ExecuteInsertcommand());
                }
                return insertcommand;
            }
        }

        private void ExecuteInsertcommand()
        {
            if(textboxenaktiv == false)
            {
                textboxen_einschalten();
                return;
            }
            Querys query = new Querys();
            Eingaben_prüfen p = new Eingaben_prüfen();
            var insert = query.insert_into_p(StringNull(Nachname), StringNull(Vorname), StringNull(Anrede), StringNull(Titel), StringNull(Versichertennummer), StringNull(Versichertenstatus),
                                StringNull(Kostentraegerlk), Geburtsdatum);
            query.insert_into_a(StringNull(Strasse), StringNull(Plz), insert);

            ExecuteSearchcommand();
        }

        // Eingaben prüfen, falls Null --> "-" setzen
       private string StringNull(string test)
        {
            if (test == "" || test == null)
                return "-";          
            else
                return test;
        }

Wenn ich da das Executecommand z.B. auslagere, dann entstehen Fehler und der Button ist ja ans Insertcommand gebunden, das muss ja dann im ViewModel bleiben?!
Irgendwie verwirrt mich das etwas, aber falls du kurz Zeit hast und mir da nochmal helfen könntest wäre das fein 😃

Tüdelü

04.07.2014 - 06:58 Uhr

Huhuuu Th69,
ich werd mich gleich nochmal dran versuchen.
Es hat mich halt abgeschreckt weil es so komplex war und ich nichts verstanden hab, aber naja, dann sehe ich das mal als Blackbox an 😃

@Coffebean
Ich hab mir zumindest mal dieses ominoese WAF angeschaut, aber irgendwie findet man dazu wirklich nur sehr spährlich informationen.
Naja, ich denke heute werde ich noch etwas Zeit haben mir dann Caliburn mal etwas näher betrachten.
Und okay, das wusste ich nicht.
Ich dachte das muss alles strikt und fein säuberlich in verschiedenen Projekten gelagert sein.
Ich werde mir nochmal den Link den du geposted hast durchlesen.

Danke euch schonmal, ich meld mich dann vermutlich später nochmal.

03.07.2014 - 13:25 Uhr

Huhuuuu,
mhm , ganz einfach daran, das ich so ja das Fenster nicht aufrufen kann 😦

Also das Projekt sieht ja wie folgt aus:

DBSchicht --> Klassenbibliothek mit den ganzen Abfragen
Model --> MIt den dazugehörigen Klassen
Startapplikation
View --> 2 Views drinne, einmal das Hauptfenster und dann das andere Fenster, das beim Klick geöffnet werden soll
Viewmodel --> Klassenbibliothek mit dem Viewmodel
Und halt die ViewModelBase

Das ViewModel weiss ja nichts über die View und so, drum kann ich ja nicht window.show() verwenden?

Daher dann wohl auch immer diese riiiiesen Beispiele die ich halt nicht nachvollziehen kann, scheinbar weils ja nicht einfach so geht 😦

Verstehst du was ich meine?
Und danke, das du dir soviel Zeit nimmst.

03.07.2014 - 12:44 Uhr

Hey Th69,
ich hab mich mal an dem Artikel versucht, aber ich muss ehrlich zugeben, das ich den Artikel kaum verstehe und er mir daher nicht wirklich weiterhilft 😭
Ich kann überhaupt nicht nachvollziehen (da mein wissen doch noch etwas zu gering für solch komplexe sachen ist) was da passiert in den Klassen bzw. dem Interface und allgemein wo dinge wie:
IFolderBrowserDialog oder IWindowViewModelMappings herkommen und so.

Hach, ist das frustrierend wenn eigentlich alles fertig ist und es an sowas harpert.
Ich hätte auch nicht gedacht das es so umständlich ist ein anderes Fenster zu öffnen?!
Also falls da noch wer ein paar gescheite hilfestellungen hat, ich freue mich darüber 😃
Besser als Stumpf alles mögliche zu versuchen und immer dran zu scheitern.

Übrigens, wie meint dud as mit "Event abonomieren"? @Quaneu
Irgendwie finde ich dazu nichts.
Weil das klingt für mich irgendwie am verständlichsten 😃

Und @FZelle auf die Seite bin ich auch schon gestoßen. Das Problem dabei ist, das ich dann mein gesamtes Projekt nochmal umarbeiten müsste 😭
Aber sicherlich für die nächste Anwendung dann interessant.

@Coffeebean
Wie "hangelt" man sich denn an propertys lang? Klingt irgendwie ziemlich wichtig wenn man mal größere Anwendungen hat.

03.07.2014 - 07:08 Uhr

@Coffebean
Okay, klingt sinnig. Ich dachte eigentlich das dies auch zum ViewModel gehört.
Das werde ich mal gleich machen 😃

Und danke für die vielen Tipps. Ich werd mir mal die Links anschauen und schauen was passiert.

Ich werde dann berichten ob es mir geholfen hat.

02.07.2014 - 16:13 Uhr

Hi,
das Problem dabei ist ja, das die View im Viewmodel nicht bekannt ist?!
Darum kann ich mir ja keine Instanz von dem Fenster holen?
Oder hab ich da was falsch verstanden?
Weil so wollte ich es ja auch eigentlich machen, bzw. so hab ich es vorher gemacht:

  public void auswahl_click(object sender, RoutedEventArgs e)
        {
            Einstellungen suchwindow = new Einstellungen();
            app_config_load(suchwindow);
            suchwindow.Show();
            
        }

was ja nichtmehr funktioniert.

nun hab ich mein:

   private ICommand searchwindowcommand;

       public ICommand SearchWindowCommand
       {
           get
           {
               if (searchwindowcommand == null)
               {
                   searchwindowcommand = new RelayCommand(p => ExcecuteSearchwindowcommand());
               }
               return searchwindowcommand;
           }
       }

       public void ExcecuteSearchwindowcommand()
       {
           
       }
         
    }

und hab kA was jetzt zu tun ist 😭

Vielleicht hab ich euch aber auch nur falsch verstanden?! 😃

Leider kann ich erst morgen früh wieder reinschauen.
Bis morgen !

02.07.2014 - 15:45 Uhr

Hallo!
Ich habe es nun endliche(jedenfalls beinahe) geschafft mein anfängliches Projekt nach dem MVVM prinzip neu zu schreiben.
Mir fehlt nurnoch das Wissen wie ich ein neues Fenster öffne, dann ist es endlich vollbracht.

So, nun das eigentliche Problem:
Da das ViewModel ja nichts von der View weiss, hab ich irgendwie keine Ahnung wie ich das machen soll?!
Ich hab momentan ein ExcecuteSearchWindowcommand, in dem ich das andere Fenster (das lediglich ein paar Sucheinstellungen für den Nutzer bereitstellt, sollte ich dennoch dafür ein neues ViewModel anlegen?) halt aufrufen wollen würde.

Über Google bin ich auf ein paar wenige Beispiele gestossen, die aber beinahe immer davon ausgehen das ViewModel und View im selben Projekt sind?!
Und die anderen die ich fand waren hunderte Zeilen lang, da hab ich nicht so recht durchgeblickt.

Gibt es da eine "relativ" simple und vorallem verständliche Art dies zu machen?

Also quasi, wenn ich auf meine Menueleiste klicke und mein command ausgeführt wird, dass dann das andere Fenster aufploppt.

Grüße und danke schonmal

01.07.2014 - 13:43 Uhr

Hi,
ich danke dir schonmal. Ich hab dem SelectedItem jetzt wie du vorgeschlagen hast vom Typ pViewModel gemacht und es klappt, er gibt mir die ausgewählten Items.

So, eine Frage habe ich da aber noch, die gerade bei mir aufkam.

Zum testen der Ausgabe habe ich diese Klasse:

public class PatientList
    {


        public static IList<Patient_Anschrift_List> Patients { get; private set; }

        static PatientList()
        {
            using (dbentities context = new dbentities())
            {
                Patients = new List<Patient_Anschrift_List>();
                Patients = (from p in context.Patients
                            join a in context.Anschrifts
                            on p.AnschriftID equals a.AnschriftID
                            select new Patient_Anschrift_List()
                            {
                                Vorname = p.Vorname,
                                Nachname = p.Nachname,
                                Versichertennummer = p.Versichertennummer,
                                Versichertenstatus = p.Versichertenstatus,
                                Geburtsdatum = p.Geburtsdatum,
                                StrasseHausnummer = a.StraßeHausnummer,
                                Postleitzahl = a.PLZ
                            }).ToList();
            }

        }

Die mir halt Daten liefert.

So wird das dann aufgerufen:

  public pViewModelList()
        {
                      
            patient_view = new ObservableCollection<pViewModel>(PatientList.Patients.Select(p => new pViewModel(p)));
         
        }

Meine Frage dazu:
Was ist, wenn ich jetzt eine andere Abfrage nutzen möchte?

Denn derzeit ist ja quasi die Abfrage mein Datacontext:


 private void SetupBindings()
        {
            var viewModel = new pViewModelList();
           
            personlistview.DataContext = viewModel;
        }

Kann ich das zur Laufzeit irgendwie ändern? Und vorallem habe ich ja verschiedene Abfragen in der eigentlichen Klasse, die ich nutzen will, wie kann ich quasi meine Rückgabe ergebnisse an "patient_view" übergeben? Da dies ja eine ObservableCollection vom Typ<pViewModel> ist, und nicht so wie die Abfragen von Klasse xy?

Ich hoffe du verstehst ungefähr was ich dir mitteilen möchte.
Falls du mir dabei noch helfen könntest, wäre ich dir seeehr dankbar 😃
(Anfängerprobleme halt 😦 )

Edit:
Okay, ich habe gerade meine Gedanken etwas gesammelt und joar, mit dem konvertieren und so klappt alles wie es soll, nur wird die Änderung an patient_view nicht ins dgrid übernommen?!
Also eigentlich schon, wenn ich etwas anfüge, aber nicht wenn ich andere Datensätze ausgebe. (durch z.B. where Klausel, in patient_view sind anschliessend stat ~25k Datensätze dann halt nur 11, aber es zeigt weiterhin alle an)
Aber das wird sich dann sicher auch noch klären.

01.07.2014 - 11:33 Uhr

Huhuuu,
die Outputsache kannte ich noch garnicht.
Wieder was gelernt 😃
Danke schonmal, das könnte noch nützlich sein.

zu 1.

Fehlermeldung:
System.Windows.Data Error: 23 : Cannot convert 'ViewModel.pViewModel' from type 'pViewModel' to type 'dModel.Patient' for 'en-US' culture with default conversions; consider using Converter property of Binding. NotSupportedException:'System.NotSupportedException: TypeConverter kann nicht von ViewModel.pViewModel konvertieren.
bei System.ComponentModel.TypeConverter.GetConvertFromException(Object value)
bei System.ComponentModel.TypeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
bei MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)'
A first chance exception of type 'System.NotSupportedException' occurred in PresentationFramework.dll
System.Windows.Data Error: 7 : ConvertBack cannot convert value 'ViewModel.pViewModel' (type 'pViewModel'). BindingExpression:Path=SelectedPatient; DataItem='pViewModelList' (HashCode=11299826); target element is 'DataGrid' (Name='dgrid'); target property is 'SelectedItem' (type 'Object') NotSupportedException:'System.NotSupportedException: TypeConverter kann nicht von ViewModel.pViewModel konvertieren.
bei MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType, DependencyObject targetElement, CultureInfo culture, Boolean isForward)
bei MS.Internal.Data.ObjectTargetConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
bei System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

Da scheint irgendwas im argen zu sein.

  1. Naja, die Datagrid-Ausgabe usw soll quasi über Patient passieren, der da gefüllt wird mit den selects und all der kram der so in der Db passiert.
    Bei dem selectedItem will ich ja quasi nur das momentan geklickte Objekt, um damit zu arbeiten. (Damit ich dann weiss, worauf die deletes und updates usw. angewendet werden müssen)
    Oder ist das so nicht so gut?

Edit:

Das hier ist das pViewModel:

[Code entfernt]

01.07.2014 - 11:03 Uhr

Hi,
ich habe das mal weggelassen und den Mode auf Two-Way gesetzt.
Aber nichts geschieht so recht.
Ich hab mir Haltepunkte auf "SelectedPatient" und so gesetzt und joar, er kommt dort nie an.

Also entweder wird das event nicht aufgerufen wenn ich ins Grid reinklicke und eine Spalte auswähle, oder ich hab was beim Binding falsch gemacht, so denke ich.

01.07.2014 - 09:43 Uhr

Guten Morgen werte Forengemeinde,
Ich hoffe ihr könnt mir bei meinen kleinen problemchen helfen 😃

Also, ich habe ein Programm zur Verwaltung von Patientendatensätzen geschrieben.
Funktioniert auch alles wie es soll, nur bin ich nun dabei es nach dem MVVM Prinzip nochmal "neu" zu gestalten.

Nach einigen Tutorials usw. komme ich nun schon etwas besser klar, und die bindings und funktionen und Datenbankabfragen usw. funktionieren schonmal weitesgehend wieder wie sie sollen, bis auf das Binding auf ein SelectedItem bei dem DataGrid.
Wenn ich ins Grid reinklicke bzw. eine andere Row anklicke, passiert einfach garnichts.
Es wird nichtmal "SelectedPatient" irgendwie aufgerufen oder so, und ich versteh nicht so recht warum?!
Bei den Textboxen und Buttons und so hat das alles bisher so fein geklappt 😦

Dazu habe ich es so im XAML festgehalten:


 <DataGrid x:Name="dgrid" Margin="30,20,374,0" SelectionMode="Single" SelectionUnit="FullRow" 
        	IsReadOnly="True" ItemsSource="{Binding Patients}" [B]SelectedItem="{Binding SelectedPatient, UpdateSourceTrigger=PropertyChanged}"[/B]
        	AutoGenerateColumns="False" CanUserSortColumns="False" CanUserAddRows="False" TextBlock.TextAlignment="Center" Height="652" VerticalAlignment="Top" >

Im Code sieht es dann so aus:

public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(String change)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(change));
            }
        }

       
        private Patient selectedpatient;

        public Patient SelectedPatient
        {
            get { return selectedpatient; }
            set
            {
                if (selectedpatient != value)
                {
                    selectedpatient = value;
                    NotifyPropertyChanged("SelectedPatient");
                }
            }
        }

Und noch die Patienten:

   private ObservableCollection<pViewModel> patients;

        public ObservableCollection<pViewModel> Patients
        {
            get
            {
                return patients;
            }
            set
            {
                if (Patients != value)
                {
                    patients = value;
                    this.OnPropertyChanged("Patients");
                }
            }
        }

Mir fehlt noch etwas das know how um hier zu erkennen was ich nun so falsch mache, drum frag ich hier nochmal nach 😃

Danke!

Edit:
Ich hab btw. schon eine weile damit verbracht zu Googln, aber irgendwie konnten mir die Beispiele usw auch nicht mein Problem lösen.

27.06.2014 - 10:07 Uhr

Okay, danke dir.
Du bist wahrlich ein wandelnder Hort an wissen.

Ich lese mir gerade einen Artikel über die ominösen POCOs durch.
Hach, wird ja immer mehr kram den man aufsaugen muss.

Aber gut, Danke 😃

27.06.2014 - 09:47 Uhr

Hi Abt,
das mit dem Connection String in einer zentralen Datei finde ich noch etwas verwirrend.
Ich habs mir aber schon unter den favoriten abgespeichert und werd mir das wenn die Zeit da ist genauer anschauen. (leider daheim kein Internet und nix zum programmieren momentan, drum hab ich nicht soviel Zeit und mache mich erstmal mit dem MVVM vertraut bevor ich mir wieder was anderes anschaue. Quasi eins nach dem anderen 😃 )

Nochmal zum Problem:
Es funktioniert jetzt. Das Problem war, das der Connection String von der Anwendung dann in einem anderen Projekt scheinbar überschrieben wurde.
Ich hab den jetzt weggelassen, und nun funktioniert es.
Irgendwie ist das alles etwas verwirrend, aber nungut.

Nicht so leicht sich ins programmieren einzufinden 😄

Wie dem auch sei, ich hab noch eine andere Frage.

Wenn ich mir das .edmx Model erstellen lasse, dann werden da ja die entities und so generiert.
Kann ich die Klassen daraus einfach ins Model packen ohne das es zu Komplikationen kommt?
Weil das .edmx Model ja doch eher zur Datenbankschicht gehört, oder?

27.06.2014 - 07:13 Uhr

Hi,
inwiefern?
Also wie mache ich das in den settings bekannt?
Sowas musste ich bisher noch nicht machen, drum weiss ich nicht so genau was du meinst.

Aber naja, wie gesagt.
Wenn ich die DB Abfrage aus dem Konsolenprojekt mit der App.config mache, dann funktioniert es ja.
(und wenn ich die App.Config ändere dementsprechend der selbe Fehler, drum find ich das ja so ... seltsam. Wieso funktioniert es bei einem Projekt, aber bei dem anderen nicht?)

Ich schau mal ob ich bei Google was zu den settings finde.

Grüße 😃

Edit:
Wenn ich die in den Settings bekannt mache, kann er das Projekt nicht mehr builden.

Da kommt dann so ein Fehler:> Fehlermeldung:

Error 12 Could not copy "obj\Debug\dModel.exe" to "bin\Debug\dModel.exe". Exceeded retry count of 10. Failed. dModel

Also wenn ich etwas vom Typ dModel.dbentities in den Settings angebe.
Scheint nicht der richtige Weg zu sein, aber dennoch danke.

Edit2:
Und ich nutzte die Settings doch schon um Zustände zu speichern, habs nur scheinbar irgendwie verdrängt 😃

26.06.2014 - 14:58 Uhr

Du meinst die app.config, oder?
Die ist je in jedem der einzelnen Projekte mit dem String versehen.

Also eigentlich hab ich die app.config aus dem Model nochmal in alle anderen Projekte dieser Projektmappe gepackt, weil ich halt auch dachte das ich damit evtl das Problem löse?!

Oder meintest du was anderes?

Edit:
Deine Kurzanleitung gefällt mir 😃

26.06.2014 - 14:39 Uhr

Hi,
also ich nutze den Connectionstring, der mir durch das Framework erstllt wurde:

 <connectionStrings>
    <add name="dbentities" connectionString="metadata=res://*/dModel.csdl|res://*/dModel.ssdl|res://*/dModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=xxx;initial catalog=Test;persist security info=True;user id=xxx;password=xxx;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>
  </connectionStrings>

der da so ausschaut.

Er funktioniert ja auch soweit, scheinbar.
Also ich kann mir die Abfrageergebnisse über die Konsole ausgeben lassen, aber sobald ich es dann im Grid der View ausgeben möchte, kommt halt der Fehler.
(statische Liste funktioniert ja bei der Viewausgabe, also gehe ich mal davon aus das der Code soweit korrekt ist?)

Ich hab den Connectionstring nu in jeder Projektmappe drin und joar, bringt halt nichts 😦

Kannst du mir sagen was zu tun ist?

26.06.2014 - 11:18 Uhr

SQL Server 2012
Visual Stuido 2012

Guten Morgen!
Ich bin gerade dabei mich mit dem MVVM (auf anraten hier im Forum und eines Kollegen) zu beschäftigen.
Was ich habe:

  • Eine Datenbankschicht mit Abfrage (funktioniert, über Konsole noch getestet)
  • Ein Model (.edmx Datei, generiert aus meiner Testdatenbank)
  • Die View und daraus resultierende eigentliche Anwendung
  • Die Basisklassen und halt das
  • ViewModel

Soo, nun zum Problem:
Wenn ich meine Datenbankabfrage mir per Konsole ausgeben lasse, gibt es keine Komplikationen. (hab da die selbe app.config wie im Model)
Wenn ich denn aber die selbe Abfrage nun auf der View ausgeben möchte, dann kommt der Fehler:> Fehlermeldung:

{"In der Anwendungskonfigurationsdatei wurde keine Verbindungszeichenfolge mit dem Namen 'dbentities' gefunden."}

Angebliche Source : DB_layer

Mit einer statischen Liste Funktioniert die Ausgabe auf der View dann logischerweise, aber per Datenbankabfrage nicht.

Ich habe jetzt halt rumgetestet(app.config überall eingefügt, überall das EF Framework eingebunden und sowas, alles Erfolglos) und komme nun nicht mehr voran 😦
Mein Kollege kann den Fehler auch nicht so recht nachvollziehen.

Hat da jemand eine Idee?
Das beschäftigt mich nun seit tagen 😦
(Projekt mehrfach neu gemacht, bzw. ein funktionierenedes Projekt umgeschrieben und son kram, immer mit dem selbigen Fehler am Ende ... so frustrierend)

Danke schonmal!

11.06.2014 - 14:41 Uhr

Hallo Abt, danke für den Ausführlichen Beitrag.
Ich hab das Thema hier gerade nochmal angesprochen und ein wenig mit den Kolegen drüber geredet und joar, wir werden das dann so lassen wie es momentan quasi ist.
Also Jeder Patient bekommt seine eigene Adresse, egal ob die nun schon tausend mal drin ist, die dann nach Bedarf geändert werden kann usw. Falls der Schlingel umzieht oder was auch immer.

Denn wie du ja schon sagtest, gibt es ja dann doch recht viele Möglichkeiten eine Strass(ß)e [STR] zu benennen 😃 (und dann auch noch Umlaute im eigentlichen Namen, Straßen die von 2-15 gehen, Straßenzusätze wie a oder b usw., sehr verwirrend)

Aufjedenfall hat sich somit mein Problem gelöst 😉

und @vbprogger
Hey, den selbigen Gedanken hatte ich eigentlich auch, nur dachte ich das es evtl. eine Möglichkeit gäbe, bei der man das ohne Hilfstabelle machen kann.
Aber gut, ist ja nu nicht mehr nötig.
Danke, das du dir ebenfalls Gedanken gemacht hast 😃

11.06.2014 - 12:44 Uhr

Hi!
Ja, ich find das auch ziemlich unsinnig.
Vorher hatte man alle Daten die man so benötigt zu einer Person gescheit in einer Tabelle. Aber naja ...
Aber auf jedenfall:
Falls wer umzieht bekommt er entweder eine neue Adresse, oder aber eine andere ID zugewiesen, sofern die Adresse bereits vorhanden ist. Also die, wo er hinziehen möchte.

An die Adressen Tabelle sind dann auch noch viele weitere Tabellen gebunden, die dann sowas wie Länderkennzeichen, Bundesländerkennzeichen usw enthalten. (scheinbar haben einige Bundesländer mehrere Kennzeichen, jedenfalls für Versicherungen)

Es soll dann sowas wie ein großes "Telefonbuch" sein, mit möglichst vielen Adressen, dessen ID's den einzelnen Patienten dann zugewiesen werden.

11.06.2014 - 12:28 Uhr

Hi vbprogger!

Also bereinigen trifft es schon ganz gut, nur ist es so:
Alle Anschriften die momentan mehrfach in Anschriften vorhanden sind, sollen gelöscht werden.
Nur wie packe ich das in einer Anfrage, in der ich gleichzeitig sicherstelle, das quasi die letzte übriggebliebene der Mehrfachanschriften dann auch die ID's in Patienten ersetzt, die zuvor zu einer Mehrfachanschrift gehörte?

Also nach dem Prinzip:

ID1 : Hamburger Strasse --> Patient 1 gehört dazu
ID10 : Hamburger Strasse --> Patient 10 gehört dazu (also diese Adresse war vorher bei Patient 10 in der FoxPro Tabelle)

Nachdem die doppelten Anschriften beseitig wurden, soll es denn so aussehen:

ID1 : Hamburger Strasse --> Patient 1
ID1 : Hamburger Strasse --> Patient 10

(oder halt ID 10, das ist ja egal)
Also das ich die doppelten Anschriften lösche und die ID's dann in der Patienten Tabelle anpasse.

Und ein Patient kann nur eine Anschrift besitzen. Eine Anschrift aber x Patiente.
Also diese Form 😃

Edit: Auf die weitere Normalisierung hab ich sonst keinen Einfluss. Ich muss es jetzt quasi so hinnehmen wie es ist.

11.06.2014 - 11:30 Uhr

verwendetes Datenbanksystem: SQL Server 2013

Guten Morgen!
Ich hab gerad ein (evtl simples) Problem, und zwar:
Ich habe eine Tabelle --> Patienten
In einer FoxPro Datenbank.
Diese besagte Tabelle sollte ich in eine SQL Server DB kopieren.
Soweit, so gut.
Das Problem an der Sache ist, das die Tabelle im SQL Server nicht das selbe Format hat.

Die eigentliche Tabelle sieht in etwa so aus:
id
ikkasse
versnr
name
....
plz
ort
strasse

und noch ein paar weitere Felder.

Diese Tabelle wurde nun im SQL Server auf 2 aufgeteilt.
Einmal die Tabelle Patient: (die selben Felder wie die FoxPro Tabelle, nur ohne die Anschriftsdaten)
id
name
AnschriftID
...

und eine Extratabelle fuer die Anschrift:
plz
ort
strasse
AnschriftID

Mein Problem:
Es gibt in der eigentlichen Tabelle ja logischerweise keine AnschriftID, weil sie ja nicht nötigt war bisher.
Nun kopiere ich mit meinem Programm die Daten aus der Ausgangstabelle in die 2 Tabellen , speichere mir in beiden Tabellen die Urpsrungs FoxPro ID mit ab und mit dieser weise ich dann die ID's aus der Anschrift Tabelle dem Feld AnschriftID in der Patient Tabelle zu.

Nun hat jeder Patient eine AnschriftsID. Das Problem an der Sache ist, das ich nun doppelte Anschriften löschen möchte. Was ja an sich kein Problem ist, doch nun hengen dann ja viele Datensaetze "in der Luft".
Und zwar alle, bei denen die Anschrift mehrfach auftaucht (da doppelte ja gelöscht werden) nach dem ersten Datensatz.

Ich komme einfach nicht drauf, wie ich bei z.B.:

ID: 1 -> Straße1
ID: 2 -> Straße1

Dann die ID 2 in der patienten Tabelle durch die 1 ersetze. Also wenn die Straße doppelt ist.

Ich hoffe irgendwer kann mit der Beschreibung was anfangen.

Also der Knackpunkt ist:
Ich habe in Anschrift sagen wir 100k Datensätze und eben soviele in Patienten.
Jeder Patient hat eine Anschrift. Eine Anschrift kann aber doppelt sein, drum sollen alle doppelten Anschriften gelöscht werden, weil sie ja nicht gebraucht werden. Nun muss die ID ja aber in der Patienten Tabelle angepasst werden. (ID2: wird zu ID1)
Mir fällt nach längerem grübeln keine gescheite Abfrage ein.

Hat da wer eine Idee?
Und danke schonmal 😃

05.06.2014 - 14:20 Uhr

Ja, ich hab ja auch im debugger geschaut.
Hab aber keine Leerzeichen erkannt 😦
Jetzt, wo ich es weiss, und ganz nahe an den Monitor rangehe, erkenne ich auch das da bei vielen Strings 1 doofes Leerzeichen ist.

Sorry Abt.
Und dennoch Danke fuer die Geduld!

05.06.2014 - 14:02 Uhr

Wow san-software.
VIELEN DANK!
Darauf waere ich jetzt echt nicht gekommen 😃

Jup, genau das war der Fehler.
(wie gesagt, bin erst seit 2,5 Wochen dabei und hatte kA, das sowas passieren kann)
Dann werde ich mal die Tabellen von Leerstellen bereinigen.

Danke!

05.06.2014 - 13:39 Uhr

Mhmm,
"Bei der Auflistung wurden keine Ergebnisse zurückgegeben".
Mehr bekomme ich durch den debugger nicht raus.
(Also was ich ja schon vorher durch das debuggen herausgefunden habe, nur kA wie ich mir die eigentliche Abfrage anschauen kann?)

Im SQL Server Funktioniert die Abfrage ja auch und bringt xxx Ergebnisse.
(Bzw. im using Block ebenfalls)

Sehr nervig, an sowas solang festzuhaengen.

05.06.2014 - 13:24 Uhr

Ja, ich hab auch schon einge Extra Klassen in einem anderen Projekt fuer die Abfragen und Operationen, damit ich GUI und DBkram und so voneinander trenne. Das ist gerade eigentlich nur zum testen, weil ich einfach nicht auf den Fehler komme und nicht umstaendlich zum Testen extra Buttons usw im eigentlichen Projekt anfuegen moechte 😃

Nochmal ne ganz bloede Frage, wie schau ich mir im Debugger die Abfrage an?
Sobald er bei der Abfrage ist, hat er ja beim erstellen der queryvariable bereits die Ergebnisswerte wenn ich Schritt fuer Schritt gehe?

Wenn ich das weiss, dann sollte ich auch (hoffentlich) den Fehler finden 😃

Edit:
Ps. auch mit p.Vorname.Contains kommt nichts bei raus.

05.06.2014 - 13:06 Uhr

Der Debugger sagt, das in patienten der erste Datensatz den Vornamen "RUTH" enthaellt.
Drum ist das ja auch so verwirrend.
Solange ich mich auf Integer beziehe bei den Abfragen kommen auch die richtigen Ergebnisse raus.

Verrueckterweise Funktioniert widerum die Abfrage in dem using Block

 using (dbentities context = new dbentities())
            {
                patienten = (from p in context.Patients 
                                  where p.Vorname == "RUTH"                            
                             select p).ToList();
                
                anschrift = (from a in context.Anschrifts
                                 select a).ToList();
                       
            }

Nur bringt mir das ja dann nicht viel, da ich dann ja halt nur die Datensaetze zu den Namen habe.

Mit kleinschreibung hab ichs auch schon probiert, aber fuehrt alles zu einem leeren Ergebniss 😦

05.06.2014 - 12:29 Uhr

verwendetes Datenbanksystem: SQL Server 2013, FoxPro

Guten Morgen werte Forengemeinde,
ich haenge gerade wieder an einem (vermutlich) simplen Problem.

Also, wir haben eine FoxPro Datenbank mit vielen Tabellen usw.
Da das System hier auf den SQL Server umgestellt werden muss, gibt es bereits Entwürfe fuer die neuen Tabellen im SQL Server.
(Die Tabellen werden nicht 1:1 uebernommen)
So, nun wollte ich Daten aus der FoxPro Tabelle :"patienten" in die entsprechenden(sind nun 2) Tabellen im SQL Server kopieren. War auch kein Problem.

Nun aber kommt das Problem:
Die Adressfelder "strasse","plz","ort" sind nun eine spearate Tabelle. Dafuer bekommt jeder Patient eine Anschrift ID, die dann auf Anschrift Tabelle verweist. (so können die Adressen später noch mit mehr Details versehen werden usw., wie eine art Telefonbuch 😄)

Mein Problem:
Ich habe nun 3 Listen.

  1. Die eigentliche "Ur"Tabelle
List <PatientenFOX> pFOX
  1. Die neue "patient" Tabelle
List<Patient> patienten;
  1. Die neue "anschrift" Tabelle
 List<Anschrift> anschrift;

Jetzt muss ich ja fuer jeden Datensatz die AnschriftID's setzen. Da es aber vorher halt kein Feld in dieser Richtung gab, muss ich die ja quasi selbst verteilen.

Die ID's zu den verschiedenen Adressen wurden ja automatisch vom SQL Server generiert.
Jetzt muss ich irgendwie den Patient aus der FoxPro liste nehmen, davon den Namen usw mit patienten vergleichen und die dazugehoerige Adresse mit anschrift. Dann kann ich ja von der passenden Anschrift die ID zu dem passenden Patienten bringen (Doppelnamen oder Adressen gibt es nicht, die hab ich schon entfernt).

Leider scheitert es schon an den einfachsten dingen:


 List<Patient> patienten;
 List<Anschrift> anschrift;

            using (dbentities context = new dbentities())
            {
                patienten = (from p in context.Patients                             
                             select p).ToList();
                
                anschrift = (from a in context.Anschrifts
                                 select a).ToList();
                       
            }

Hier fuelle ich die Listen (den Quellcode fuer die Foxpro Tabelle spare ich mir mal, der ist etwas laenger) und wuerde dann halt gerne Joins usw. auf die Listen anwenden. Im Prinzip sollte das ja kein Problem sein, aber wenn ich z.B.:


var query = (from p in patienten
                       //  join pf in pFOX on p.Vorname equals pf.vname
                         where p.ID < 50                    
                         select p).ToList();

dgrid.ItemsSource = query;

Gibt er mir auch alle Werte aus, die er ausgeben sollte.

Wenn ich aber sowas Abfrage:


var query = (from p in patienten                   
                         where p.Vorname == "RUTH"                    
                         select p).ToList();

dgrid.ItemsSource = query;

Kommt garnichts. Das bringt mich zum verzweifeln.
Ich komm einfach nicht drauf was ich falsch mache?! (bin aber auch noch neu bei C# usw)

Ist das ein akzeptabler Lösungsansatz fuer das Problem?
Und warum kann ich nach Integer werten Abfragen, aber nicht nach Strings?
Auf MSDN usw. wurde das ja ebenso gemacht.

Danke fuer eure Hilfe 😃

26.05.2014 - 10:49 Uhr

Ich schaue mir gerad dieses ominoese Repository Pattern an, mal hoffen das ich damit dann was anzufangen weiss 😄
(auch wenn mein Englisch eher mager ist, aber wird schon passen 😄)

Nun nochmal zu meiner anfaenglichen Frage:
Ich hab dann auch mal nach der ID selektiert + Name, aber dennoch der selbe Fehler?!

26.05.2014 - 10:24 Uhr

Hallo Abt,
danke für das schnelle Antworten.

Naja, gibt es bei der Methodenvariante denn auch irgendwie die Moeglichkeit die Spaltennamen erst zur Laufzzeit festzulegen? Weil das muss sich ja doch auf irgendwas beziehen?

Darum wollte ich ja quasi das mit dem String machen, das erschien mir am einfachsten mit dem Zusammenbauen eines Selects ala

"Select" + Spaltenname1, Spaltenname2, Spaltennam3 .... + "where ..." usw.

(ich hab quasi ein Fenster mit Checkboxen ueber die man auswaehlt welche Spalten ausgegeben werden sollen, will aber nicht tausend Abfragen schreiben, sondern eher nur eine und mir dann einen String oder so zusammenbauen. Falls du da aber eine bessere Idee hast, ich freu mich ueber jede Hilfe 😉)

Gruß, Madlen

26.05.2014 - 09:58 Uhr

verwendetes Datenbanksystem: SQL Server 2013
Entiwckleroberfläche: Visual Studio 2013

Guten Morgen,
ich hab da ein Problem, und zwar möchte ich eine Abfrage in dieser Richtung:

using (dbmodelEntities context = new dbmodelEntities())
            {

                var patient = context.Patients.SqlQuery("SELECT Vorname from Patient ).ToList();

                this.dgrid.ItemsSource = patient;
            }

nutzen, und mir das Ergebnis halt ausgeben lassen.

Nur leider bekomme ich dann immer diese Fehlermeldung:
Der Datenleser ist mit dem angegebenen Wert für 'dbmodel.Patient' nicht kompatibel. Ein Element vom Typ ('ID') weist keine entsprechende Spalte im gleichnamigen Datenleser auf.

Wenn ich die Abfrage mit * mache, funktioniert das dagegen einwandfrei.

Und wenn ich die Abfrage so stelle:


  using (dbmodelEntities context = new dbmodelEntities())
            {
                var query = from patient in context.Patients
                            where (   patient.Nachname.Contains(kriterium_nachname) 
                                   || patient.Vorname.Contains(kriterium_vorname) 
                                   || patient.Versichertenstatus.Contains(kriterium_versichertenstatus)  
                                   || patient.Versichertennummer == kriterium_verischerungsnr                 
                                   || patient.Geburtsdatum == kriterium_geburtsdatum)
                            select patient;              

                return query.ToList();
            }

Funktioniert es komischer weise. (also mit dem selektieren der Spalten, nur kann ich das in der Form scheinbar nicht "dynamisch" machen. Ich weiss erst zur Laufzeit welche spalten selektiert werden sollen, darum die Stringvariante)

Kann mir jemand den Fehler erklaeren? Und mir sagen was ich dagegen tun kann?
Per google hab ich nichts gefunden, obschon wohl einige solch einen Fehler hatten, aber irgendwie bezieht sich das bei allem immer auf gespeicherte Prozeduren.

Vielen dank und Gruß