StringWriter mit anderem Encoding

Vor einer ganzen Weile habe ich mal die StringWriter-Klasse empfohlen.
Die StringWriter-Klasse nutzt intern UTF-16, wodurch zum Beispiel bei der Xml-Serialisierung von Klassen auch das Ergebnis in UTF-16 vorliegt. Dies ist nicht zwangsläufig gewünscht, bei mir hat dadurch ein Backend-Service gestreikt.
Um trotzdem den StringWriter weiter zu verwenden, muss man sich eine eigene Klasse schreiben, welche von der StringWriter ableitet und das Encoding-Property überschreibt:

using System;
using System.IO;
using System.Text;

namespace Utilities.IO
{

	/// <summary>
	/// 	A simple class derived from StringWriter, but which allows
	/// 	the user to select which Encoding is used. This is most
	/// 	likely to be used with XmlTextWriter, which uses the Encoding
	/// 	property to determine which encoding to specify in the XML.
	/// </summary>
	public class StringWriterWithEncoding : StringWriter
	{
		private Encoding _encoding;

		/// <summary>
		/// 	Initializes a new instance of the StringWriterWithEncoding class
		/// 	with the specified encoding.
		/// </summary>
		/// <param name = "encoding">The encoding to report.</param>
		public StringWriterWithEncoding(Encoding encoding)
			: base()
		{
			this._encoding = encoding;
		}

		/// <summary>
		/// 	Initializes a new instance of the StringWriter class with the 
		/// 	specified format control and encoding.
		/// </summary>
		/// <param name = "encoding">The encoding to report.</param>
		/// <param name = "formatProvider">An IFormatProvider object that controls formatting.</param>
		public StringWriterWithEncoding(Encoding encoding, IFormatProvider formatProvider)
			: base(formatProvider)
		{
			this._encoding = encoding;
		}

		/// <summary>
		/// 	Initializes a new instance of the StringWriter class that writes to the
		/// 	specified StringBuilder, and reports the specified encoding.
		/// </summary>
		/// <param name = "encoding">The encoding to report.</param>
		/// <param name = "sb">The StringBuilder to write to. </param>
		public StringWriterWithEncoding(Encoding encoding, StringBuilder sb)
			: base(sb)
		{
			this._encoding = encoding;
		}

		/// <summary>
		/// 	Initializes a new instance of the StringWriter class that writes to the specified 
		/// 	StringBuilder, has the specified format provider, and reports the specified encoding.
		/// </summary>
		/// <param name = "encoding">The encoding to report.</param>
		/// <param name = "sb">The StringBuilder to write to. </param>
		/// <param name = "formatProvider">An IFormatProvider object that controls formatting.</param>
		public StringWriterWithEncoding(Encoding encoding, StringBuilder sb, IFormatProvider formatProvider)
			: base(sb, formatProvider)
		{
			this._encoding = encoding;
		}

		/// <summary>
		/// 	Gets the Encoding in which the output is written.
		/// </summary>
		public override Encoding Encoding
		{
			get { return this._encoding; }
		}
	}
}

Update:
Habe die Klasse mal um Kommentare erweitert.

Boolschen Rückgabewert einer Stored Procedures in C#

Ich hatte mir eine Stored Procedure erstellt, welche überprüft, ob es schon einen bestimmten Eintrag in der Datenbank gibt. Sie sollte mir also nur ein true oder false zurück liefern.

ALTER PROCEDURE dbo.LineExists	
	(
	@name nvarchar(100)	
	)	
AS BEGIN
	IF(EXISTS(Select [Name] FROM DemoTable WHERE [Name] = @name))
		RETURN(1)
	ELSE
		RETURN(0)
END

Meine passende C# Funktion sah in etwa so aus:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";

sqlConn.Open();
bool vorhanden = ((int)sqlCom.ExecuteScalar() == 1) ? true:false;

Das führte immer zu einer Null-Reference-Exception. Auch der Weg über einen SqlDataReader funktionierte nicht. Eine Möglichkeit wäre, die Stored Procedure anzupassen und statt „Return(0)“ „Select 0“ zurück zu geben. Dann würde der obere Code auf jeden Fall funktionieren.

Andere Möglichkeit wäre, den Return Value auszulesen. Dazu muss man dem SqlCommand einen Parameter mitgeben, welchen ihr nach der SQL Operation wieder auslest. Kurzes Code-Beispiel:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";
sqlCom.Parameters.Add("RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

sqlConn.Open();
sqlCom.ExecuteNonQuery();
bool vorhanden = ((int)sqlCom.Parameters["RETURN_VALUE"].Value == 1) ? true:false;

Beide liefern das selbe Ergebnis. Pro oder Contra habe ich bei einer spontanen Google-Recherche nicht gefunden, ist sicherlich Geschmackssache.

Position des Aktiven Fensters bekommen

        #region Position des aktiven Fensters bekommen
        
        /// &lt;summary&gt;
        /// Struktur um die Daten der WindowsAPI zu verarbeiten
        /// &lt;/summary&gt;
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        /// &lt;summary&gt;
        /// Import um das Handle des aktiven Fensters zu bekommen.
        /// &lt;/summary&gt;
        /// &lt;returns&gt;Handle des aktiven Fensters&lt;/returns&gt;
        [DllImport("user32.dll")]
        private static extern int GetForegroundWindow();

        /// &lt;summary&gt;
        /// Position sowie Höhe und Breite des gewollten Fenster bekommen.
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;&lt;/param&gt;
        /// &lt;param name="rect"&gt;&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [DllImport("user32.dll")]
        private static extern bool GetWindowRect(int hWnd, ref RECT rect);
        

        /// &lt;summary&gt;
        /// Daten bekommen
        /// &lt;/summary&gt;
        /// &lt;returns&gt;RECT mit den Daten&lt;/returns&gt;
        private RECT GetActiveWindowPosition()
        {
            int handle = GetForegroundWindow(); 
            RECT rct = new RECT();
            GetWindowRect(handle, ref rct);

            return rct;
        }
        RECT daten = GetActiveWindowPosition();

In der Struktur daten stehen dann die Abgrenzungen. Evtl. solltet ihr eine Prüfung machen, ob ob die Werte noch im bichtbaren Bereich liegen, z.B. verschiebt man ein Fenster nach Links über den Bildrand, so bekommt man einen negativen Wert!