Author Archives: Andreas
Snippet um Zip Dateien im Memory zu erstellen
Wenn Foldername gefüllt ist, wird ein Verzeichnis erstellt, wo die Dateien reinkommen.
1 2 3 4 5 |
/// <summary> /// Das Dictionary wird iteriert und die Dateien darin gezippt. Der Key Value des Dictionarys entspricht der neuen Dateienbezeichnung /// Foldername ist das Verzeichnis, wo alle Dateien enthalten sind. Leeres Verzeichnis -> Dateien liegen lose im Zip Archiv /// </summary> /// <returns>Zip File</returns> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static MemoryStream ZipFiles(IDictionary<string, FileInfo> files, string zipName, string Foldername = "") { if (!zipName.EndsWith(".zip")) { zipName += ".zip"; } var stream = new MemoryStream(); var zip = new ZipArchive(stream, ZipArchiveMode.Create, true); // Verzeichnis ins Archiv erstellen, wo darauf folgende Dateien rein kommen if (Foldername != string.Empty) { zip.CreateEntry(Foldername + "/"); } // Dateien, dem Archiv hinzufügen foreach (KeyValuePair<string, FileInfo> file in files) { // Zip Eintrag erzeugen ZipArchiveEntry entry = zip.CreateEntry(Foldername + "/" + file.Key, CompressionLevel.Optimal); // Zip Eintrag ins Memory schreiben using (var zipEntry = entry.Open()) using (var fileStream = new FileStream(file.Value.FullName, FileMode.Open, FileAccess.Read)) { fileStream.CopyTo(zipEntry); } } zip.Dispose(); stream.Seek(0, 0); return (stream.Length > 0) ? stream : null; } |
In Verbindung mit MVC kann der Stream nun Chunk-weise ausgegeben werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
System.IO.MemoryStream zipFile = getStream(); //Alternativ: result = File(zipFile, "application/zip", filename); Response.ClearHeaders(); Response.ClearContent(); Response.ContentType = "application/zip"; Response.CacheControl = "No-cache"; Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); Response.AddHeader("Content-Length", zipFile.Length.ToString()); int chunkSize = 8192; byte[] buffer = new byte[chunkSize]; int offset = 0; int read = 0; using (var fs = zipFile) { while ((read = fs.Read(buffer, offset, chunkSize)) > 0) { if (!Response.IsClientConnected) break; Response.OutputStream.Write(buffer, 0, read); Response.Flush(); } } |
SQL Funktion um gleich klingende Wörter zu erkennen
SQL hat eine interne Funktion, um Wörter, die gleich klingen nach einer mathematischen Formel zu berechnen. Beispiel:
1 2 |
SELECT SOUNDEX('Zicke') SELECT SOUNDEX('Ziege') |
bekommen beide den Wert B162. Diese Funktion ist besonders für Suchanfragen perfekt.
Trigger, der tatsächlich alles löscht
Wenn man in T-SQL einen Trigger auf eine Tabelle legt und diese soll nach einem Löschvorgang ebenfalls etwas anderes machen, dann stoßt man auf das folgende Problem. Solange man nur eine Zeile löscht, ist alles in Ordnung, sobald man aber mehrere Datensätze löscht, kann es passieren, dass nur der erste Trigger greift. Der Grund ist, […]
IsNull in JavaScript
In SQL gibt es die tolle Funktion, wenn ein Wert nicht null ist, dann nimm diesen, ansonsten nimm die Alternative. Die Syntax dazu ist IsNull(‚meinWert,’Alternative‘). Um z.B. dem Nutzer kein null in einer Textbox anzuzeigen, habe ich eine Funktion geschrieben, die im Prinzip das gleiche macht.
1 2 3 |
function IsNull(exprValue, altValue) { return typeof exprValue == 'undefined' || exprValue == null ? altValue : exprValue; } |
Get Rekursive Object
Mit der folgenden Funktion kann man rekursiv ein Objekt in Javascript nach einem bestimmten Attribut durchsuchen. Das ganze auch noch ziemlich performant.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
function getRecursiveObject(theObject,property,id) { var result = null; if (theObject instanceof Array) { for (var i = 0; i < theObject.length; i++) { result = getRecursiveObject(theObject[i], property, id); if (result) { break; } } } else { for (var prop in theObject) { if (prop == property) { if (theObject[prop] == id) { return theObject; } } if (theObject[prop] instanceof Object || theObject[prop] instanceof Array) { result = getRecursiveObject(theObject[prop], property, id); if (result) { break; } } } } return result; } |
SQL Management Studio Sitzung neu laden
Wenn man z.B. eine neue Spalte angelegt hat und möchte dann, diese im Query Editor ansprechen, so wird diese rot angestrichen. Das bedeutet, dass er in dieser Sitzung diese Spalte noch nicht kennt. Mit der Tastenkombination Strg + Shift + R kann man die Sitzung aber einfach neu starten.
ZenCoding, Emmet Alternative für Visual Studio
Emmet ist PlugIn für ganz viele Editoren wie Notepad++, mit dem man ganz schnell HTML coden kann. Klar muss man sich auch hier die Syntax erlernen, doch dies lohnt sich. Beispielweise kann man aus
1 |
ul>li.test*5 |
folgendes generieren lassen
1 2 3 4 5 6 7 |
<ul> <li class="text"></li> <li class="text"></li> <li class="text"></li> <li class="text"></li> <li class="text"></li> </ul> |
Downloaden kann man das ganze im Marketplace: https://marketplace.visualstudio.com/items?itemName=MadsKristensen.ZenCoding Weitere Syntax kann man hier nachschauen: https://docs.emmet.io/ Für Visual Studio […]
Ganze Datenbank nach einem Begriff durchsuchen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
DECLARE @SearchStr nvarchar(100) = 'Untergeordnet' CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630)) SET NOCOUNT ON DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) SET @TableName = '' SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') WHILE @TableName IS NOT NULL BEGIN SET @ColumnName = '' SET @TableName = ( SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName AND OBJECTPROPERTY( OBJECT_ID( QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) ), 'IsMSShipped' ) = 0 ) WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) BEGIN SET @ColumnName = ( SELECT MIN(QUOTENAME(COLUMN_NAME)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2) AND TABLE_NAME = PARSENAME(@TableName, 1) AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') AND QUOTENAME(COLUMN_NAME) > @ColumnName ) IF @ColumnName IS NOT NULL BEGIN INSERT INTO #Results EXEC ( 'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 ) END END END SELECT ColumnName, ColumnValue FROM #Results |
ACHTUNG: Das Script ist nicht von mir. http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm
CSS Border Box
Wenn man einem Element in CSS einen Border, Padding oder Margin gibt, so weitet sich das Element aus. Befindet sich ein anderes Element daneben, so muss die Breite und Höhe dieses Elementes ebenfalls angepasst werden. Dafür gibt es einen netten Trick.
1 2 3 4 5 6 7 8 9 10 |
/* margin, padding und border sind so kein Problem mehr */ #a{ -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding:10px; border: 2px solid black; margin-right:5px; } |
Nützliche Javascript Bibliotheken
Ich mach hier mal eine kleine Sammlung von Javascript Bibliotheken, die ich vielleicht eines Tages gebrauchen kann. Forms Alternative Select Boxen https://select2.github.io/examples.html https://twitter.github.io/typeahead.js/ https://harvesthq.github.io/chosen/ http://rmm5t.github.io/jquery-flexselect/ http://loopj.com/jquery-tokeninput/ https://tympanus.net/codrops/2014/07/10/inspiration-for-custom-select-elements/ https://tympanus.net/Tutorials/CustomDropDownListStyling/index2.html# Multiple Select http://loudev.com/#demos Datepicker https://uxsolutions.github.io/bootstrap-datepicker/ http://amsul.ca/pickadate.js/ https://fullcalendar.io/ http://felicegattuso.com/projects/timedropper/ Daterange: http://www.daterangepicker.com/#examples http://rettica.com/caleran/docs/readme.html#caleran-date-range-picker Tables http://issues.wenzhixin.net.cn/bootstrap-table/ http://listjs.com/ Modal, PopUp http://dimsemenov.com/plugins/magnific-popup/ http://codeseven.github.io/toastr/demo.html http://likeastore.github.io/ngDialog/# http://qtip2.com/ List shortcuts: https://www.impressivewebs.com/demo-files/question-mark-js/ Treeview https://www.jstree.com/ Drag […]
Login