Gateway_man Geschrieben 27. Februar 2012 Teilen Geschrieben 27. Februar 2012 Hi, irgendwie bekomme ich es nicht hin die Logik der Stored Procedure (MSSQL) in C Sharp abzubilden. Hier die SP: ALTER PROCEDURE [dbo].[IniLesen] ( @MARefnr int, @APRefnr int, @Sec varchar(255), @Entry varchar(255), @flNoReadDefault int, @KHFA int, @BGRefnr int, @BERefnr int ) AS SET NOCOUNT ON SELECT top 1 isnull(INIText, INIWert) IniWert From initabelle where INIAPRefnr in (@APRefnr , -1) AND INISection = @Sec AND INIEintrag = @Entry AND INIMARefnr = @MARefnr AND (INIKHFARefnr = @KHFA or INIKHFARefnr <= 0) AND (INIBGRefnr = @BGRefnr or INIBGRefnr <= 0) AND (INIBERefnr = @BERefnr or INIBERefnr <= 0) AND (INIAPRefnr = @APRefnr OR (INIAPRefnr = -1 and ( @KHFA > 0 or @flNoReadDefault = 0 ))) order by (case when ( @KHFA > 0 and nullif(@KHFA, 0) = INIKHFARefnr) then 1 else 0 end) * 16 + (case when nullif(@APRefnr, 0) = nullif(INIAPRefnr, 0) then 1 else 0 end) * 8 + (case when ( INIAPRefnr = -1 and (@KHFA > 0 or ( @KHFA < 0 and @flNoReadDefault = 0))) then 1 else 0 end) * 4 + (case when nullif(@BGRefnr, 0) = INIBGRefnr then 1 else 0 end) * 2 + (case when nullif(@BERefnr, 0) = INIBERefnr then 1 else 0 end) * 1 desc ,INIRefnr asc Das war mein Ansatz in C Sharp: public IniEntity GetEntry(int MARefnr , int APRefnr, string section, string entry,bool flNoReadDefault, int khfa, int bgrefnr, int berefnr) { var result = this.Where(P => (P.IniAPRefnr == APRefnr || P.IniAPRefnr == -1) && P.IniSection.Equals(section, StringComparison.OrdinalIgnoreCase) && P.IniEintrag.Equals(entry, StringComparison.OrdinalIgnoreCase) && P.IniMARefnr == MARefnr && (P.IniKHFARefnr == khfa || P.IniKHFARefnr <= 0) && (P.IniBGRefnr == bgrefnr || P.IniBGRefnr <= 0) && (P.IniBERefnr == berefnr || P.IniBERefnr <= 0) && (P.IniAPRefnr == APRefnr || (P.IniAPRefnr == -1 && (khfa > 0 || !flNoReadDefault)))); if (result.Count() > 1) { foreach (IniEntity entity in result) { if (khfa >= 0 && entity.IniKHFARefnr >= 0) entity.sortorder = 16; else if (APRefnr >= 0 && entity.IniAPRefnr >= 0) entity.sortorder = 8; else if (entity.IniAPRefnr == -1 && (khfa > 0 || (khfa < 0 && !flNoReadDefault))) entity.sortorder = 4; else if (bgrefnr >= 0 && entity.IniBGRefnr >= 0) entity.sortorder = 2; else if (berefnr >= 0 && entity.IniBERefnr >= 0) entity.sortorder = 1; } result.OrderBy(P => P.sortorder); return result.ToList()[0]; } else if (result.Count() == 1) { return result.ToList()[0]; } else { return null; } } Sehr Ihr hier einen "Umwandlungsfehler"? Bitte fragt nicht was der Fehler war, da ich selbst keine Ahnung habe. Ich weiß nur das falsche Einträge geladen wurden und Fehler auftauchten. Wenn man die C# Logik wieder ausgeschalten hat und die SP hergenommen hat, ging alles wieder. Also muss in dem C# Code irgendwas Falsch sein. Ich komm leider nicht drauf was, daher frage ich euch . lg Gateway PS: isnull ist das gleiche wie Coalesce Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 27. Februar 2012 Teilen Geschrieben 27. Februar 2012 Warum lässt Du nicht die SP !? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 27. Februar 2012 Teilen Geschrieben 27. Februar 2012 Weil Logik in der DB abzubilden schlecht ist Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 27. Februar 2012 Teilen Geschrieben 27. Februar 2012 Weil Logik in der DB abzubilden schlecht ist Diese Diskussion hatte ich hier schon einige Male und ich bin diesbezüglich gegenteiliger Meinung. Auch findet sich in der Literatur (vgl. Alfons Kemper & Andre Eickler, Datenbanksysteme: Eine Einführung) entsprechende Hinweise, dass man eben Logik, die sich mit der Datenhaltung befasst, in der Datenbank ablegen sollte. Die Aussage "es ist schlecht", ist sicherlich nicht ausreichend Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 27. Februar 2012 Autor Teilen Geschrieben 27. Februar 2012 Die Frage lässt sich in zweierlei Hinsicht beantworten. Zum einen ist es eine UserStory (PM Wunsch). Für den zweiten Punkt muss ich etwas weiter ausholen. Ich weiß nicht ob es dir aufgefallen ist, jedoch ist die Tabelle die hier abgefragt wird aufgebaut wie eine Ini Datei (hat auch die Aufgaben einer Ini). Fragt bitte nicht warum man nicht eine Ini Datei nimmt für solche Zwecke. Ich kanns nicht beantworten. Die Tabelle ist schon 6 Jahre alt und scheinbar dachte man damals es wäre eine gloreiche Idee. Naja jedenfalls besteht das darauf aufbauende Programm aus Modulen, die schonmal 80 Einträge pro Modul haben können. Jedes mal wenn ein Modul geladen wird, ließt es aus der Initabelle über jene Prozedur. Bei einem Multiusersystem mit 200 Clients und inzwischen 50.000 Einträgen in der Initabelle, kann das durchaus Performancelastig sein. Jetzt hat man mir gesagt ich sollte doch bitte eine Cache für die Initabelle im Programm realisieren, damit das Programm nicht bei jeder Session tausende male (wirklich tausende male) aus der Initabelle ließt. Da natürlich auch die Logik, nach der die Iniwerte priorisiert geholt werden, im Cache ebenfalls unterstützt werden soll, bin ich gerade dabei die Prozedur in einer Funktion nachzubauen. lg Gateway Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 27. Februar 2012 Teilen Geschrieben 27. Februar 2012 Wäre dann nicht ein Redesign letztendlich sinnvoller? Ich denke, wenn Du hier ein eigenes Caching baust, ist das nur ein Heftpflaster. Ich würde ein anständiges Design der Tabelle vorschlagen und dann letztendlich das Caching die Datenbank machen lassen. Je nach Design kommt dann evtl auch ohne SP aus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 27. Februar 2012 Autor Teilen Geschrieben 27. Februar 2012 Ich würde so einiges an der Software ändern, allerdings umfasst dieses Programm eine exe und 350 dll's deren Abhängigkeiten ich nur erahnen kann. Und letzendlich will es keiner bezahlen xD. Das ist das tolle am Scrum Prozess. Der Entwickler hat ein minimales Mitspracherecht. Ich bekomme von den PM's (Product Manager) die Userstories die sich die Kunden wünschen bzw. wofür diese bereit sind Geld auszugeben und dann muss ich das realisieren. Es gibt hier keine Spielraum zumal das dann mindestens eine Task wäre, die in etwa 30 Manntage kosten würde (und kann dann nichtmal als Future neu verkauft werden...). Ja so ist das . lg Gateway PS: Nochmal zurück zum Thema. Sieht da jemand nen Fehler? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. Februar 2012 Teilen Geschrieben 28. Februar 2012 Die Case-Blöcke schließen sich nicht gegenseitig aus (also nur if, kein else if), und die Einzelergebnisse werden zum Sortierkriterium zusammengezählt. Die erste Sortierung muss außerdem absteigend sein, und die zweite fehlt ganz, wenn ich das richtig sehe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 28. Februar 2012 Autor Teilen Geschrieben 28. Februar 2012 Danke Klotzkopp. Das hatte ich völlig vergessen. Jetzt funktionierts. lg Gateway Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.