Laden...
A
alzaimar myCSharp.de - Member
Softwarearchitekt Berlin Dabei seit 15.01.2008 8 Beiträge
Benutzerbeschreibung

Forenbeiträge von alzaimar Ingesamt 8 Beiträge

25.07.2015 - 14:17 Uhr

Hupsa, übersehen... Aber der Timeout kommt von... wem? Das müsste sich aus der Exception ergeben. Da meckert doch ADO.NET, oder? Mit dem Profiler müsste man zudem genau erkennen können, was der Server so alles macht.

Nächster Versuch: Erzeuge eine Testtabelle und verwende dein Konstrukt dafür.
Klappt das? Wenn ja: Wo sind die Unterschiede?

Was ist 'result'? Ist das bereits ein Linq-Konstrukt? Müsste es eigentlich.
EDIT: Hier stand Murks: Erst testen, dann posten...

25.07.2015 - 13:07 Uhr

Linq2SQL übersetzt doch auch nur LINQ in SQL, d.h. wie sieht der konkrete Befehl denn aus? Deiner Antwort entnehme ich nicht, dass Du den konkreten Befehl im SSMS ausgeführt hast.

Ich tippe (blind) auf einen Fehler im SQL-Server. Also kein Bug, sondern irgend etwas mit der Query.

25.07.2015 - 08:59 Uhr

Du packst mehrere Funktionalitäten in eine Klasse: Verschlüsselung, Protokoll und Verarbeitung. Damit bist Du nicht flexibel und es verstößt noch gegen das Single-Responsibility-Prinzip.

Ich würde eine eigene Ver/Entschlüsselungs-Klasse mit den beiden Methoden 'Decrypt' und 'Encrypt' schreiben bzw. die beiden Methoden aus deiner Klasse rausschnippeln. Diese Klasse implementiert ein einfaches Interface:


Interface ICryptor 
{
  string Decrypt (string data, string key);
  string Encrypt (string data, string key);
}

Als nächstes definiere ich ein Interface, welches die Daten aus einem string extrahiert, bzw. dort hinhein stopfst.


Interface IDataTransportFileInformation
{
  string UserName {get;set;}
  string Filename {get;set}
  Bytes[] Content {get;set;}
  DateTime SendTime{get;set;}
  DateTime ReceiveTime {get;set;}
  TimeSpan Duration {get;}
  string CreateTransportMessage ();
  void ExtractFrom (string transportMessage);
}

Dann eine Klasse, die ein IDataTransportFileInformation-Objekt als Datei speichert bzw. aus einer Datei lädt.


Interface IDataTransportFileProcessor
{
  IDataTransportFileInformation FromFile(string filename);
  void ToFile (IDataTransportFileInformation fileInformation; string path);
}

Mit diesem Baukasten sehen deine Recieve-Methode so aus:


class DataTransferEngine
{
  ICryptor cryptor;
  IDataTransportFileProcessor processor;
   
public DataTransferEngine (ICryptor cryptor,  IDataTransportFileProcessor processor)
  {
    this.cryptor = cryptor;
    this.processor = processor;
  }

  public ReceivedFile(IDataTransportInformation transportInformation, string input, string path)
  {
     string decryptedInput = crypter.Decrypt(Input);
     transportInformation.ExtractFrom (decryptedInput);
     transportInformation.ReceiveTime = DateTime.Now;
     this.processor.ToFile (transportInformation);   
   }
 ...
}

Die try...except- Behandung habe ich herausgenommen, denn sie kaschiert den Grund für den Fehlschlag komplett (Disk voll, Dateiname ungültig, Daten korrupt).

Du erstellst ein IDataTransportInformation-Objekt, und übergibst es zusammen mit dem empfangenen String und dem Zielpfad an 'ReceivedFile'. Dort erfolgt die Verarbeitung. Sofern keine Exception geworfen wird, hast Du deine Datei und im DTI-Objekt alles, was Du über die Datei wissen musst.

Der Konstruktor deiner Klasse empfängt einen Cryptor und einen Processor, d.h. die Klasse erzeugt ihre Abhängigkeiten nicht selbst. Das nennt man DI ('Dependency Injection') und erleichtert das schreiben von Unittests.

25.07.2015 - 08:15 Uhr

Zunächst ist das sehr suboptimal umgesetzt, da bei jeder Zeile die komplette Query erneut ausgeführt wird. Wenn das so gewollt ist, bitte sehr. Ansonsten würde ich mir die ersten 120 Datensätze (wenn ich mich nicht verzählt habe) in eine Liste laden und dann die einzelnen Segmente separieren.

Zu deiner Frage: Um diese zu beantworten, benötigt man imho das Tabellenlayout oder einfacher: Den SQL-Befehl, den EF in der letzten Zeile absetzt.

09.05.2014 - 08:26 Uhr

Verwende doch einfach das
Change Tracking feature vom Server.

14.10.2008 - 18:59 Uhr

Wenn die Listenlänge die Zahlenbasis B darstellt und die Listenelemente die einzelnen 'Ziffern' des Nummernsystems, dann zählst Du einfache alle Zahlen bis zur Länge B zur Basis B auf.
Wenn Du eine Liste der Ziffern 0..9 übergibst bekommst Du also alle Zahlen von 0 bis 99999999.

Versuche Dich mal an Permutationen, Variationen, Kombinationen usw. Es sollte durch klitzekleine Änderung des Originalcodes möglich sein, diese Grundfunktionen der Kombinatorik herzuleiten.

11.10.2008 - 13:41 Uhr

Hallo,

Mein erstes Posting. Normalerweise arbeite ich mit Delphi, aber C# gehört nunmal die Zukunft und daher fange ich an, mich von Delphi zu lösen und mich mit C# anzufreunden. Das wird eine wunderbare Beziehung, glaube ich.

Gut, genug geschleimt.

Ich greife von einer C#-Anwendung auf ein COM-Objekt zu, das mir ein OleVariant liefert. In diesem Fall ein Array of Byte. Ich habe herausgefunden, das ich von dem c# object die ersten 27 Bytes wegschnippeln muss, um an die Daten heranzukommen. Klappt auch, ist aber irgendwie gefrickelt.

Gibt es in Dot.Net eine Möglichkeit, die Typinformationen aus einem OleVariant zu extrahieren und dann in einen konkreten C#-Typen zu konvertieren?

Bei Google hab ich nichts gefunden.

15.01.2008 - 12:55 Uhr

Hi,

Ich muss einen Wizard implementieren, bei dem der Anwender eine Datei angeben muss. Dazu benutze ich das FileUpload-Control. Um den Inhalt der Datei zu prüfen, habe ich ein CustomValidate mit dem FileUpload verbunden.

edXLSfile = new FileUpload();
edXLSfile.ID = "edXLSFile";
CustomValidator val = new CustomValidator();
val.ControlToValidate = edXLSfile.ID;
val.ErrorMessage = "foobar";
val.ServerValidate += new ServerValidateEventHandler(CheckXLSFile);
val.Enabled = true;
val.ValidateEmptyText = true; // das MUSS sein, sonst feuert der ServerValidate-Event überhaupt nicht!
MywizardStep.Controls.Add (edXLSfile);
MywizardStep.Controls.Add (val);

Das ServerValidate-Ereignis sieht so aus:

private void CheckXLSFile(object source, ServerValidateEventArgs args)
    {
      args.IsValid = true;
      if (args.Value.Length == 0)
...

Der Event feuert, wenn ich auf 'Weiter' klicke. Blöderweise ist nun jedoch args.Value = <leerer String>, obwohl ich eine Datei ausgewählt habe.

Dies ist mein erstes Projekt in ASP.NET (mache seit 25 Jahren Pascal/Delphi), also vermute ich mal, das ich etwas Grundlegendes nicht verstanden habe. Nur was?

Ich würde mich über Denkanstöße oder auch eine simple Lösung sehr freuen.

Danke für die Mithilfe und Anteilnahme.

[edit]
Ich Depp!

Ich habe immer manuell 'C:\Foobar.TXT' in die Fileupload-Textbox engetippt.
DAS funktioniert wirklich nicht, aber wenn ich per 'Durchsuchen' eine Datei auswähle, klappt alles wunderbar...

FRAGE: Wie kann ich also einen eingetippten Dateinamen validieren?

[/edit]