Posts

Totstandkoming estimated en actual query plans Sql Server

Als een query wordt aangeboden aan SQL Server, worden er een aantal stappen uitgevoerd: Parsing De query wordt geparsed. Dit houdt in dat wordt bekeken of de query correct geschreven is. De uitkomst hiervan is een parse tree (of query tree of sequence tree). De parse tree representeert de logische stappen die nodig zijn om de query uit te voeren. DML of DDL Als de query een Data Manupilation Language (DML) statement is, dan wordt deze geoptimaliseerd. Als het een Data Definition Language query is, dan niet. Dit omdat een DDL altijd statement bevatten die gaan over de DB structuur en er is altijd maar 1 juiste manier om bijv. een tabel aan te maken. Algebrizer Als de T-sql een DML statement is en hij is door de parser heen gekomen, dan wordt de parse tree doorgegeven aan de algebrizer. De algebrizer achterhaalt alle namen van de gemoeide objecten, tabellen en kolommen. Hij identificeert ook alle data types, zoals int, varchar(50), etc.. Tevens bepaalt hij ook de aggregates, zoa...

Client validatie voor custom data annotations

Ik kwam in de situatie waarbij ik met stringwaarden moest controleren of deze binnen een bepaalde getal range lagen. Uiteraard is hier geen standaard MVC Data-Annotation voor, dus schreef ik hem zelf. De controle moest overigens enkel uitgevoerd worden als er een waarde is ingevuld. Het toepassen van client side validatie van custom Data Annotations bestaat uit twee delen: het serverdeel en de client side deel. Hier mijn implementatie van het bovenstaand beschreven probleem: [AttributeUsage(AttributeTargets.Property, AllowMultiple=true)] public class NumberStringRangeAttribute : ValidationAttribute, IClientValidatable { private int minValue; private int maxValue; public NumberStringRangeAttribute(int minValue, int maxValue) { this.minValue = minValue; this.maxValue = maxValue; } public override string FormatErrorMessage(string name) { return string.Format("Waarde moet t...

Max Json lengte in MVC

Als je werkt met grote Ajax-requests kan het voorkomen dat je deze exception tegenkomt: 'The JSON request was too large to be deserialized.' Dit betekent dat de Json die naar de server wordt gestuurd simpelweg te groot is en daardoor wordt genegeerd door MVC met als resultaat deze exception. Om dit probleem te verhelpen zijn er twee oplossingen. Wanneer je welke moet gebruiken ben ik nog niet achter, maar als je beide toepast werkt het altijd. In de web.config: <configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="500000"> </jsonSerialization> </webServices> </scripting> </system.web.extensions> </configuration> Hierbij geef je bij 'maxJsonLength' het aantal bytes op. let op dat dit veld een integer is. Bij de tweede oplossing pas je ook de web.config aan, want je voegt namelijk een appsetting toe: ...

Composition over Inheritance

Eerst even back to the basics. Wat wordt bedoeld met overerving en wat wordt bedoeld met composition. Als je het zou moeten beschrijven dan spreek je bij overerving van een 'is-een' relatie en bij composition heb je het over een 'is-een-onderdeel-van' relatie. In code ziet overerving er zo uit: public class Vehicle { } public class Car : Vehicle { } Er is hier duidelijk sprake van de 'is-een' relatie: Een auto is een voertuig. Bij composition ziet de code er als volgt uit: public class Engine { } // Possibility 1: Create the 'composition' inside the constructor public class Car { private readonly Engine _engine; public Car() { _engine = new Engine(); } } // Possibility 2: Inject the 'composition' in the constructor using Dependency Injection (DI). public class Car { private readonly Engine _engine; public Car() { _engine = new Engine(); } } In dit voorbeeld zie je dat een Engine onderdeel is van een auto....

Webforms: De 'Bee Stings'

Momenteel werk ik aan een project dat volledig is ontwikkeld m.b.v. WebForms. De View Engine die wordt gebruikt is nog de oude Webforms View Engine, dus nog geen Razor. Bij het bekijken van de .aspx pagina's kwam ik de inline C# code tegen die in de <% .. %> tags staan. Nu zijn hier verschillende varianten van en ik wilde ze even op een rijtje zetten als geheugensteuntje: <% %> - is voor inline code; met name voor logische flow <%$ %> - is voor het evalueren van expressies zoals resource variabelen <%@ %> - is voor Page Directives, registreren van assemblies, importeren van namespaces, etc. <%= %> - Is kort voor Response.Write() <%# %> - wordt gebruikt voor data bindings <%: %> - Is kort voor Response.Write(Server.HTMLEncode()) in ASP.Net 4.0+ <%#: %> - wordt gebruikt voor data bindings en wordt automatisch HTMLEncoded <%-- --%> - is voor server-side commentaar bron  http://stackoverflow.com/a/957321

Visual Studio 2013 Tips en Trucs

Peek definition Op een type gaan staan met de cursor en dan ALT-F12. Er verschijnt een  'inline tab'. Binnen dit tab kan je ook weer ALT-F12 drukken. Als er meerdere tabs openstaan kan je er doorheen bladeren middels CTRL-ALT-min en ALT-plus. Het is ook mogelijk om wijzigingen aan te brengen in dit deelvenster. Blokken code verplaatsen Selecteer de code/text die verplaatst moet worden en druk vervolgens ALT-pijl omhoog/omlaag. De code wordt nu verplaatst per regel. Scrollbar met code preview Rechtermuisknop op de scrollbar en kies Scroll Bar Options. In het rechter vlak, onderaan bij 'Behavior' kun je kiezen voor 'Use map mode for vertical scroll bar'. Vink het vinkje aan om een code preview te krijgen als je met de muis over de scrollbar gaat. Vensters eenvoudig 'vastzetten' Indien je meerdere vensters heb, kan je met Windowstoets-Pijl een venster aan de linker of rechterkant vastzetten. Met pijltje beneden minimaliseer je het scherm en met p...

Code snippet: Alle verbindingen sluiten met de SQL Server database

Gebuik onderstaande SQL-snippet om alle verbindingen met een SQL Server database te sluiten: -- set your current connection to use master otherwise you might get an error use master ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE --do you stuff here ALTER DATABASE YourDatabase SET MULTI_USER