Zum Inhalt

Schlagwort: .NET

string to Stream and vice versa

As I needed this some times in the past few days I think maybe someone else could also benefit from this.

1
2
3
4
5
6
7
8
9
public static Stream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}
1
2
3
4
5
6
7
public static string GenerateStringFromStream(Stream s)
{
    s.Position = 0;
    StreamReader reader = new StreamReader(s);
    string text = reader.ReadToEnd();
    return text;
}

32 oder 64 bit Applikation?

Aus Gründen hatte ich heute die Notwendigkeit anhand einer vorhandenen ausführbaren (.NET-)Datei zu erkennen, ob es sich hierbei um die 32 oder 64 bit Version eines Programms handelt. Nach einer kurzen Recherche stellt sich heraus, dass es wirklich einfach ist, dieses Information zu ermitteln. Gut beschrieben findet man das Ganze hier:

64 bit – How to check if a binary is 32 or 64 bit on Windows? – Super User

Zusammenfassend kann man sagen, dass man die exe-Datei einfach mittels einem Texteditor, bspw. Notepad++, öffnet und dann nach der Zeichenfolge „PE“ sucht. Danach findet man entweder „L“ (32bit) oder „d†“ (64bit) und schon ist die Information gefunden.

TIL – IntelliTrace „bremst“ ADO.NET Aktionen

Das „bremst“ im Titel steht ganz bewusst in Anführungszeichen, aber ein besserer Begriff ist mir für dieses Verhalten nicht eingefallen. Ich wollte heute eigentlich eine ganze einfache Datenbankoperation im Rahmen eines Programms implementieren. Es sollte einfach eine bestimmte Menge Datensätze generiert (ca. 1500) und in einer SQL Server Tabelle persistiert werden. Je nach Performanz des SQL Server eigentlich eine Sache von unter 1 Sekunde.

Allerdings kam mir dann IntelliTrace in die Quere bzw. hat dafür gesagt, dass die Datenbankoperation scheinbar mehr Zeit in Anspruch genommen hat, als ich vorher gedacht habe. Fairerweise muss ich sagen, dass ich mich mit IntelliTrace bis zu diesem Zeitpunkt noch nicht detailliert bis gar nicht auseinander gesetzt habe. Eine gute Einleitung in IntelliTrace bietet 1. Auf jeden Fall ist IntelliTrace seit 2010 ein Bestandteil von Visual Studio. Allerdings werden die IntelliTrace Information seit VS2015 nicht mehr in einem eigenen Fenster dargestellt, sondern sind jetzt in einem Tab in den Diagnostic Tools integriert.

Grundsätzlich gibt es die Möglichkeit mittels IntelliTrace alle Informationen zu sammeln und später zu filtern oder nur die Information zu sammeln, die einen konkret interessieren, und später nicht mehr filtern zu müssen. Genau dieser Umstand bzw. die Tatsache das hierbei bestimmte Defaults gesetzt hatzu dieser „Bremse“ geführt.

Der gesamte Code für dieses einfache Beispiel sieht wie folgt aus, wobei das wirklich nur ein Beispiel ist, um das Verhalten zu demonstrieren und so mit Sicherheit nicht für einen produktiven Einsatz gedacht/geeignet ist.

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Demo"].ConnectionString);
conn.Open();
 
SqlTransaction trans = conn.BeginTransaction();
Console.WriteLine("Start: {0}", DateTime.Now);
for (int i = 0; i < 2000; i++)
{
    SqlCommand command = new SqlCommand();
    command.Connection = conn;
    command.Transaction = trans;
    command.CommandText = "INSERT INTO dbo.OpenWeek (Id, CW, [User], Completed) VALUES ("+i+", 201611, 'Demo" + i +
                        "', 0);";
    command.ExecuteNonQuery();
}
trans.Commit();
Console.WriteLine("Start: {0}", DateTime.Now);
Console.WriteLine("Done");
Console.ReadKey();

Mit den Standardeinstellungen habe ich immer ungefähr die folgenden Zeiten erreicht.

In den Diagnostics Tools habe ich dann die folgenden Information gesehen:

Danach habe ich den Einstellungen von IntelliTrace sämtliche ADO.NET Events deaktiviert.

Danach sind die Zeiten entsprechend so, wie ich sie ursprünglich erwartet habe.

Da ich, wie Eingangs erwähnt, mich noch nicht im Detail mit IntelliTrace befasst hatte, hat mich erst 2 auf den richtigen Weg gebracht. Abschließend sei aber noch gesagt, dass einem IntelliTrace erst in die „Quere“ kommt, wenn man die Enterprise Edition einsetzt. In der Professional und Community Edition von Visual Studio ist dieses Feature nicht enthalten.

Falls jemand gerade kein VS2015 Enterprise Edition zur Hand hat und sich dieses Feature dennoch ansehen möchte, so gibt es unter 3 eine fertige virtuelle Maschine in der eine entsprechende Umgebung fertig eingerichtet ist. Weiterhin gibt es auch ein schönes Hands-On Lab 4, welches einem den Umgang mit IntelliTrace näher bringt.

TIL – Spaß mit Bitmasken

Häufiger hat man die Anforderung bestimmte Einstellungen zu speichern. In manchen Fällen kann man pro Einstellung bspw. ein Datenbankfeld verwenden und jeweils mit einem Tinyint den Zustand speichern. Allerdings gibt es auch Fälle in denen es Sinn ergeben kann hierfür eine Bitmaske zu verwenden.

Hilfreich ist, dass das .NET Framework alle Werkzeuge, auch für die Konvertierungen zwischen den verschiedenen Datentypen, von Haus aus schon mitbringt.

Hierzu kann man einfach eine simple Enumeration erzeugen und mittels des „Flags“ Attribut kennzeichnen, dass die Enumeration auch als Bitfeld genutzt werden kann.

Ein einfaches Beispiel hierfür kann wie folgt aussehen:

[Flags]
public enum EditDataMode
{
    Create = 1,
    Read = 2,
    Update = 4,
    Delete = 8
}

Eine Instanz kann nun wie folgt erzeugt werden.

EditDataMode dataMode = EditDataMode.Read | EditDataMode.Create | EditDataMode.Delete;

Mittels einer einfachen Hilfsmethode kann man nun prüfen, welches Flag gesetzt ist.

static bool IsFlagSet(EditDataMode bitmask, EditDataMode flag)
{
    return (bitmask & flag) != 0;
}

Nun kann man bspw. prüfen, ob das „Create“-Flag gesetzt ist.

if (IsFlagSet(dataMode, EditDataMode.Create))
{
    Console.WriteLine("Create flag is set.");
}

Praktisch ist, dass man diesen Wert, also die Repräsentierung der Instanz auch als int oder string ausgeben kann.

Console.WriteLine("From EditDataMode to int: {0}", (int)dataMode);
Console.WriteLine("From EditDataMode to string (bin): {0}", Convert.ToString((int)dataMode, 2));

Auch der umgekehrte Weg ist so einfach zu realisieren. Hat man die Bitmask in irgendeiner Form als string gespeichert, so kann man diesen auch einfach wieder in Klassen-Objekt verwandeln.

string input = "0011";
Console.WriteLine("Input: {0}", input);
int convertedInput2Bin = Convert.ToInt32(input, 2);
 
Console.WriteLine("Converted input from string to int: {0}", convertedInput2Bin);
EditDataMode inputDataMode = (EditDataMode) convertedInput2Bin;
Console.WriteLine("EditDataMode to string: {0}", inputDataMode.ToString());

Ein vollständiges Beispiel habe ich bei Github abgelegt.

ExploBitmask

Quellen:

Why .Net should become independent!

In turn this may hopefully help companies realise that there are alternative libraries that are not one man bands and likely to disappear overnight and do offer better ways of providing solutions to their problems.

This is the answer to why .Net should become independent. You are not tied to one company for all your resources.