Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Mr. Bart Simpson
Thema: Henne-Ei-Problem in Bezug auf Sicherheitsfunktionen
Am im Forum: Rund um die Programmierung

Zitat von Abt
Ja - natürlich.
Und als Zwischenschicht verwendest Du ein API Management Tool (gibts in Azure schon, oder Tyk.io oder API Umrella als unabhängige Lösungen).

Und je nach Umgebung trennen wir noch folgendes (wobei mein Fokus auch Industrie 4.0, Factories, Cloud und Co ist; weiß nicht inwiefern ihr da eine ähnliche Anforderung an die Umgebung habt)

Je länger ich über Dein Modell nachdenke, desto plausibler erscheint es mir - auch im Kontext unserer konkreten Anforderungen. 8)
Wobei ich allerdings noch nicht sicher bin, ob es wirklich zwei so strikte Management-Layer geben wird oder sollte. Aber das ist noch "im Fluss" (Hintergrund: Es gibt hier ein paar Aspekte, die ich in einem Forum nicht breittreten darf...)

Aber ich möchte mich auf jedenfall schon mal bei allen Antwortgebern bedanken! Allein die Tatsache mal was mit der Brille von jemand anderem zu sehen hat mir viel geholfen - und sei es z.T. auch "nur" die Tatsache, dass andere Leute auf die selben Lösungsansätze kommen.
Weitere Anregungen sind natürlich immer gern gesehen!

Bart Simpson

P.S. @Abt: Ich bewege mich exakt in dem von Dir genannten Umfeld - wobei ich aber bei vielen (zumindest aktuell) nicht "Industrie 4.0" hinschreiben würde, sondern eher 0.9 beta 2 :evil:

Thema: Henne-Ei-Problem in Bezug auf Sicherheitsfunktionen
Am im Forum: Rund um die Programmierung

Hi,

schon mal vielen Dank für die Antworten. Die jeweiligen Tendenzen zeigen mir jetzt schon, dass ich nicht komplett falsch liege mit meinen Ansichten
Ich versuch mal auf die für mich wesentlichen Punkte einzugehen:

Zitat von MarsStein
Das verstehe ich aber nicht so ganz. Vor allem b). Viel zentraler als Dein Kernel Layer kann es doch gar nicht mehr werden??
Was ich meinte war im Prinzip: Es gibt a) das schon erwähnte Modul zur Benutzerverwaltung und evtl. b) zusätzlich in gewisser Weise die selbe Funktionalität irgendwie nochmal im Kernel - aber eben "nur" für die Nutzung von dort aus. Und damit ergäbe sich eine gewisse funktionale Doppelung (was ich ja auch selbst kritisiert habe).
Die Idee mit dem Proxy klingt erst mal ganz net - aber dann muss man auch kucken, dass es nicht den Proxy um des Proxy's Willen gibt. Denn dann könnte u.U. auch direkt von "extern" mit der Funktionaliät im Kernel kommuniziert werden.
Ich weiss nicht so recht, ob dann nicht wieder Dein vorgeschlagener Punkt 2. der bessere wäre.
Zitat von MarsStein
Aber vielleicht ist das mal ein Anfang für:
Zitat
und freue mich auch über eifrige Diskussionen
Läuft!
Zitat von Abt
zB. für HealthCheck und Co nimmt man in vielen Fällen die Service Registry
Das ist auch genau unser Plan Ich hab nur das in gewisser Weise falsche oder zumindest suboptimale Beispiel HealthCheck gewählt, weil's so schön plakativ ist und damit auch jemand der sich noch nicht konkret mit der Thematik beschäftigt hat auch eine Vorstellung vom "Plan" bekommen kann... Verzeih also die bewusste Irreführung.

Der Punkt, dass die zentrale Stelle keine Autorisierung machen kann/soll ist an sich ein valides Argument. Würdest Du den Standpunkt auch weiterhin vertreten, wenn ich folgende "Erweiterung" einbaue?
  • Das zentrale Module ist zuständig für die Authentifizierung (ähnlich wie Du das schreibst, von daher sag ich mal: -> Check!)
  • Die Nutzenden (externen, "drüberliegenden") Programme bekommen zusätzlich Zugriff auf eine Api, mit der sie an zentraler Stelle auch Informationen/Daten zur Autorisierung ablegen/verwalten können.

Hintergrund davon ist: Es kann/wird mehrere Programme geben, die sich eben jene (letztendlich) "administrative Konfiguration" (sprich: Wer darf was) teilen.
Zitat von Abt
Was man in so einem System dann auch nicht vergessen darf, ist das Logging.
Den konkreten Punkt haben wir schon explizit auf dem Schirm. Ich bin aber sehr dankbar, wenn noch irgendwelche anderen Punkte/Anmerkungen kommen - einfach um nichts zu übersehen...
Zitat von Palin
Bei uns ist es so gelöst, das die Verwaltung von Rechten (BL) und die Prüfung von Rechten (vereinfacht DAL) getrennt sind.
Das wollen wir grundsätzlich auch tun. Allerdings ist es "von außen betrachtet" dann doch wieder in einem Modul verortet - wenn auch u.U. über eine weitere/andere API zu erreichen.

U.a. weil unser Projekt in .net Core entwickelt werden soll, haben wir uns die dort vorhandenen Mechanismen / Lösungen schon genauer angekuckt und planen auch einiges von den Konzepten und Ideen bei uns einfließen zu lassen. Für unseren speziellen Anwendungsfall können wir aber aller Wahrscheinlichkeit nach nicht oder nicht vollständig darauf zurückgreifen... Da ist aber noch alles "im Fluss"...
Zitat von Palin
Grundlegend Probieren wir in den Layern so „hoch“ wie möglich zu prüfen ob die Rechte/Lizenz vorhanden ist.
Das favorisiere ich im Prinzip auch. Allerdings gilt natürlich auch die Prämisse "never trust user input" und es darf natürlich nicht durch eine solche Verlagerung der Prüfung dazu kommen, dass angedachte Absicherungen/Kontrollen ausgehebelt oder umgangen werden können.
Um bei meinem Bild mit dem Betriebssystem zu bleiben: Wenn Dir die UI der Systemsteuerung nicht erlaubte eine kritische Stelle umzukonfigurieren, dann solltest Du das auch nicht können, wenn Du direkt versuchst, z.B. die Registry zu editieren.

Bart Simpson

Thema: Henne-Ei-Problem in Bezug auf Sicherheitsfunktionen
Am im Forum: Rund um die Programmierung

Hallo zusammen,

ich konzipiere gerade (mit Kollegen) an einem größeren Softwareprojekt, welches Basis-Infrastrukturdienste für weitere Software zur Verfügung stellen soll (ich sprech mal bildlich: Eine Art Betriebsystem für andere Software).
D.h. es soll einzelne "Module" geben (Stichwort: Microservices), die für sich genommen funktionieren können und im Zusammenspiel miteinander Ihre Stärken ausspielen - diese sollen aber auch und vor allem genutzt werden von Software die "weiter oben" läuft.
"Unter" den Modulen soll es einen Layer geben, der sich -vereinfach gesagt- um die Verwaltung eben jener Module kümmert. So soll dort z.B. ein ggf. nötiger Dienst gestartet werden oder auch eine Art "Health Checking" für die Module laufen (Um beim Bild von oben zu bleiben: Der Kernel des Betriebssystems). Grundidee ist es dabei, den unteren Layer so schlank wie möglich und damit einfach und performant zu halten.

So weit so schön (und einfach)... :evil:
Nun soll es unter anderem ein Modul geben, welches eine zentrale Benutzer- und Rechteverwaltung erlaubt (Authentifizierung und Authorisierung). Damit sollen weitere Programme in die Lage versetzt werden, diese für sie nötige Funktionalität an eine zentrale Stelle zu delegieren. Auf den ersten Blick sofort etwas was man im Layer für die Module ansiedeln möchte, da es sich augenscheinlich ja um ein solches handelt.
Doch dann gibt es leider Anforderungen an den untersten Layer (im Bild: der Kernel), die ebenfalls irgendwie einer Rechteprüfung unterliegen müssen. (Beispielsweise: Wer darf die Konfiguration für z.B. das Startverhalten von Modulen ändern)

Nun stellt sich die Frage: Welche Softwarekomponente führt die dafür nötigen Prüfungen durch?

  • Das selbe Modul wie oben? Damit bringt man aber eine (eigentlich unnötige und auch unerwünschte) Abhängigkeit des untersten Layers von einer darüber liegenden Schicht ins Spiel...
  • Eine (Kernel-) eigene Implementierung der Rechteprüfung? Damit wird a) u.U. Code gedoppelt und vor allem b) die Idee der zentralen Benutzerverwaltung ad absurdum geführt


Sieht jemand noch weitere Alternativen? Hat jemand gute Vor- / Ratschläge für die Lösung des Problems? Ich wäre für jedewede Information dankbar und freue mich auch über eifrige Diskussionen - denn damit bekommt man immer einen anderen Blickwinkel, der einem auch mal die Augen öffnen kann. Betriebsblindheit ist schließlich eine Berufskrankheit für Softwareentwickler...

Bart Simpson

Thema: Abfragen von Tasten ohne aktives Formular/Consolenfenster
Am im Forum: Grundlagen von C#

Es geht aber auch ohne Nachrichtenschleife: Mit 'nem KeyboardHook

Bart Simpson

Thema: Wie erstelle ich eine (Web)App mit Benutzer Accounts, Login/Logout und Speichern von Daten?
Am im Forum: Datentechnologien

Hi,

für das schon angesprochene ASP.net MVC gibt's recht schöne Tutorials - z.B. eines rund um das Thema Anmeldung etc. - zu finden unter http://www.asp.net/mvc/...

Bart Simpson

Thema: Multiuser Anwendung - MS SQL
Am im Forum: Datentechnologien

Zitat von FZelle
Das Pessimistische Locking lässt sich ohne Service nur sehr schwierig richtig implementieren.

...naja. Sooo schwer ist das nun auch nicht, zumindest wenn man "den Ball flachhält" 8)
Wir tun das hier ungefähr wie folgt: Der Zugriff auf einen Datensatz erfolgt nicht über die Tabelle selbst, sondern über eine Stored Procedure, die beim Zugriff zwei (zusätzliche) Felder in der Tabelle bearbeitet bzw. auswertet. Das eine beinhaltet ggf. den Client, der den Datensatz gerade bearbeitet (also "das LOCK besitzt"), das andere den Zeitpunkt, bis zu dem die Sperre (noch) gültig ist.
Wenn ein Client "als erster" zugreift, werden die beiden Felder aktualisiert und er bekommt in einer weiteren (berechneten) Spalte im Ergebnis mitgeteilt, dass der Datensatz schreibbar ist.
Kommt nun ein zweiter Client, so wird dies an den beiden Spalten erkannt, und der Client kriegt über die berechnete Spalte mitgeteilt, dass der Datensatz Read-Only ist.

Zu beachten sind dann noch die folgenden Punkte:
a) Wenn ein Client das Lock für einen längeren Zeitraum braucht, muss ggf. das Timeout aktualisiert werden
b) Das normale Aufheben der Sperre muss sauber implementiert werden (z.B. beim Speichern), damit die anderen Clients nicht unnötig lange auf das Timeout warten müssen.
c) Die Dauer des Timeouts sollte sinnvoll gewählt werden
d) Die Logik der Stored Procedure muss natürlich auch mit ggf. abgelaufenen Timeouts umgehen können.
e) Das ganze ist natürlich auf einer gewissen Kooperation aufgebaut - d.h. wenn ein Client irgendwie anders zugreift oder das Read-Only Flag nicht beachtet, greift das natürlich nicht.

Gibt sicher noch ein paar Haken und Ösen bei dem Vorgehen, bei uns klappt das aber recht gut - wobei ich anmerken muss, dass unsere Clients keine Benutzer im eigentlichen Sinn sind, sondern Hintergrundprozesse, die ggf. auch mal warten können

Bart Simpson

Thema: Lesen per OleDb aus Excel-Datei: Parameter fehlt Wert.
Am im Forum: Grundlagen von C#

Zitat von ChrisHa

command.Parameters.AddWithValue("@MyDateParameter", DateTime.Now.Day + "." + DateTime.Now.Month);

...also dazu fällt mir jetzt eigentlich nur noch eines ein: AUTSCH. :evil:

Ich hab's nicht ausprobiert und es mag durchaus sein, dass Excel diese Notation akzeptiert - aber warum verwendest Du hier so ein -mit Verlaub- String-Gefrickel, wenn es mit den Datumsfunktionen doch genau das gibt, was Du brauchst um es vernünftig zu lösen?
Spätestens wenn Du mal mit Sprachübergreifenden Daten zu tun hast (z.B. deutsches vs. englisches Datumsformat) sind die Probleme bei Deiner Lösung vorprogrammiert...

Bart Simpson

Thema: Lesen per OleDb aus Excel-Datei: Parameter fehlt Wert.
Am im Forum: Grundlagen von C#

Hallo,

also mal abgesehen davon, dass ich die Anforderung hier

Zitat von ChrisHa
Leider hilft das auch nichts. Da der Tag "heute" in meinem Fall falsch wäre. Ich benötige nur den Monat und den Tag, da es eine Art: Wer hat heute Geburtstag werden soll.
nicht wirklich aus Deinen bisherigen Beschreibungen herausgelesen habe, hilft Dir das sehr wohl - allerdings sollte man sich halt ein wenig mit den Grundlagen von SQL beschäftgen...
SELECT Text,Datum FROM [Tabelle1$] WHERE month(Datum)=month(@MyDateParameter) and day(Datum)=day(@MyDateParameter);

Bart Simpson

Thema: Lesen per OleDb aus Excel-Datei: Parameter fehlt Wert.
Am im Forum: Grundlagen von C#

Also wenn Du in Excel wirklich als Datum formatiert hast, dann solltest Du das auch als Datum ansprechen - und zwar richtig (sprich: so wie es sich gehört...):

OleDbConnection conn = new OleDbConnection();
            conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Mappe1.xlsx" + @";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0""";


            string sql = "SELECT Text,Datum FROM [Tabelle1$] WHERE [email protected];";            
            OleDbCommand command = new OleDbCommand(sql, conn);
            command.Parameters.AddWithValue("@MyDateParameter", DateTime.Today);
...

Bart Simpson

---
Edit: Noch so als kleiner Hinweis: Der Excel-OLE-DB-Provider ist sehr zickig, was die "Typenreinheit" innerhalb der einzelnen Spalten angeht...

Thema: Email - Programm: Zugangsdaten verschlüsselt ablegen
Am im Forum: Grundlagen von C#

Wenn Du unter Windows bist, kannst Du das aber auch komplett an Windows delegieren und die Passwörter verschlüsselt im aktuellen Benutzerprofil ablegen (schau Dir mal die gespeicherten Netzwerkkennwörter an...). Das geht mit ein wenig PInvoke relativ einfach (u.a. mit der CredRead-Funktion).
Einen Einstieg für C# findest Du z.B. auf GitHub.

Bart Simpson

Thema: Lieber eine oder zwei Tabellen (Join oder Null-Felder)
Am im Forum: Datentechnologien

Zitat von Christoph K.
Also aktuelle rechne ich mit ca. 10 Mio Datensätzen.
Damit komm ich auf einen "zusätzlichen" Speicherbedarf von ca. 1,5 GB (plus das, was die BLOBs tatsächlich benötigen - aber das brauchst Du ja in beiden Varianten)... Stellt das wirklich ein Problem dar? Das ist in meiner täglichen Arbeit eher zu vernachlässigen - aber das mag natürlich in Deinem Anwendungsfall anders sein...
Zitat von Christoph K.
Weißt du wie sich der SQL-Server bezüglich der NULL(able) Datensätze verhält?
Reserviert er hierfür überhaupt irgendwas an Speicher?
Das sind Details die u.a. von der Version abhängen - aber hier ist die Doku oder die MSDN Dein Freund...

Bart Simpson

Thema: Lieber eine oder zwei Tabellen (Join oder Null-Felder)
Am im Forum: Datentechnologien

Zum einen muss ich bb1898's Anmerkung zustimmen, dass Du Dir evtl. nochmal generelle Gedanken bezüglich des "DB-Designs" bzw. der "DB-Egnine" machen solltest.

Um beim Thema zu bleiben und auf Deine Tabelle Bezug zu nehmen: Wenn _das_ alles ist, würde ich persönlich nicht mal drüber nachdenken, das in zwei Teile zu zerlegen. Die paar (im wesentlichen) INT-Werte sind marginal im Hinblick auf den Speicherverbrauch. Die BLOBs werden vom SQL-Server sowieso "ausgelagert", also dürfte das keinen großen Overhead erzeugen...
Wenn Du also nicht gerade jenseits der X-Millionen Datensätze bist, dann lautet meine Empfehlung definitiv: Eine Tabelle für alles.

Thema: Lieber eine oder zwei Tabellen (Join oder Null-Felder)
Am im Forum: Datentechnologien

Zitat von Christoph K.
Zusätzlich denke ich, dass ich durch den nicht mehr benötigten Join vielleicht etwas Geschwindigkeit gewinnen könnte.
Das ist mehr als wahrscheinlich...
Zitat von Christoph K.
Was sprich generell dafür/dagegen?
Grundsätzlich sind erst mal beide Ansätze legitim. Wenn's wirklich nur darum geht, dass Spalten NULL sind, würde ich persönlich in den allermeisten Fällen dazu tendieren, das in eine Tabelle zu packen. Das kann aber durchaus auch anders sein, wenn es wirklich extrem viele Spalten werden oder wenn die genannten JOINS recht selten nötig sind, oder, oder...
Zitat von Christoph K.
Wie hoch ist der zusätzliche Speicherbedarf für einen Eintrag in der Tabelle, wenn die optionalen Felder gar nicht belegt werden (NULL sind).Danke und Gruß
Das hängt von den Spalten-Datentypen ab. Wenn Du irgendwelche BLOB Daten (z.B. IMAGE oder auch navarchar(max) verwendest oder auch "sehr kleine" Datentypen (bit, int,...) dann ist das denke ich (im Allgemeinen) sehr leicht zu verschmerzen, was das an Speicherverbrauch kostet. Jedenfalls wenn man die ansonsten u.U. ständignötigen JOINS mit in betracht zieht. Denn Performance ist meistens deutlich wichtiger als ein bisschen mehr belegter Plattenplatz. Wenn Du allerdings sehr viele Spalten mit "festen Speicherverbrauch" (das vom SQL Server verwendete physische Layout der Tabelle ist hier ausschlaggebend) hast (meistens trifft sowas z.B. bei Spalten mit nvarchar(x), mit x irgendwo im Hunderterbereich zu), dann _könnte_ das schon deutlich ins Gewicht fallen. Ich persönlich denke aber, dass das nur in sehr speziellen Randbedingungen eine Rolle spielen dürfte...

Du könntest ja mal ein (ggf. vereinfachtes) CREATE TABLE Statement für die beiden Varianten posten, dann kann Dir hier evtl. auch eine etwas fundiertere Aussage geliefert werden. Denn Aussagen wie "...ziemlich viele..." sind immer relativ :evil:
Und: Eine zumindest ungefähre Einschätzung für die Anzahl der Datensätze ist auch hilfreich!

Bart Simpson

Thema: Remoteprozess mit Nutzer des Remote-PC's abrufen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das geht u.U. mit den Methoden, die auch PSList nutzt - schau Dir mal das hier an...

Bart Simpson

Thema: Daten auf Laufwerk "permanent-permanent" löschen
Am im Forum: Rund um die Programmierung

Wenn Du was fertiges suchst, schau Dir mal SDelete an. Das würde theoretisch (im Sinne von "war mal so") auch die höchsten Anforerungen erfüllen. Allerdings wurde ja schon erwähnt, dass das bei SSDs (und teilweise auch bei modernen HDDs mit z.B. Hybrid-Technik) nicht mehr klappt, weil dort die Firmware in die Verteilung der Daten auf Ihre "physischen Positionen" auf dem Speichermedium eingreift. Es kann also nicht mehr gezielt überschrieben werden... Deshalb bleibt unter diesem Gesichtspunkt nur folgende Vorgehensweise: a) Löschen der Datei und b) Füllen / Überschreiben des gesamten leeren Speicherplatzes...

a) ist aber wie erwähnt nicht wirklich sicher und b) ist meistens unpraktikabel (überschreib mal eben schnell 2TB und Du weißt was ich meine...). Dazu kommt, dass für "ganz hohe" Anforderungen selbst b) u.U. nicht mehr ausreicht, da moderne Platten z.B. Bereiche nach x-maligem Schreiben aus dem "Pool" nehmen und dafür vorher unbenutzte Reserve-Bereiche ins Spiel bringen. D.h., dass der urpsürngliche Bereich gar nicht mehr (regulär) angetastet werden kann - und somit auch nicht überschrieben...

Das führt zu Richtlinien wie bei uns hier: Festplatten, USB-Sticks, etc. dürfen gar nicht nach außen gehen bzw. wiederverwendet werden. Bei Defekt / Ausmusterung muss der Datenträger physisch so zerstört werden, dass nichts mehr zu retten ist - auch nicht für die Jungs von z.B. Kroll-Ontrack...

Bart Simpson

Thema: Delegate als Parameter übergeben
Am im Forum: Grundlagen von C#

Mal abgesehen davon, dass

_menu[_menu.count].process();
mit Sicherheit eine IndexOutOfRangeException werfen wird, hat Abt schon das richtige Stichwort gegeben, nämlich Func<T> (bzw. eine der Varianten mit ggf. mehr T's) - allerdings denke ich in Deinem Fall wäre es eher die Action-Klasse, da Du void zurückgibst...

Bart Simpson

Thema: SQL Server: Problem beim lesen von BLOB-Werten
Am im Forum: Datentechnologien

Wie BerndFfm schon geschrieben hat, klappt das mit dem direkten Lesen von byte[] meines wissens nach in allen SQL-Server Versionen. Selbiges gilt auch für das Schreiben der Daten - dort kann direkt ein byte[] in einen Abfrage-Parameter gepackt werden.

Das bringt mich zur eigentlichen Frage: Bist Du sicher, dass die Daten überhaupt richtig in die DB geschrieben werden? Oder liegt da vielleicht schon das grundlegende Problem?

Bart Simpson

Thema: [Diskussion] Guid vs. Seq. Guid vs Int32 als Primary Key
Am im Forum: Datentechnologien

...da setz ich mal noch einen drauf
Wir sind hier Dienstleister für BPO und haben teilweise Projekte seit mehr als 10 Jahren am laufen (was in der IT quasi Äonen darstellt).
Und ich möchte dabei nur eines sagen: Man glaubt nicht, wie oft ein Kunde (...v.a. die "großen", Global Player...) in solchen Zeiträumen seine Meinung bezüglich eines Themas um 180° und wieder zurück drehen kann... X( Von daher kann man in der Entwicklung gar nicht sauber / flexibel / langfristig /... genug denken.

Bart Simpson

Thema: [Diskussion] Guid vs. Seq. Guid vs Int32 als Primary Key
Am im Forum: Datentechnologien

Zitat von LaTino
a) wenn man ... Änderungen an der Bedeutung des Datensatzes vornehmen möchte...
b) Migration auf andere Datenbanksysteme...

_Das_ sind u.a. Gründe dafür, warum ich immer dafür plädiere, dass DB-Internas (und dazu gehören IMHO die PKs) nichts ausserhalb der DB verloren haben. Ob man das nun über eine GUID (die als Surogat nach aussen dient) geschieht oder über was anderes (will heißen: eine andere Datenstruktur) ist erst mal zweitrangig.
Alles andere führt immer zu einer Vermischung / unsauberen Trennung der Schichten und sollte tunlichst vermieden werden.

Bart Simpson

Thema: [Diskussion] Guid vs. Seq. Guid vs Int32 als Primary Key
Am im Forum: Datentechnologien

[Leicht Off-Topic, aber dennoch zum Thema...]

Mich würde mal interessieren, was Ihr denn so von dem bei uns (auf Anraten unseres DB-Gurus) standardmäßig implementierten "Mittelweg" zu dem Thema haltet:

Wir verwenden normalerweise int oder bigint als PKs haben dann aber normalerweise eine weitere GUID-Spalte (mit newid() gefüllt), auf die ein eindeutiger Schlüssel/Index gelegt wird. Dadurch wird alles was in der DB abgefackelt wird (z.B. JOINs), mit den int-Werten ausgeführt, extern (also z.B. in C#) wird aber die GUID zur Adressierung/Identifizierung der Datensätze verwendet (was durch den Index auch recht flott geht).

Was meint Ihr dazu?

Bart Simpson

Thema: [Diskussion] Guid vs. Seq. Guid vs Int32 als Primary Key
Am im Forum: Datentechnologien

@LaTino: Ich gebe Dir zwar in weiten Teilen Recht - aber dennoch unterschlägst Du doch einen Punkt, der gerade aus dem von Dir verlinkten Blogeintrag hervorgeht: Das Verwenden (zufälliger) GUIDs als Primary Key führt a) zu einer (prinzipbedingten) Fragmentierung der zugrunde liegenden Pages und b) (für die meisten wohl wichtiger) zu einer signifikant größeren Zeitspanne, die nötig ist, um ein INSERT auszuführen.
[ACHTUNG: Bildlich gesprochen & grob vereinfacht!]
Der Grund hierfür liegt im wesentlichen in der nötigen "Umsortierung" beim Einfügen eines zufälligen Schlüssels, da der PK das physische Layout der Datenstrukturen bestimmt. D.h. wenn beim Einfügen ein neuer, zufälliger Key z.B. zwischen Position 10 und 11 eingefügt werden muss, dann muss die Tabelle ab Pos. 11 "neu sortiert und abgelegt" werden.


D.h., wenn es die Anwendung erfordert, sehr oft INSERTs auf Tabellen mit vielen vorhandenen Zeilen auszuführen, ist eine zufällige GUID als PK sehr wohl als suboptimal zu betrachten...

Bart Simpson

Thema: COMException (0x80040154): Klasse nicht registriert bei x86 und gleicher vorraus.
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Zitat von schorge
...und zwar ist auf dem frischen Win10 kein PDF-Reader installiert

Nach der Installation läuft es wieder...

Sorry wenn ich das jetzt mal so formuliere, aber wenn Du einer meiner Azubis hier wärst, dann würdest Du jetzt mal tüchtig was hinter die Löffel kriegen!?!
Die für Deine Fragestellung absolut relevanteste Information (nach der durch Taipi88 auch schon explizit gefragt wurde) hast Du im Verlauf der gesamten Diskussion völlig unterschlagen. Da opfern hier wirklich einige Leute Ihre Zeit und versuchen Dir zu helfen - und dann sowas...
Vielleicht solltest Du Dir mal den [Hinweis] Wie poste ich richtig? zu Gemüte führen und v.a. auch beherzigen...

Bart Simpson

Thema: Zugriff auf WindowHandle unter einen Windowsdienst (Win7)
Am im Forum: Rund um die Programmierung

Dienste mit Fenstern interagieren zu lassen ist erst mal grundsätzlich keine gute Idee. U.a. auch deshalb sind da einige Hürden zu nehmen, z.B. sich mit der richtigen WindowStation zu verbinden, etc. Ab Vista ist das auch nicht mehr möglich (und es gibt meines Wissens nach auch keinen Workaround mehr).
"Kleiner" Einstieg: MSDN

Bist Du sicher, dass Du Dein Problem nicht grundsätzlich anders angehen solltest? Z.B. mit einer GUI-Application die via (wie auch immer gearteter) IPC mit dem Dienst kommuniziert?

Bart Simpson

Thema: Ausdrucken aus Word als Dienst behandlung von Handle
Am im Forum: Office-Technologien

Zitat von HL2002
... dann kommt ein POPUP...
Das sind (unter anderem) genau die auch von MS selbst beschriebenen Probleme, zu denen es kommen kann (und auch die, die wir hatten und haben). Word ist nicht dafür gedacht / entwickelt worden, um im Hintergrund zu arbeiten. Es wird _immer_ davon ausgegangen, dass ggf. ein User davor sitzt, der dann auch irgendwelche auftauchenden Meldungen wegklicken kann...

Bart Simpson

P.S. Wir sind grade dabei, komplett davon wegzugehen. Je nach Anwendungsfall versuchen wir Word-Dokumente direkt zu erzeugen (über das neue Open-XML-Dom) oder aber (bei komplexeren Themen) mit der (kommerziellen) Aspose Library.

Thema: Silverlight auf IIS (nicht Express) - Method not allowed
Am im Forum: GUI: WPF und XAML

Hi,

vorab: Ich hab keine Ahnung von Silverlight (dafür aber vom IIS)....
Im wesentlichen muss ich leider auf [Hinweis] Wie poste ich richtig? verweisen, da...

a) Ich bin mir _sehr_ sicher, dass Du mehr als nur ein einfaches "Method not allowed" als Fehlermeldung bekommst / bekommen hast. Wenn Du also den zugehörigen Kontext für Deine Fragestellung mitliefern würdest (Exceptiondetails, Stacktrace, etc.), kann Dir evtl. auch geholfen werden...

b) Hilfreich wäre auch eine genauere Information, _welche_ Features im IIS Du denn aktiviert hast bzw. vorher aktiv waren - da gibt es durchaus einige. Waren vorher z.B. die Standardmäßig installierten Features drauf? Wen ja, für welches OS?

Bart Simpson

Thema: Ausdrucken aus Word als Dienst behandlung von Handle
Am im Forum: Office-Technologien

Hi,

wenn Du Word-Automation in Hintergrunddiensten betreibst, solltest Du Dir bewusst sein, dass das a) von Microsoft nicht supported wird und b) zu einigen unschönen Problemen führen kann.
Details findest Du hier: https://support.microsoft.com/en-us/kb/257757

Bart Simpson

P.S. Wir tun's hier auch - und es funktioniert im Großen und Ganzen eigentlich - aber manchmal macht's dann doch zicken ;-)

Thema: Fangen von Exceptions, die durch externe Prozesse ausgelöst werden?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

also wir setzen hier Tesseract in vielen unserer Prozesse ein (allerdings noch die 2er Version). Was ich aus (reichlich) Erfahrung sagen kann:

a) Tesseract an sich funktioniert eigentlich ganz gut, hat aber desöfteren Probleme mit den Images. Was genau die Ursache ist, konnte ich noch nicht herausfinden, aber bei uns ist es in etwa bei 1 von 5000 Images so, dass sich Tesseract komplett verabschiedet und dabei meistens dann so im Speicher des Prozesses rumfuhrwerkt, dass der komplette Prozess geötet wird / werden muss... Scheint an den Images zu liegen - woran genau, weiß ich aber nicht.

b) Ich kenn den von Dir genannten Wrapper nicht, aber alle die ich bisher gesehen hab, haben mir immer mehr Ärger gemacht als die Sache wert war... Deshalb starten wir hier Tesseract immer als eigenen Prozess, der dann auch schön überwacht werden kann. Das löst dann auch gleich die unter a) genannten Probleme. Den Overhead für das jeweils Neu-Starten eines Tesseract-Prozesses können wir hier problemlos verschmerzen. Wir haben eine Parallelisierung in unserem Code eingebaut (einzelne Threads, von denen jeder seinen eigenen Prozess startet), was "in Summe" einge gute Performance ergibt.

Bart Simpson

P.S. Ich würd mich freuen, wenn Du Erfahrungsberichte zu Version 3 und/oder dem .net Wrapper hättest ;-)

Thema: T Type dynamisch festlegen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

...auch eine mögliche Interpretation der Frage ;-)

Zitat von LaTino
Und dieses Ansinnen ist mit Generics nicht möglich, denn, wie gesagt, auch generische Typen muessen zur Compilezeit festliegen.LaTino

Das ist zwar im Prinzip richtig, aber dennoch kannst Du (natürlich ohne Typsicherheit) mit Type.MakeGenericType und Activator.Createinstance Instanzen dynamisch erstellen - auch von generischen Typen.

Bart Simpson

Thema: PropertyInfo GetValue of List
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

...vielleicht wäre es auch mal hilfreich zu erklären, was Du eigentlich versuchst mit Deinem Code zu erreichen - ich seh in der Idee an sich grad keinen all zu tiefen Sinn ;-)
Ich hab schon einiges mit Reflection gearbeitet und könnte mir durchauch Anwendungsszenarien vorstellen in denen man zu irgendwelchen ähnlichen Lösungsvorschlägen wie Deinem kommt - aber aus Deinen Fragen & Antworten schlussfolgere ich, das der Hund wo völlig anders begraben liegt (Probleme mit der Architektur, Unkenntniss der vorhandenen Möglichkeiten, etc.)

Ich lese zwischen den Zeilen, dass es um irgendeine Art von (De-?) Serialisierung in (nach?) XML geht...

Bart Simpson

Thema: T Type dynamisch festlegen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die Einwende von LaTino sind natürlich korrekt - aber wenn ich Dich richtig verstanden habe, sollte es dennoch möglich sein...

 public abstract class NetworkArgs : EventArgs
    {
        public abstract Type DataType { get; }                
    }

    public class NetworkArgs<T> : NetworkArgs
    {
        public T Message;

        public NetworkArgs(T Message)
        {
            this.Message = Message;
        }

        public override Type DataType
        {
            get
            {
                return typeof(T);
            }
        }
    }

Deine Liste wird dann natürlich eine List<NetworkArgs>

Bart Simpson

[Edit:]
P.S. Die Stichworte Type.MakeGenericType und Activator.Createinstance sollten Dich auf den richtigen Weg bezgl. des zweiten genannten Problems bringen...