Laden...

Forenbeiträge von Sarc Ingesamt 417 Beiträge

04.04.2016 - 15:34 Uhr

Hallo,

der Fehler wird ja schon deutlich beschrieben: > Fehlermeldung:

[error CS0119: 'FlexConverter.Convert(object)' ist 'Methode' und im angegebenen Kontext nicht gültig.

Sprich: Da es sonst eine Namens-Überschneidung deiner Methode mit der Convert-Klasse gibt, musst du die Convert-Klasse explizit angeben, d.h. System.Convert.ToInt32.

IMHO musst du casten, da Convert.ToInt32 einen Wert vom Typ int liefert und kann nicht einer Variable vom Typ object zugewiesen werden.

Da muss kein cast stattfinden, andersherum (von object auf int) wäre es jedoch nötig.

01.03.2016 - 17:14 Uhr

Hallo,

zu 1.: Nein, ist momentan nicht vorgesehen. Am Projekt wird (meinerseits) nicht mehr wirklich aktiv weiterentwickelt.
zu 2.: Die Komponente rendered lediglich einzelne PDF-Seiten als Bilder, daher wird hier keine Erkennung von (Hyper-)links unterstützt.

Gruß

24.02.2016 - 16:01 Uhr

HttpClient / DownloadFileAsync gibt es jedoch ebenfalls nicht in NetCore

Hierzu kannst du System.Net.WebRequest verwenden, z.B.:

var fileRequest = WebRequest.Create("http://www.example.com/somefile.txt");
19.02.2016 - 13:54 Uhr

Ja, sehe ich auch so wie Coffeebean.
Lässt sich leicht berechnen:

var dt = new DateTime(1970, 1, 1).AddSeconds(1455829972);
08.01.2016 - 17:08 Uhr

...bei dir funktioniert, so ganz ohne set-accessor. oO

Das ist ein C# 6 Feature (https://msdn.microsoft.com/en-us/magazine/dn802602.aspx)
Folgendes wäre ebenso möglich:

public IList<string> List { get; } = new List<string>  {"Test", "Test2" };
06.01.2016 - 13:00 Uhr

(ist man so paranoid wie ich, würde man's über
>>
aus der registry lesen)
Was mit DNX nicht mehr funktionieren wird 😃){gray}

Als kleine Korrektur: Es wird nur unter der .NET Core Runtime nicht mehr funktionieren. Solange man das "normale .NET" nutzt geht das auch weiterhin mit dnx (bzw. aktuell net451).

03.12.2015 - 21:55 Uhr

Hallo,

ich weiss zwar nicht, ob das das Standardvorgehen ist, aber über die Script Directive kannst du deine .dll einbinden und dann verwenden.

#r "../Path/to/your/dll.dll"

Klappt bei mir einwandfrei.

20.11.2015 - 13:38 Uhr

Hi,

das Auslesen passt schon, allerdings überschreibst du ja den label.Content immer wieder, wodurch das Label natürlich immer den Text des letzten Elements enthält.

Mach einfach hitfinderTable.Rows.First() und lies dir nur hierzu die jeweiligen Tabellenzellen aus.

19.11.2015 - 19:00 Uhr

Am einfachsten ist, wenn du über den NuGet Package manager nach AngleSharp suchst und es hierüber einbindest.
Beispiele zur Anwendung findest du unter: https://github.com/AngleSharp/AngleSharp/wiki/Examples

19.11.2015 - 18:02 Uhr

Hi,

ich würde das nicht mit Regex lösen, sondern mit einer speziellen HTML-Parser library, z.B. AngleSharp (https://github.com/AngleSharp/AngleSharp)
Hier kannst du dann auch Query selektoren angeben, um einfach an HTML-Elemente zu gelangen, z.B. bei dir zu einem span mit der id headerTracklistCurrentSongArtist.

26.10.2015 - 20:51 Uhr

Hallo,

wieso weisst du nicht was in der web.config steht? Die wird doch von dir erzeugt und hochgeladen...
Funktioniert der Zugriff auf SQL Azure denn wenn du die Anwendung lokal startest? Dann wüsstest du schonmal ob der connectionstring passt.

03.10.2015 - 21:32 Uhr

In solchen "kleinen" Projekten zeigt sich halt der Mehrwert mancher "Best practices" nicht bzw. nicht sofort.
Du könntest z.B. auch in einem kleinen Projekt einen Caching-Layer einbauen, das Repository- und Unit of Work-Pattern in der Datenzugriffsschicht und Dependency Injection für eine bessere Trennung verwenden etc.
Aber wie du ja sagst, ist die Komplexität des Programms sehr gering, wodurch wohl eher ein overhead, als ein echter Nutzen dieser Maßnahmen entstehen würde.

Es ist natürlich an sich sinnvoll sich mit den Entwurfsmustern und z.B. der Funktionsweise von OR-Mappern zu beschäftigen (mit deren Vor- und Nachteilen). Ein kleines Projekt bietet hierzu gute Möglichkeiten, aber ob ein OR-Mapper nun die optimale Datenzugriffsmöglichkeit darstellt kann man nicht sagen. Was heisst "optimal"? Jeder der Ansätze hat Vor- und Nachteile die man abwägen muss.

PS: Falls du es machst um zu lernen, würde ich Webforms in die Tonne packen und stattdessen MVC oder Wep-API Projekte verwenden. Das ist meiner Meinung nach zukunftsträchtiger.

03.10.2015 - 21:14 Uhr

Hallo,

also den optimalen Weg genau für deine Anwendung wirst du hier sicher nicht erfahren.
Da sind einfach zu viele Unbekannte.
Die Frage ist doch, wieso möchtest du deine Anwendung umstrukturieren?
Einfach so (wg. "Best practices") oder hast du konkrete Probleme (Performance o.ä.)?

Als Beispiel: Du kannst natürlich das Entity Framework verwenden, aber wenn du es machst um die Performance zu verbessern, dann wäre es das falsche Vorgehen, da du mit deinen nativen sql-statements schneller bist. Zumal ja auch die Komplexität des Programms nicht so hoch ist, dass ein OR-Mapper zur einfacheren Handhabung notwendig erscheint.

PS: Aber schonmal gut, dass du dich von Access verabschiedest 😉

03.10.2015 - 20:17 Uhr

Hallo,

pauschal lässt sich das nicht sagen, obwohl ich zu Variante 1 tendiere.
Ein Faktor könnte z.B. die maximale Größe einer Nachricht der Messagequeue sein. Falls deine Payload größer als ein paar KB sein sollte, gibt es möglicherweise Einschränkungen seitens Azure Service Bus.
Variante 2 könnte problematisch sein falls du replizierte und nicht (bzw. letztendlich) konsistente Datenspeicher verwendest. Wenn beim Einfügen deiner Nachricht in die Queue beispielsweise noch nicht alle Replikate aktualisiert wurden und sich deine Queue die Daten aus einem nicht aktualisierten Replikat holt, dann wäre das ein Problem.
Zudem vermeidet Variante 1 eine Abhängigkeit zum Ticket-Service.

20.09.2015 - 06:29 Uhr

Den Stackoverflow-Beitrag habe ich auch schon gefunden und habe es auch damit schon versucht.
Leider hat das auch nicht geholfen.

Edit:
Es scheint wohl doch an einer Besonderheit von Asp.net 5 zu liegen. Ich habe nochmal zwei neue Web-Projekte angelegt, jeweils für das "alte" Asp.net und Asp.net 5.
Bei vorigem funktioniert gzip für .js problemlos. In Asp.net 5 leider nicht.

Edit 2:
Problem gelöst. In Asp.net 5 werden bei Verwendung von static files die Dateierweiterungen separat verwaltet: https://github.com/aspnet/StaticFiles/blob/dev/src/Microsoft.AspNet.StaticFiles/FileExtensionContentTypeProvider.cs
Die Lösung ist, in der Startup-Klasse anstelle von app.UseStaticFiles() folgendes zu verwenden:

var option = new StaticFileOptions();
var contentTypeProvider = (FileExtensionContentTypeProvider)option.ContentTypeProvider;
contentTypeProvider.Mappings.Remove(".js");
contentTypeProvider.Mappings.Add(".js", "text/javascript");
app.UseStaticFiles(option);
19.09.2015 - 21:35 Uhr

Hallo Abt,

die statische Kompressionskomponente ist installiert. Im normalen IIS funktioniert ja auch alles wunderbar, nur nicht im IIS-Express.
Ich habe in der Config auch bereits text/javascript versucht, jedoch ohne Erfolg.

19.09.2015 - 21:27 Uhr

Hallo,

ich habe ein Problem mit dem IIS-Express (Version 10.0) und gzip. Es handelt sich um eine Asp.Net 5-Anwendung, falls das eine Rolle spielen sollte.
Leider werden keine .js-Dateien vom IIS-Express mit gzip komprimiert. Für statische .html-Dateien funktioniert das einwandfrei.
Ebenfalls funktioniert gzip für .js-Dateien im normalen IIS (nicht Express) in der Version 8.5.
Ich habe schon viele Änderungen der Config versucht. Hier ist der Abschnitt zur Compression:

<httpCompression directory="%TEMP%\iisexpress\IIS Temporary Compressed Files">
	<scheme name="gzip" dll="%IIS_BIN%\gzip.dll" />
	<dynamicTypes>
		<add mimeType="text/*" enabled="true" />
		<add mimeType="message/*" enabled="true" />
		<add mimeType="application/x-javascript" enabled="true" />
		<add mimeType="application/javascript" enabled="true" />
		<add mimeType="*/*" enabled="false" /> 
	</dynamicTypes> 
	<staticTypes> 
		<add mimeType="text/*" enabled="true" /> 
		<add mimeType="message/*" enabled="true" /> 
		<add mimeType="application/x-javascript" enabled="true" /> 
		<add mimeType="application/javascript" enabled="true" /> 
		<add mimeType="application/atom+xml" enabled="true" /> 
		<add mimeType="application/xaml+xml" enabled="true" /> 
		<add mimeType="*/*" enabled="false" /> 
   </staticTypes> 
</httpCompression>

Hat jemand eine Idee an was es liegen könnte, dass .js-Dateien nicht gzip't werden oder kann das "Problem" reproduzieren?

11.09.2015 - 13:50 Uhr

Hmm, ich kann dein Problem nicht reproduzieren. Wenn ich folgendes ausführe, wird der komplette div aus dem DOM entfernt:

<html>
<body>
<div class="parent">
          <input class="ui-btn delete" type="button" value="Löschen">
          <div>
             <input id="Facher_0__ID" type="hidden" value="1" name="Facher[0].ID">

             <div class="ui-input-text ">
                  <label >Nummer:</label>
                   <input id="Facher_0__Name" type="text" value="1" name="Facher[0].Name">
            </div>

           </div>
</div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
$(document).ready(function(){
$(".delete").click(function(){
	$(this).parent().remove();
});
});
</script>
</body>
</html>
11.09.2015 - 12:44 Uhr

Hallo,

$(this).parent('div').remove(); sollte den entsprechenden div aus dem DOM entfernen. Was funktioniert denn nicht?

10.09.2015 - 13:33 Uhr

Das geht mittels [FromBody]-Attribut und hat mit dem Routing nichts zu tun.

public IActionResult ControllerMethod([FromBody]DeinModel model)
{ ... }
09.09.2015 - 14:29 Uhr

Hi,

das wird so aufgrund des [ValidateAntiForgeryToken]-Attributs nicht funktionieren.
Damit soll ja gerade sichergestellt werden, dass keine Cross-Site requests (in diesem Fall von deiner Windows App heraus) gemacht werden.

05.09.2015 - 21:11 Uhr

Ich verstehe nicht, was an meiner genannte Variante mit Dynamic Proxy so "unelegant" ist.
Es ist weniger Aufwand als mit Regex und zudem wiederverwendbar.
Die Anforderungen (d.h. kein Zugriff auf die Implementierung noch auf die Factory) geben nicht viel weitere Möglichkeiten her als einen Wrapper zu nutzen.

05.09.2015 - 07:29 Uhr

Hallo,

bei dieser Ausgangssituation wirst du wohl über einen dynamischen Proxy nicht herumkommen.
Eine mögliche Library hierfür wäre https://github.com/Curit/DynamicProxy

Basierend darauf zeigt das folgende Beispiel wie du einen Proxy erstellst, die entsprechende Methode abfängst und mit deiner Implementierung ersetzt. Zunächst die Dinge die du kennst, nämlich die Schnittstelle und die Implementierung (auch wenn diese für dich unveränderbar sind):

public interface ITest
{
	string NotInterceptedMethod();
	int DoStuff(int a, int b);
}

public class Test : ITest
{
	public string NotInterceptedMethod()
	{
		return "Hello World";
	}

	public int DoStuff(int a, int b)
	{
		return a + b;
	}
}

Die Standardimplementierung von DoStuff liefert die Addition zweier Zahlen zurück. Wir wollen jedoch eine Multiplikation daraus machen:

public static class Program
{
	static void Main(string[] args)
	{
		ITest test = new Test(); // Objekt für das der Proxy erstellt werden soll
		ITest proxiedTest = ProxyFactory<ITest>.Proxy<ITest>(test);
		var proxy = proxiedTest as IProxy<ITest>;
		proxy.AddInterceptor<int, int, int>((obj,a,b) => obj.DoStuff(a, b), (func, a, b) =>
		{
			// wir fangen den Aufruf von DoStuff ab und ersetzen die Standardimplementierung durch eine Multiplikation
			return a * b;
		});

		var res = proxiedTest.DoStuff(4, 7); // liefert 28 und nicht 11

		Console.WriteLine(res);
		Console.WriteLine(proxiedTest.NotInterceptedMethod()); // zeigt, dass die nicht abgefangene Methode, das Ergebnis aus dem Originalobjekt liefert
		Console.ReadLine();
	}
}
22.08.2015 - 18:03 Uhr

Durch das (versehentliche) weglassen von "public" definierst du die Klasse als private und kannst sie damit nicht als event argument einer anderen public Klasse verwenden.

Als Korrektur/Ergänzung dazu: Die fehlende Angabe der Klassensichtbarkeit führt dazu, dass die Klasse internal und nicht private ist.
Elementdefinitionen ohne Sichtbarkeitsmodifikator innerhalb einer Klasse/Struct sind jedoch private.

25.06.2015 - 10:55 Uhr

Hallo,

also mittels regulärem Ausdruck ist das ein Einzeiler:

var res = Regex.Replace("0B0000CF", "0+", m => m.Value.Length.ToString());

Wenn du es ohne Regex lösen willst/musst, kannst du Zeichenweise durch den String iterieren und musst dir dann eben nen status merken (counter hochzählen falls das aktuelle Zeichen 0 ist bis keine 0 mehr kommt) und das ganze dann einem neuen String hinzufügen.
Nur mittels der normalen String.Replace-Methode lässt sich das Problem nicht lösen.

23.06.2015 - 10:48 Uhr

Hallo,

durch die Konvertierung nach base64 steigt die Datengröße etwa um 1/3 an, was nicht Effizienz-förderlich ist.

11.06.2015 - 11:02 Uhr

Hi,

da du vor deinem "Take(Limit)" schon ToList() aufrufst, liest du bereits alle Zeilen aus der DB und filterst dann erst im Speicher, was sicher nicht dein Ziel ist.

22.05.2015 - 12:37 Uhr

Damit habe ich mir die 1Zeile in flines gespeichert und zuvor ausgegeben. Das Passt alles 😃

Das was du da machst passt eben nicht. Du rufst zweimal reader.ReadLine() auf, d.h. du liest hier die ersten beiden Zeilen. Die erste speicherst du nicht, sondern gibst es nur in der MessageBox aus.

22.05.2015 - 11:37 Uhr

Hallo,

du liest ja mit while (reader.ReadLine() != null) die erste Zeile, aber speicherst Sie nicht. Daher taucht sie bei dir nicht auf.

28.04.2015 - 16:49 Uhr

Hallo,

ich habe einen PDF-Viewer erstellt, der die Voraussetzungen erfüllt: http://www.codeproject.com/Articles/579878/MoonPdfPanel-A-WPF-based-PDF-Viewer-Control

Er basiert auf MuPdf (http://mupdf.com/) und kann unter der GPL 3 verwendet werden.
Für eine kommerzielle Nutzung der "libmupdf.dll" (DLL von MuPdf) müsstest Du bei MuPdf nachfragen, was das kosten würde.

10.04.2015 - 18:35 Uhr

Hi,

laut dieser Seite https://technet.microsoft.com/de-de/sysinternals/dd564733 musst du die Assembly Interop.WMPLib.dll einbinden.

07.04.2015 - 16:51 Uhr

Ohne den restlichen Code zu kennen ist es schwer zu antworten.
Versuch doch noch ein detaillierteres Debugging, um den Fehler einzugrenzen.
Z.B. das TraceLevel hochsetzen, siehe: http://www.wpf-tutorial.com/data-binding/debugging/

07.04.2015 - 15:52 Uhr

Hallo,

ohne die genaue Datenstruktur zu kennen müsste ich raten.
Evtl. ein Tippfehler: "LastName" statt "Lastname"?
Oder aber das Objekt für "Contact" ist null.

02.04.2015 - 19:37 Uhr

Hallo,

hast du schon versucht die SVG Dateien in XAML zu konvertieren und dann diese zu laden?
Konvertieren klappt mit SharpVectors wunderbar.

30.03.2015 - 19:08 Uhr

Hi,

also wenn die Felder editierbar bleiben sollen, müsste folgendes klappen:

stamper.FormFlattening = false;
25.03.2015 - 20:45 Uhr

Das Problem hier ist die Kovarianz (siehe auch https://msdn.microsoft.com/de-de/library/ee207183.aspx)

Dass du ObservableCollection<User> nicht in ObservableCollection<IEntityBase> casten kannst ist gut so, denn ansonsten wäre die Typsicherheit futsch.
Du könntest dann ja nämlich in deiner Methode irgendein Objekt, welches IEntityBase implementiert, in die Liste stecken, welche ja eigentlich nur User-Objekte enthalten darf.

Wenn du den konkreten Typ nicht brauchst, sondern es dir nur um das Abonnieren des Events geht, würde ich die Variante von MrSparkle nehmen.

20.03.2015 - 15:23 Uhr

Ich sagt ein Command kümmert sich um das Nachladen, nicht das ViewModel.
Der Command holt sich die Daten aus dem BL und übergibt diese an das ViewModel.
Das ViewModel darf nicht wissen woher die Daten kommen.

20.03.2015 - 15:09 Uhr

Die Daten vorher holen und dann dem ViewModel beim erzeugen mit in den Konstruktor geben, oder noch anders?

Ja.

Das ViewModel darf nur wissen was es für Daten hat, aber nicht wie es an die Daten kommt.
Stell dir vor, das laden der Vokabeln dauert lange, dann müsstest du innerhalb des ViewModels z.B. eine asynchrone Verarbeitungslogik einbauen, damit die UI nicht einfriert.
Das ist nicht Aufgabe des ViewModels.

Wie würdest du denn vorgehen, wenn der Benutzer Daten nachladen können soll? Button ist an ein Command im VM gebunden.

Das ViewModel hat ja eine ObservableCollection, d.h. ein Command kümmert sich um das Nachladen der Vokabeln (evtl. sogar asynchron) und fügt diese dann der ObservableCollection hinzu. Dadurch wird das ViewModel automatisch aktualisiert.

20.03.2015 - 13:33 Uhr

Macht ihr dies alles an einer stelle?

Das übernimmt typischerweise ein DI-Framework, welches die Komponenten erzeugt und Abhängigkeiten injeziert.

Die Frage ist auch, ob das ViewModel den BL kennen sollte. Das ViewModel ist ja nur für die Anzeige der Daten verantwortlich.
Ich würde die Vokabeln dem ViewModel übergeben, und nicht dem ViewModel die Aufgabe überlassen, die Vokabeln aus dem BL zu extrahieren.

19.03.2015 - 18:49 Uhr

Es gibt im Internet leider so viele unterschiedliche Meinungen zu Entwurfsmustern, dass man nur sehr schwer den Einstieg findet.

Ich denke für Einsteiger ist es immer schwerer die Zusammenhänge zu sehen, aber es sollte zu den meisten gängigen Prinzipen keine unterschiedlichen Meinungen geben.
Prinzipien wie Kapselung, Single Responsibility Principle (SRP) oder Dependency Injection sind nunmal sinnvoll.
In deinem gezeigten Code werden leider einige Prinzipien verletzt bzw. nicht angewandt:1.In deiner BusinessLayer Klasse ist die interne Struktur Vokabeln (List<Vokabeln>) für Aufrufer sichtbar. Durch einen Aufruf von Vokabeln.Clear(); löscht ein anderes Objekt dann mal eben alle Vokabeln -> nicht gut 1.Durch IVokabelRepository rep = new VokabelRepository(); gewinnst du leider garnichts. Solange du die Abhängikeit IVokabelRepository nicht von aussen (über den Konstruktor) injezieren lässt, bringt die Verwendung eines Interfaces nicht viel. 1.Die Klasse BusinessLayer war hoffentlich nur beispielhaft so benannt, denn deinen kompletten Business Layer wirst/solltest du nicht in ein Klasse packen um SRP nicht zu verletzen.

Edit:
Noch zu deiner Frage "Ist es denn dann wirklich Sinnvoll die Collection zusätzlich im BL zu halten? Oder sieht jemand einen "richtigeren" Ansatz?"
Ich denke es kommt darauf an was du mit der Collection noch vor hast.
Der Aufruf rep.Save(Vokabeln); gefällt mir z.B. nicht. Hier übergibst du ja alle Vokabeln. Das mag für einen Datei-basierten Ansatz ausreichen, wo du alle Vokabeln auf einmal als Datei wegschreibst.
Aber wenn du z.B. später eine Datenbank verwenden möchtest, ist der Ansatz nicht mehr so toll.
Denn dann muss sich der DAL darum kümmern, welche Einträge in der DB aktualisiert werden soll. Das ist nicht die Aufgabe des DAL -> SRP.
Es wäre besser eine ChangeTracker-Komponente zu bauen, welche die Änderung des Benutzers kennt.
Die geänderten Einträge könntest du dann im Business Layer an die Save-Methode übergeben und dann weiter an den DAL delegieren.

06.03.2015 - 16:36 Uhr

Hallo,

es gibt bereits bestehende Libraries, die das Abspielen von Streams ermöglichen.
Das geht übrigens auch mit der MediaPlayer-Klasse (System.Windows.Media).
Das Ansteuern von verschiedenen Ausgabegeräten geht hier meines Wissens aber nicht.

Weitere libs zum Abspielen von Audio (inkl. Web-Streams)

04.03.2015 - 16:00 Uhr

Letztendlich reicht dir ein einfacher BackgroundWorker.
In deine Run_Button_Click packst du:

BackgroundWorker w = new BackgroundWorker();
w.DoWork += w_DoWork;
w.RunWorkerCompleted += w_RunWorkerCompleted;
w.RunWorkerAsync();

Methoden definieren:

void w_DoWork(object sender, DoWorkEventArgs e)
{
    // wird im Hintergrundthread abgearbeitet
    datenLaden(); //Lädt ein paar Daten aus einer XML
    berechneUnfallfreieTage(); //Berechnet anhand der Daten aus der XML die Tage die Zwischen heute und dem Zuletzt eingetragenen Unfall
}

void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // wird im UI thread aufgerufen
    datenAnzeigen();
}

Das sollte es gewesen sein.

24.02.2015 - 13:15 Uhr

Hallo,

schreib dir für den Vergleich am Besten einen eigenen Comparer.
Damit kannst du dann später auch die Elemente gruppieren.
z.B. so (vereinfacht):

public class Bohrung
{
	public double Start;
	public double End;
}

public class BohrungComparer : IEqualityComparer<Bohrung>
{
	public bool Equals(Bohrung x, Bohrung y)
	{
		return x.Start == y.Start && x.End == y.End;
	}

	public int GetHashCode(Bohrung obj)
	{
		return 0;
	}
}

// verwendung dann etwa so:
var list = new List<Bohrung>();
list.Add(new Bohrung() { Start = 1, End = 2 });
list.Add(new Bohrung() { Start = 4, End = 2 });
list.Add(new Bohrung() { Start = 1, End = 2 });

// groups enthält 2 Gruppen
var groups = list.GroupBy(f => f, new BohrungComparer());
10.02.2015 - 09:35 Uhr

Du hattest in deinem ursprünglichem Code ja ein count(t.ID) drin, welches ja dem entspricht was du machen möchtest, nämlich der Anzahl der Einträge, welche deiner Query entsprechen.
Wenn du diese Query mittels ExecuteScalar aufrufst, erhältst du die gewünschte Anzahl der Einträge.

Ich verstehe nicht wie du die gleiche Methdoe für Selects und Updates verwendet haben willst. Deine Methode CountTransaktionenLines enthält doch nur das select-Statement, womit ja keine Änderungen an der DB möglich sind. Evtl. hab ich auch noch nicht verstanden was du damit meinst.

10.02.2015 - 09:15 Uhr

Hallo,

du verwendest Execute++Non++Query, welches für Datenbankaktualisierungen (non-queries) gedacht ist.
Die Methode gibt die Anzahl der veränderten Datensätze zurück, welche in deinem Fall natürlich 0 ist, da du ja ein Select ausführst.
Verwende statt dessen die ExecuteScalar-Methode.

06.02.2015 - 16:56 Uhr

Hallo,

also die Levenshtein-Distanz wäre eher bei Stringvergleichen angebracht.

Ein abstrakterer Ansatz wäre es die Übereinstimmungen bzw. Unterschiede als Bit-Vektor auszudrücken.
Basierend auf deinem Beispiel wäre das für "D E F A C" z.B.:

D E F C A
0 0 0 1 1

C E F A D
1 0 0 0 1

E A F A C
1 1 0 0 0

Es ist auch die Frage was du als "bestes" Ergebnis definierst. Im obigen Beispiel wären alle Algorithmen von der Distanz her "gleich gut".
Wenn für dein Szenario beispielsweise die Ergebnisse am Anfang der sortierten Liste wichtiger sind als die am Ende, dann könntest du das entsprechend gewichten, z.B. mit einer absteigenden Gewichtung mit "5 4 3 2 1":

Alg. 1: (5 * 0) + (4 * 0) + (3 * 0) + (2 * 1) + (1 * 1) = 3
Alg. 2: (5 * 1) + (4 * 0) + (3 * 0) + (2 * 0) + (1 * 1) = 6
Alg. 3: (5 * 1) + (4 * 1) + (3 * 0) + (2 * 0) + (1 * 0) = 9

In diesem Fall wäre Alg. 1 der beste Algorithmus, da er die "Fehler" erst bei den letzten Elementen der sortierten Liste macht und aufgrund der Gewichtung die kürzeste Distanz zum optimalen Ergebnis hat.

28.01.2015 - 11:28 Uhr

Hallo,

na du reichst einfach die EventArgs weiter und wertest sie dann aus:

var args = new UnsavedItemsEventArgs();
RaiseOnUnsavedItemsDetected(args);

if( args.DropChanges )
...

Die RaiseOnUnsavedItemsDetected muss du halt entsprechend anpassen:


protected virtual void RaiseOnUnsavedItemsDetected(UnsavedItemsEventArgs args)
    {
      OnUnsavedItemsDetectedEventHandler handler = OnUnsavedItemsDetected;
      if (handler != null)
      {
        handler(this, args);
      }
    }

16.12.2014 - 19:47 Uhr

Hallo,

nicht gerade eine Checkliste, aber les dir mal die Spezifikationsorientierten und Strukturorientierte Verfahren auf folgender Seite durch: Dynamisches Software-Testverfahren

Interessant ist u.a. die Bildung von Äquivalenzklassen. In deinem Beispiel könnte man testen,
wie die Software reagiert wenn es z.B. 0, 1 oder mehrere Kunden gibt.
Hängt halt immer von den Anforderungen ab, was genau sinnvoll ist zu testen.

01.12.2014 - 10:38 Uhr

Ist das denn die 1:1-Version der Methode die nicht funktioniert, oder hast du noch was weggelassen/geändert?
Du manipulierst ja in der Methode keine Zustände (Methode sollte daher auch statisch sein), somit muss die Methode idempotent sein.
Ich erkenne zumindest nicht, wieso das nachfolgende Aufrufen der Methode unterschiedliche Ergebnisse bringen sollte.

01.12.2014 - 10:27 Uhr

Hallo,

woher genau kommt die Variable node und wieso wird der Parameter parent nicht genutzt?