Zum Inhalt springen

Brauche Hilfe bei der übernahme einer Stored Procedure in C Sharp


Gateway_man

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...