Laden...
Avatar #avatar-2880.jpg
Florian Reischl myCSharp.de - Experte
Softwarearchitekt, Technischer Projektleiter München Dabei seit 16.10.2007 1.564 Beiträge
Benutzerbeschreibung

Forenbeiträge von Florian Reischl Ingesamt 1.564 Beiträge

15.01.2010 - 10:02 Uhr

Hallo xSeppelx

Ich würde gerne den XML Inhalt in ein Listview laden.
Die Frage ist nur wie das geht 😉

Ich verstehe die Frage nicht ganz. Da du ja sicher nicht gegen Punkt 4a und 4c aus [Hinweis] Wie poste ich richtig? verstößt 😉 musst du schon genauer beschreiben an welcher Stelle du ein Problem hast.

Grüße
Flo

14.01.2010 - 17:30 Uhr

Hi mo#

Ja, CURRENT_TIMESTAMP ist das gleiche wie GETDATE. Ich nehme an du verwendest diese Funktion um die Werte deiner View einzuschränken. Das geht nicht da die Daten damit automatisch (ohne Manipulation) rollieren.

Außerdem ist dein nächste Problem, dass du von Employee auf die View "Test" eine 1:n Relation hast. Damit ist Employee.Id nicht eindeutig und wird dir wahrscheinlich das nächste Problem liefern.

Grüße
Flo

14.01.2010 - 16:07 Uhr

Eine Filterfunktion die sofort eine Suchauswahl einschränk ist schon sinnvoll, meine Frage zielte eher darauf ab wie man soetwas performant lösen kann.

War mir schon klar. Die Antwort war aber ernst gemeint. Letzten Endes geht's wirklich nur darum was der Anwender will. Man kann dabei zwar mal diskutieren aber wenn die das haben wollen, dann bekommen die das. Die Frage ist dann nur was ist der Aufwand und ist das Feature den Wert.

Zur Lösung würde ich beim SQL Server sagen mit ein bis drei parallelen Threads zu arbeiten. Außerdem das Ergebnis auf irgendwas Sinnvolles, z.B. 500 Einträge, begrenzen. Ansonsten kennt sich FZelle mit SQL Server Compact aber deutlich besser aus als ich. Du solltest dir aber mal das von Ihm angesprochene ResultSet anschauen.

Grüße
Flo

14.01.2010 - 14:57 Uhr

ich glaube, ich habe ein wichtiges Detail vergessen.
...
Ich benutze aber noch ein Zwischenschicht, den ADO.NET DataService

Jupp, würde ich ein wichtiges Detail nennen 😃

Da die DataServices, meines Wissens nach, ja SOAP serialisieren scheint in dieser Serialisierung der Fehler zu stecken. & ist ja ein XML-Steuerzeichen und wird evtl. nicht korrekt maskiert. Dazu kann ich aber weiter nix sagen da ich die DataServices nicht verwende.

Grüße
Flo

14.01.2010 - 14:49 Uhr

Hast du mal den Profiler angeworfen und geschaut was abgeschickt wird?

14.01.2010 - 14:48 Uhr

Hi Reinsch

Ist mir auch aufgefallen nachdem ich's gepostet hatte. Funktioniert bei mir aber trotzdem:

         using (SandboxEntities ctx = new SandboxEntities()) {
            var result = (from t in ctx.TestData10K
                          where t.SomeVarChar == "ab & cd"
                          select t).FirstOrDefault();

            var result2 = (from t in ctx.TestData10K
                           where t.SomeVarChar == "ab & cd"
                           select t).ToList();

            var result3 = from t in ctx.TestData10K
                          where t.SomeVarChar == "ab & cd"
                          select t;

            foreach (var item in result3) {
               Console.WriteLine(item);
            }
         }

Grüße
Flo

14.01.2010 - 14:28 Uhr

Hallo Reinsch

Ich kann das Verhalten nicht nachvollziehen:

         using (SandboxEntities ctx = new SandboxEntities()) {
            var item = from t in ctx.TestData10K
                       where t.SomeVarChar == "ab & cd"
                       select t;
         }

Bei mir funktioniert's.

Grüße
Flo

14.01.2010 - 13:41 Uhr

Hallo Reinsch

Ich muss gestehen, wenn die ganzen Bugs die du so auflistest wahr sind bin ich ein bisschen geschockt über die "Qualität" vom EF v1...! Oder arbeitest du mit .NET 4.0?

Kannst du bitte mal die LINQ-Abfrage posten die du dafür verwendest?

Grüße
Flo

14.01.2010 - 13:39 Uhr

Auch SQL Server Compact ist immer eine Option bei Embedded Datenbanken. Du kannst hier im Forum aber über "Embedded Datenbank" viele Threads finden in denen die unterschiedlichen Systeme diskutiert werden.

Grüße
Flo

14.01.2010 - 11:38 Uhr

"MSSQLSERVER" ist der Default-Instanzname. In dem Fall brauchst du keinen angeben. Versuch mal nur den Server-Namen, ohne Backslash und Instanz.

14.01.2010 - 11:24 Uhr

Hallo thepixel

Was meinst du mit "findet nicht"? Wenn der SQL Server nicht in der Liste der Server angezeigt wird, manuell eingeben. Diese Liste ist kein Netzwerk-Scan sondern nur der Cache bereits verwendeter Server.

Läuft der SQL Server auf dem selben Rechner wie das SSMS? Wenn nicht bitte sicherstellen dass die Named-Pipes und TCP/IP Protokolle aktiviert sind.

Wenn der SQL Server mit Instanz-Namen installiert wurde prüfen ob du den Namen der Instanz korrekt angegeben hast. Also "ServerName\InstanzName"

Grüße
Flo

14.01.2010 - 11:13 Uhr

Hi

@Icarus666
Sieht mir nach einem peinlichen Bug im SQL Provider für MySQL aus. Kannst du mal das SQL Statement posten das EF an den MySQL Server schickt. (Habe keine Ahnung wie man das bei MySQL abfängt, aber da wird's wohl was geben.) Ich gehe mal davon aus dass dein "Project" Objekt 13 "Contract" Objekte hat und hier ein direkter JOIN statt einem EXISTS verwendet wird.

@Reinsch
Das wäre noch viel peinlicher, da SQL Server aus dem eigenen Haus kommt, aber ich bilde mir ein schon gesehen zu haben das EF bei SQL Server korrekt mit EXISTS arbeitet.
Kannst du bitte mal den Profiler anwerfen und das generierte SQL Statement posten?

Grüße
Flo

14.01.2010 - 11:00 Uhr

Hi mo#

😁 !
Und damit wurde die DepartmentId genau der Anker (oder eben die PARTITION) von der ich die ganze Zeit geredet habe.
(Ich persönlich würde die Sub-Query in eine CTE auslagern, ändert aber nicht viel am Ablauf).

Freut mich dass du's hinbekommen hast!

Grüße
Flo

13.01.2010 - 18:50 Uhr

Hi DevHB

Axso. Naja, wenn ihr die Daten zum Client senden wollt würde ich empfehlen das Verketten der Daten (also das bauen des CSV-Strings) dorthin auszulagern, da ist .NET wahrscheinlich eh wesentlich schneller.

Ein performanterer Weg über T-SQL wäre ziemlich umständlich und nur über eine komplizierte SQL-Prozedur mit dynamischem SQL und sp_executesql möglich. Dabei müsstet ihr euch alle Spalteninformationen aus INFORMATION_SCHEMA.COLUMNS holen und dynamisch das SQL Statement generieren das alle Werte in NVARCHAR konvertiert und mit "," verkettet. Das ist natürlich deutlich schneller - auch als der XML Weg im allgemeinen.

Wenn die Daten nicht an irgendeinen Client geschickt werden müssen sondern auch vom Server aus in eine Datei geschrieben werden dürfen, ist der beste und vor allem schnellste Weg auf jeden Fall BCP zu verwenden.

Grüße
Flo

13.01.2010 - 18:28 Uhr

Korrekt. LINQ ist ein Feature von .NET und hat nix mit der Datenbank zu tun.
Dennoch kann ich ja eine LINQtoSQL Klasse erzeugen (.dbml) Datei, womit ich ja die Datenbank "mappen" kann...

Klar erzeugt L2S auch Objekte. Das macht es ja zu einem **O**R-Mapper 😉. Zwar nach dem nicht so mächtigen ActiveRecord-Pattern, aber in einer sehr gelungenen Form.

Performance-Nachteile mit einer Stored Procedure? LOL! ...
Sorry, die Frage war blöd gestellt. Natürlich sind StoredProcedures (Funktionen auf dem Server) schneller, wenn sie mit dem Server kommunizieren 😉 Meine Frage richtete sich auf die Client-Seite.

Öhm... Den check isch net 😁
Wenn du das Hashing und die Validierung komplett in T-SQL realisierst muss sich der Client darum doch eigentlich keine Gedanken mehr machen.

Grüße
Flo

13.01.2010 - 18:12 Uhr

Hallo DevHB

Mit :::

Grüße
Flo

13.01.2010 - 17:38 Uhr

Hallo wassili

Wie oben schon gesagt, deine Klasse "MySQL_Connect" ist non-public. Der Konstruktor der public Klasse "ProjekteVerwalten" ist jedoch public. Das bedeutet, dass man außerhalb der Library/Applikation Zugriff auf einen Konstruktor hätte der einen Übergabeparameter erwartet welcher nicht zur Verfügung steht.

Entweder MySQL_Connect als public definieren, oder den Konstructor als internal definieren oder die Klasse ProjekteVerwalten internal machen (also keinen Modifier angeben).

Grüße
Flo

13.01.2010 - 17:25 Uhr

Ok, also gibt´s auf der einen Seite LINQ2SQL und auf der anderen das Entity Framework, worauf man wiederum mit LINQ über LINQ2Entities zugreifen kann, richtig?

Korrekt. LINQ ist ein Feature von .NET und hat nix mit der Datenbank zu tun. Das ist lediglich eine schicke Form um Daten abzufragen. Das kann jeder O/R-Mapper implementieren wenn der Publisher das (dem Consumer anbieten) will.

Ok, stimmt das ist blöd. Dann würde es ja eigentlich Sinn machen, die Prozeduren und Funktionen in Form von StoresProcedures zu erstellen, aber hat das nicht Performance-Nachteile?

Performance-Nachteile mit einer Stored Procedure? LOL! Nie! (Wenn richtig geschrieben). Stored Procedures sind die absolut schnellste Möglichkeit um mit SQL Server zu arbeiten. Heutige O/R-Mapper erzeugen zwar mittlerweile ordentliches SQL das z.T.(!) relativ nah an die Geschwindigkeit rankommt, aber schneller als eine Stored Procedure können die unmöglich sein.

Man liest ja viel über Vor-/Nachteile des einzelnen Frameworks. Welches würdest du bevorzugen? LINQ2SQL oder EntityFramework?

Darauf gibt's die allgegenwärtige Antwort: Kommt drauf an 😉

Wenn du ein 1:1 Mapping von Datenbanktabellen auf Domain-Objekte hast ist LINQ2SQL okay. Es erzeugt die besseren SQL Statements und arbeitet auch Client-Seitig schneller. Entity Framework hat den Vorteil dass du bis zu einem gewissen Grad das Mapping zwischen Datenbank und Domain-Modell abstrahieren kannst. Das SQL ist nicht ganz so gut wie das von LINQ2SQL, funktioniert aber und soll auch in der nächsten Version (kommt wohl im März) deutlich nachgelegt haben.

... und auch entschlüsseln...

Nö, kannst du nicht 😉. Einen Hash kann man nicht entschlüsseln; nur Brut-Forcen.

Grüße
Flo

13.01.2010 - 16:34 Uhr

Hallo mo#

Also die Id des neusten Eintrags bekommst du genau mit dem Statement das ich gepostet habe. So eine Abfrage dürfte aber auch direkt mit den Entity Framework Queries funktionieren.

         using (NorthwindEntities ctx = new NorthwindEntities()) {
            var result = (from o in ctx.Orders
                          orderby o.OrderDate
                          select o)
                          .Take(1);
            
         }

Mit Anker meinte ich die Id eines übergeordneten Objekts einer n:1 Relation. Wenn du Kunden und Bestellungen hast (also ein Kunde viele Bestellungen haben kann) könntest du z.B. für jeden Kunden die letzte Bestellung suchen. In diesem Fall wäre die CustomerId innerhalb der Orders-Tabelle der Anker (oder die Partition - in T-SQL Genre).

Grüße
Flo

13.01.2010 - 16:22 Uhr

Hallo mo#

Geht's dir einfach um die eine Zeile mit dem höchsten BeginDate? Dann:

SELECT TOP(1) * FROM Ereignisse ORDER BY BeginDate DESC

Wenn nicht, dann musst du beschreiben was der Anker (die Partition) innerhalb der Ereignisse-Tabelle ist für den jeweils der letzte Eintrag gefunden werden soll.

Grüße
Flo

13.01.2010 - 16:15 Uhr

Hallo riothi

Macht so eine Funktion deiner Meinung nach sinn?

Frag' die Anwender 😉

da hier ja in einem "TextBoxchanged" event bei jeder Änderung ein sql statement abgesetzt wird mit bezeichnung like '%var%' und somit die vorschlagsliste erstellt wird.

Wenn möglich, versuche das % am Anfang zu vermeiden. Damit hebelst du jeden Index aus.

bzw gibt es bei Bindingsource die möglichkeit dass daten im hintergrund nachgeladen werden aus der DB?

Soviel ich weiß, nein.

Grüße
Flo

13.01.2010 - 16:10 Uhr

Hallo DevHB

Jain.

Da du XML erzeugst, werden die entsprechenden Steuerzeichen natürlich maskiert, was für XML korrekt ist und sich in XML auch nicht ändern lässt.

Da du das Ergebnis aber danach in NVARCHAR(MAX) konvertierst kannst du mit einer verschachtelten REPLACE-Kaskade Zeichen wie &, <, >, " am Ende ersetzen. Dabei natürlich beachten dass du das & erst am Ende konvertierst. Ist zwar nicht die beste Performance aber funktioniert.

Grüße
Flo

13.01.2010 - 13:30 Uhr

Hi Xynratron!

wollte nur beitragen: MD5/DES/SHA ist ungeeignet für Kennwörter. siehe
>

Danke dir für den Link! Wirklich interessant.

Ich denke da gerade selbst über ein Konzept nach wie man sicher (wie möglich) verschlüsseln kann. Dabei geht's um rekursive Verschlüsselung mit einem Public-Key. Bin aber noch weit davon weg die Sache als wirklich Spruchreif zu bezeichnen...

Im Fall von Yheeky schätze ich mal dass eine klassische MD5 Verschlüsselung reichen dürfte. So wie ich's verstehe geht es in erster Linie darum dass er - als DBA - die Passwörter nicht einfach lesen kann.

Grüße
Flo

13.01.2010 - 13:15 Uhr

Hallo Yheeky

Ganz genau 😉 aber man sieht doch, dass das LINQ ist, oder?

Nicht wirklich. Sowohl LINQ2SQL als auch Entity Framework unterstützen DB-Queries über LINQ. Auch für NHibernate gibt's bereits eine LINQ Komponente.

...Also eine StoredProcedure habe ich bei meinem letzten Projekt schon geschrieben, ... ...Demnach würde mich nun aber mal der andere Weg interessieren.

Die Abfrage im Code über LINQ ist so wie jede andere Abfrage. Hier ein Pseudo-Code Beispiel

bytes[] passwordMd5 = GetMd5Hash(password);


using (LinqContext ctx = new LinqContext()) {
   var user = (from u in ctx.Users
               where u.UserName == name && u.Password == passwordMd5
               select u).FirstOrDefault();

   if (user == null)
      Console.WriteLine("User exists");
   else
      Console.WriteLine("User not found");
}

Was meinst du also damit, die Methode 100% nachzubauen im ersten Fall (O/R-Mapper Queries)?

Na du hasst einmal die GetMd5Hash()-Methode im Code welche du für die LINQ-Abfrage verwendest. Die Methode kannst du über SQL natürlich nicht verwenden. Deswegen musst du die Ver-/Ent-Schlüsselung des Passworts nochmal komplett neu in SQL schreiben. Damit hast du doppelten Code und musst halt bei jeder Anpassung daran denken beide Stellen zu ändern.

Grüße
Flo

Edit: Typo

12.01.2010 - 21:08 Uhr

Hallo Yheeky

Sorry, habe mich missverständlich ausgedrückt. VARCHAR/NVARCHAR benötigst du als Parameter-Typ für eine Prozedur falls du dich für eine DB-Spezifische entscheidest.

Deinem Code nach zu urteilen verwendest du einen O/R-Mapper. Schätze mal Entity Framework oder LINQ2SQL. Das ist eine nicht unwichtige Information 😉. Bei der Entscheidung ob SQL- oder C#-Lösung hast du folgende Optionen:

Entweder du verwendest die O/R-Mapper Queries um den User in der Anwendung zu validieren. In diesem Fall musst du die Methode 100% nachbauen für die Administration über SQL.

Oder verwendest eine Stored Procedure, In diesem Fall kannst du die gleiche Methode (Prozedur) im Front-End und über SQL verwenden, musst jedoch die Prozedur in deinem O/R-Mapper registrieren (ist abhängig vom Mapper wie das geht) und von dort aus ausführen.

Zu deinem Code:
Du vermischst da gerade Äpfel mit Birnen 😉
Die GetMD5Hash Methode konvertiert einen übergebenen String ja bereits in einen Byte-Array, dieser wäre der korrekte Übergabeparameter für deine Abfrage. Dabei musst du nix mehr in einen String konvertieren. Den StringBuilder verwendet Mladen nur um die konvertierten Bytes anzuzeigen, das wird nicht benötigt wenn du damit arbeitest.

Zu dem "0x" in deiner Datenbank:
Das ist einfach der gespeicherte Byte-Array. Das "0x" ist Makulatur und nichts mit dem eigentlichen Wert zu tun.

Du musst dich jetzt entscheiden welchen Weg du gehen willst. Bei der T-SQL Lösung musst du halt wissen wie man eine Stored Prozedure schreibt und diese über ADO.NET anspricht. Bei der C# Lösung wirst du wahrscheinlich in der Anwendung mit dem O/R-Mapper arbeiten können; für die DB-Administration musst du dann halt die entsprechenden Statements irgendwo vorhalten.

Grüße
Flo

12.01.2010 - 17:21 Uhr

Hi Yheeky

Erstmal Gratulation. Mit SQLTeam bist du auf einer der richtigen Seiten gelandet und mit Mladen bei einem der wirklich guten Blogger 😉

Die Unterschiede entstehen einmal durch die unterschiedlichen Encodings. Zusätzlich verwendet Mladen einmal CHAR/NCHAR, welche eine fixe Bytelänge haben, und einmal VARCHAR/NVARCHAR, welche eine Variable Bytelänge haben. Daher vier unterschiedliche Ergebnisse.

Ich empfehle:
Entweder VARCHAR, wenn die Anwendung kein Unicode unterstützen soll/muss.
Oder NVARCHAR, wenn die Anwendung international arbeitet und Unicode unterstützen soll/muss

Zur Verwendung aus C# hast du jetzt zwei Möglichkeiten...

Die C# Lösung
Verwende im C# den MD5CryptoServiceProvider und Encoding.ASCII für Unicode oder Encoding.Unicode für Unicode. So erhältst du den Byte-Array welcher das verschlüsselte Passwort darstellt. Den Wert kannst du dann über einen SqlParameter an deine Abfrage übergeben.

In dem Fall würde ich HASHBYTES vergessen und die ganze Hasherei über C# machen.

Die TSQL Lösung
Hier verwendest du einfach ein SELECT Statement wie ich's oben gezeigt habe. Der Aufruf der HASHBYTES Funktion innerhalb der WHERE Klausel ist dabei auch kein Performance-Problem da die Methode deterministisch ist und nicht auf der Spalte sondern einem fixen Wert angewandt wird.

Da ich auf keinen Fall empfehle den SQL String im Code zusammenzubauen würde ich den Aufruf in eine Prozedur auslagern.

Grüße
Flo

12.01.2010 - 13:02 Uhr

Hallo Superman8000

Ich empfehle eine Mischung aus beidem.

Zur Benutzerverwaltung und Sicherheit, nimm die SQL Server eigene Authentifizierung zu verwenden. Noch besser ist Windows-Authentifizierung, falls dein Server und die Clients sich in einer Domäne befinden. Damit kannst du low-level schon mal über Benutzergruppen festlegen wer was sehen oder ändern darf. Damit ist sichergestellt dass der Anwender - unabhängig von irgendwelchen Bugs oder SQL Injection - Sachen machen kann die er grundsätzlich nicht darf.

Zur Verwaltung von sonstigen Benutzerinformationen (Vor-/Nachname, Alter, Schuhgröße, ...) kannst du - wenn du keine Domäne hast - eine eigene Benutzertabelle anlegen welche auf den Benutzer-Namen (nimm nicht die user_id, sonst bekommst du Probleme bei Replikation und/oder Failover!) des angemeldeten Benutzers verweist.

Damit hast du die Vorteile beider Ansätze vereint.

Grüße
Flo

11.01.2010 - 22:25 Uhr

Hallo Benjamin

Ich würde empfehlen mal den CSharpCodeProvider anschauen. Beispiel gibt's hier:
Dynamic Code Generation and Code Compilation
... anstatt den csc.exe String zusammenzufummeln

Grüße
Flo

11.01.2010 - 21:08 Uhr

Hi Yheeky

So, jetzt bin ich mir sicher, dass du von Anfang an die Lösung hattest 😉
*Es geht darum das Passwort so in der Datenbank zu speichern, dass du - als DBA - dieses Passwort nicht lesen kannst. *Hash-Algorithmen sind darauf ausgelegt NICHT mehr entschlüsselt werden zu können. *Du hast anscheinend als Datentyp für die Spalte NVARCHAR verwendet. HASHBYTES liefert in Fall von MD5 ein VARBINARY(16) zurück. *Das was du in deiner Tabelle als Passwort siehst ist Byte-Müll der als Unicode-String irgendwie interpretiert wird.

Hier mal ein Beispiel-Szenario wie ein Benutzer angelegt wird, dieser anhand der Web-Applikation authentifiziert wird, das Passwort geändert wird und der User sich wieder anmelden kann. Der Trick ist hierbei immer mit HASHBYTES zu arbeiten.

-- create a sample user table
DECLARE @users TABLE (
   Id INT NOT NULL IDENTITY(1,1)
      PRIMARY KEY CLUSTERED
   ,Name NVARCHAR(50)
   ,Password VARBINARY(16)
);

-- insert a new user
INSERT INTO @users (Name, Password)
   SELECT 'username', HASHBYTES('MD5', 'userpwd');

-- show result
SELECT
      'row with encrypted pwd:'
      ,*
   FROM @users;

-- select from front end for authentication
SELECT
      'select for user authentication:'
      ,*
   FROM @users
   WHERE Name = 'username'
      AND Password = HASHBYTES('MD5', 'userpwd');

-- DBA reset password to a new pwd
UPDATE @users SET 
      Password = HASHBYTES('MD5', 'newpwd')
   WHERE Name = 'username'

---===================================
-- mail to user with new password 'newpwd'
---===================================

-- user authenticates with new password
SELECT
      'select with new pwd:'
      ,*
   FROM @users
   WHERE Name = 'username'
      AND Password = HASHBYTES('MD5', 'newpwd');

Wie du siehst ist das Datenbank final als Hash in der Datenbank hinterlegt, nicht für dich lesbar, bleibt aber administrierbar.

Ansonsten könnte man trotzdem die SQL Server Sicherheitsverwaltung verwenden. Wobei's bei einer Web-App darauf ankommt ob die public ist oder ob's hier um einen geschlossenen User-Kreis geht.
Das kenne ich noch garnicht die Sicherheitsverwaltung.

Wie schon gesagt, dass würde ich bei einer Web-Applikation vielleicht doch eher lassen da potentiell die Anzahl der Benutzer unendlich ist. Bei einer Windows-Applikation hätte ich gesagt verwende die SQL Server Authentifizierung (die mit der sich deine/eure Web-Applikation an der Datenbank anmeldet.) Im Intranet würde sich z.B. Windows-Authentifizierung über Impersonation der Web-Applikation anbieten, ansonsten ist natürlich auch die direkte SQL Server Security möglich. Ist aber beides nix für Web und B2C Anwendungen, bei B2B würde ich's jedoch damit machen.

Hat einfach den Vorteil, vor allem für dich als DBA, dass man im SQL Server einstellen kann, dass nur bestimmte Benutzergruppen auf bestimmte Tabellen kommen. Da gibt's dann keine Möglichkeit dass ein Benutzer durch einen Bug oder SQL Injection evtl. Informationen sieht die ihn nichts angehen oder die Daten beschädigt.

Grüße
Flo

11.01.2010 - 18:48 Uhr

8o 8o 8o 8o 8o

 foreach(int i in Enum.GetValues(typeof(ContactData)))  

WTF??
Was ist das denn? Du nimmst ein Enum um die internen-Int-Werte zu bekommen durch die du dann navigierst? Ich würde da ein gewisses Redesign empfehlen 😉

Grüße
Flo

11.01.2010 - 18:34 Uhr

Anscheinend steh' ich immer noch auf dem Schlauch... 🙂

Du willst ein Passwort verschlüsselt ablegen?
Du kannst hierfür beispielsweise - wie von dir gepostet - HASHBYTES oder - wie von mir gepostet - BINARY_CHECKSUM verwenden.
Ist nicht irgendwie die konkrete Antwort auf deine Frage?

Ansonsten könnte man trotzdem die SQL Server Sicherheitsverwaltung verwenden. Wobei's bei einer Web-App darauf ankommt ob die public ist oder ob's hier um einen geschlossenen User-Kreis geht.

Wenn ich immer noch auf dem Schlauch stehe - wovon ich irgendwie ausgehe - ignoriere entweder den Post einfach oder versuch's nochmal langsam für alte Männer 😁

Grüße
Flo

11.01.2010 - 18:28 Uhr

Hallo pogo

Ich bin mir jetzt nicht sicher, aber viell. hat's mit der ImageList zu tun. Das ist einer der Komponenten die 1:1 Win32 wrappen. Du fügst für jede Datei ein Item in die Liste hinzu. Wenn die Ordnerstruktur tief ist kann ich mir vorstellen dass Windows ein Problem bekommt intern die ganzen Handles zu verwalten. Versuch' hier mal zu optimieren. Eigentlich musst du nur die Bilder für Extensions wie ".exe", ".ico" und noch ein paar wirklich pro Datei holen für die restlichen Dateien wie ".txt" oder ".doc" reicht eine Referenz die für alle ListViewItems verwendet werden kann.

Grüße
Flo

11.01.2010 - 18:10 Uhr

Hallo Yheeky

Wieso verwendest du nicht einfach die Benutzerverwaltung von SQL Server?? Du kannst mit BINARY_CHECKSUM zwar einen Hash erzeugen, aber damit musst du die komplette Sicherheit selbst übernehmen. Ist irgendwie mit Sinn eines Datenbankservers sicherzustellen, dass kein unberechtigter Zugriff passiert. Das baust du dann alles selber.

Grüße
Flo

11.01.2010 - 17:36 Uhr

Hallo

Verwende einfach:
PostSharp

Grüße
Flo

11.01.2010 - 17:33 Uhr

Hallo TripleX

Ich habe in einem Projekt meine "Datenbank" (in dem Fall dann das DataSet welche die Daten einer xml-Datei eingelesen bekommt.)

Genau da liegt der Denkfehler. Das DataSet ist keine Datenbank sondern selbst eine spezielle Form eines Mappers. Die "Datenbank" wäre in dem Fall die XML Datei.

In einem anderen Projekt habe cih dann meine "Models", was in dem Falle die *.dbml Datei wäre. Jetzt wollte ich halt wissen ob man die *.dml irgendwie mit dem DataSet verknüpfen kann.

Geht nicht, weil das DataSet eben keine Datenbank ist.

Beim der SQL Compact Datenbank muss ich dafür die Tabellen im *.dbml erstellen und einen ConnectionString angeben. Ersteres würde ich hinkriegen bei einem DataSet, aber dann bin ich am verbinden des DataSets mit dem O/R-Mapper gescheitert.

Wie vorhin schon geschrieben, die *.dbml Datei ist nicht die Datenbank und der Designer ist auch nicht die eigentliche DB-GUI. Die Datenbank weiß nichts von der Datei und interessiert sich auch nicht dafür.

Ich bilde mir sogar ein, dass LINQ2SQL überhaupt nicht mit SQL Compact funktioniert. Es kann sein, dass du hier eine SQL Server Express Datenbank angelegt hast.

Auch wenn der LINQ2SQL Designer die Möglichkeit unterstütz die Datenbank zu manipulieren/designen ist der nicht wirklich die avisierte Management Oberfläche für eine SQL Server Datenbank.

Denn cih habe gerade ein kleiens Projekt, wo eine SQL-Datenbank eigentlich viel zu "overweight" ist. Außerdem möchte ich den benutzern nicht zumuten, sich extra SQL Compact 3.5 herunterzuladen (oder ich liefere die *.dlls mit, worauf cih auch gerne verzichte würde). Deswegen würde ich Daten am liebsten in eine xml-Datei in Verbindung mit einem DataSet speichern.

Das werde ich nie verstehen (nicht nur hier). Jede .NET Applikation benötigt den Framework mit duzenden DLLs und Windows mit hunderten (tausenden?) Assemblies, aber ca. 8 zusätzliche DLLs mit auszuliefern wird oft als Problem betrachtet.

Wenn du der Meinung bleibst, dass die DLLs ein Problem sind empfehle ich bei den DataSets und der XML-Datei zu bleiben. In dem Fall vergiss die anderen O/R-Mapper.

Grüße
Flo

11.01.2010 - 17:15 Uhr

Ich würde eh empfehlen statt des Arrays eine List<T> zu verwenden. Ansonsten kannst du aber auch temporär eine List<T> verwenden, die befüllen und am Ende mit list.ToArray() zu einem Array umwandeln. Nichtsdestotrotz, bei sowas sind Arrays nur umständlich und haben keinen Vorteil.

11.01.2010 - 17:08 Uhr

Mach doch mal:

MessageBox.Show(_contactTemp.Length.ToString());

Grüße
Flo

11.01.2010 - 14:49 Uhr

Hallo sth_Weird

Beim Download der Express Edition findest du ganz unten auch die Downloads für das Management Studio:
Microsoft SQL Server 2005 Express Edition

Außerdem gibt's auch noch die
Microsoft SQL Server 2005 Express Edition with Advanced Services. Das ist dann die Express Edition incl. Management Studio, incl. Reporting Services 😃

Allerdings würde ich bei den von dir angegebenen Eckdaten irgendwas schlankeres wie SQL Server Compact o.Ä. empfehlen. Express ist halt ein vollwertiger Datenbankserver mit allem was dazugehört. Wenn du für den Single-User Betrieb ein paar Daten speichern willst sollte die Compact Edition dicke reichen. Als visuelle IDE für die Compact Edition kannst du das Visual Studio verwenden und außerdem sollten die Datenbanken bei dir auch bereits ohne zusätzlich zu installierende Komponenten funktionieren.

Grüße
Flo

11.01.2010 - 14:40 Uhr

Ehrlich gesagt verstehe ich das nicht ganz. Bin nicht so tief drin in der Materie 😄

Du kannst die XSD wie sie ist ja verwenden um die XML Datei Strukturell zu validieren. Hinter die Validierung der XSD hängst du eine XSLT Transformation welche XPath verwendet um eben solche Abhängigkeiten wie deine IP in Verbindung mit deinem Gateway prüft. Wenn alles passt kannst du das von mir gepostete Template verwenden um die komplette XML Datei einfach 1:1 in eine Ausgabe zu "transformieren" (= kopieren). Danach ist alles valide und du kannst die Datei verarbeiten.

Tritt während der XPath-Validierung ein Fehler auf erzeugst du einfach eine Ausgabedatei aller:


<XML>
   <Error>Subnet mask not valid for IP Address</Error>
</XML>

So kannst vor der Verarbeitung kurz prüfen ob ein Fehler aufgetreten ist oder nicht und ansonsten die Datei verarbeiten.

Aber jede neue Datei würde Änderungen am Endgerät verlangen.

Den versteh ich jetzt net. 😄

Grüße
Flo

11.01.2010 - 14:23 Uhr

Hallo pohlmann

ich versteh es immernoch nicht ... außerdem welche Werte das Element verwenden darf...

Ich nehme an Midnight Run arbeitet mit dem <xs:pattern id="foo" value="RegEx"></xs:pattern>

Grüße
Flo

11.01.2010 - 14:19 Uhr

Korrekt. Wenn du bei der Konfiguration der Validierung flexibel bleiben willst kannst du höchstens noch ein XSLT dazwischenhängen welches nach der XSD Validierung noch Relationale Integritäten prüft. Wenn alles passt am Ende ein:


<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

Das führt jedoch dazu dass du alles einmal komplett kopierst. Hat den Nachteil des immensen Overheads, aber den Vorteil der ausgelagerten Validierung. Du musst halt entscheiden was dir wichtiger ist. Performance oder Trennung.

Grüße
Flo

11.01.2010 - 13:39 Uhr

Hallo Benjamin

Ich schätze mal du hast in den Eigenschaften der Datei nicht "Copy to Output Directory" eingestellt.

Zusätzlich bin ich mir jetzt nicht sicher ob "./foo.bar" unter Windows funktioniert. Nimm entweder ".\foo.bar" oder einfach "foo.bar".

Grüße
Flo

11.01.2010 - 13:31 Uhr

Hallo Midnight Run

Das geht - meines Wissens nach - nicht mit den klassischen XSD Bordmitteln. Du könntest höchstens Schematron verwenden. Das ist AFAIK im Framework noch nicht unterstützt - wobei es aber 3rd Party Libraries gibt.

Grüße
Flo

11.01.2010 - 13:27 Uhr

Hallo TripleX

Ich schließe mich den anderen an. Das cachen der EventArgs bringt zwar einen gewissen Performance-Vorteil der jedoch in den meisten Fällen in der Applikation nicht wirklich merkbar sein dürfte.

Worum geht's dir denn genau? Wenn du einen bestimmen Fall hast der potentiell zu Performance-Problemen führen kann, beschreibe den doch mal kurz.

Grüße
Flo

11.01.2010 - 13:08 Uhr

Hallo empty

Excel serialisiert immer alle Zellen einer Zeile bis innerhalb der Zeile keine Werte mehr kommen. Du kannst durch alle existierenden "Cell"-Elemente iterieren. Wenn du am Ende angekommen bist gelten alle Spalten welche nach der letzten vorhandenen Zelle Kommen als leer.

Grüße
Flo

11.01.2010 - 13:03 Uhr

Hi idzik

"Direkt Domain-Objekte" gibt's auch nicht. Ich meinte eher "direkt Domain Objekte" wobei "direkt" die Bedeutung "ohne Umweg" hatte. 👅

Domain Objekte (auch bekannt als "Domain Objects", "Business Objects" oder "Geschäftsobjekte") sind die Objekte welche den Business Logic Layer (BLL) zugeordnet sind und die Geschäftslogik einer Applikation ausmachen.

Lazy-Loading bedeutet, dass Linq2SQL (Linq-To-SQL oder L2S) jede Property zwischen Domain-Objekten auf die zugegriffen wird automatisch nachlädt. Bedeutet wenn du eine "Bestellung" serialisieren willst wird zuerst automatisch der mit der Bestellung verbundene "Kunde" nachgeladen und im nächsten Schritt automatisch alle Bestellungen des Kunden geladen. Damit ist die komplette Historie des Kunden im File. In die andere Richtung "Bestellung->Bestell Position->Produkt->Alle Bestell Positionen des Produkts->Alle Bestellungen aller Positionen->Alle Kunden->..." ist's das gleiche. Du siehst, Serialisierung von Domain-Objekten und Lazy-Loading führen schnell dazu, dass die komplette Datenbank serialisiert wird. Darum sollte man zur Serialisierung entweder mit DTOs (Transferobjekt) oder aber über entsprechende Meta-Informationen der Serialisierung mitteilen welcher Baum serialisiert wird.

Grüße
Flo

11.01.2010 - 12:49 Uhr

Hallo

Wie schon gesagt, ich glaube nicht dass sich Excel da beeinflussen lässt. Aber du kannst doch mit <xsl:if test="not(foo)">Do default handling</xsl:if> die Existenz eines Elements prüfen und entsprechend entscheiden ob du einen existierenden Wert verarbeitest oder ins Standard-Handling läufst.

Grüße
Flo

11.01.2010 - 12:44 Uhr

Hallo MasterTH

Setzt doch einfach mal einen Breakpoint in deine Form_Load und schau an welcher Stelle er rausfliegt. Außerdem über Menü->Tools->Customize gleich mal "Exceptions..." mit ins Debug-Menü aufnehmen und Break für CLR-Exceptions aktivierten.

Übrigens empfehle ich Win32-API erstmal sein zu lassen wenn du gerade mit C# anfängst 😉

Grüße
Flo

11.01.2010 - 12:36 Uhr

Hallo empty

die Frage wie man Excel (wenn überhaupt möglich) dazu bringt leere Zellen ebenfalls zu schreiben wäre wahrscheinlich im Office-Forum besser aufgehoben gewesen. Allerdings bezweifle ich dass man das Verhalten von Excel an der Stelle beeinflussen kann. Auch beim CSV Export lässt Excel leere Zellen grundsätzlich weg.

Warum handelst du das nicht selbst bei der Verarbeitung der Export-Datei?

Grüße
Flo

11.01.2010 - 12:33 Uhr

@TripleX
*.dbml ist eine Linq-To-SQL Meta-Datei. Das hat nix mit einem DataSet zu tun. L2S ist ein einfacher O/R-Mapper, der in den meisten Fällen eh einfacher zu verwenden ist als ein DataSet. Das ist nicht deine Datenbank sondern eine Datei welche die Datenbank beschreibt. Die Datenbank ist eine andere Datei die bei SQL Compact normalerweise direkt daneben liegt und auf *.sdf endet.

@idzik
Direkt Domain-Objekte zu serialisieren kann gefährlich sein. Vor allem weil Linq-To-SQL standardmäßig mit Lazy-Loading arbeitet. Damit ist schnell die komplette Datenbank serialisiert. 😉

Grüße
Flo