[SQL Server] Przydatne skrypty #1

Lista tabel wraz z ilością wierszy i zajmowaną przestrzenią SELECTs.Name [SchemaName],t.Name [TableName],p.rows [RowCounts],CAST(ROUND((SUM(a.used_pages) / 128.00), 2) AS NUMERIC(36, 2)) [Used MB],CAST(ROUND((SUM(a.total_pages) - SUM(a.used_pages)) / 128.00, 2) AS NUMERIC(36, 2)) [Unused MB],CAST(ROUND((SUM(a.total_pages) / 128.00), 2) AS NUMERIC(36, 2)) [Total MB]FROM sys.tables tINNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_idINNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_idINNER JOIN sys.allocation_units a ON p.partition_id = a.container_idINNER JOIN sys.schemas s ON t.schema_id = s.schema_idWHERE i.type IN (0,1) --0 = Heap, 1 = Clustered rowstore (B-tree)GROUP BY t.Name, s.Name, p.RowsORDER BY p.Rows DESC, s.Name, t.Name; Lista zdefragmentowanych indeksów wraz z poleceniem przebudowy SELECT s.name [Schema],t.name [Table],i.name [Index],ips.avg_fragmentation_in_percent,ips.page_count,CONCAT('ALTER INDEX ', i.name, ' ON ', t.name,' REBUILD;') [Rebuild cmd]FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) ipsINNER JOIN sys.tables t ON t.object_id = ips.object_idINNER JOIN sys.schemas s ON t.schema_id = s.schema_idINNER JOIN sys.indexes i ON i.object_id = ips.object_idAND ips.index_id = i.index_idWHERE ips.database_id = DB_ID()AND i.name IS NOT NULLAND ips.avg_fragmentation_in_percent > 30ORDER BY ips.avg_fragmentation_in_percent DESC; ...
Read More

IFormFile to byte array

Dziś kod ułatwiający pracę w ASP.NET Core WebAPI.Poniżej metoda rozszerzająca, która pozwala pobrać zawartość pliku przekazanego w żądaniu: public static class FormFileExtensions { /// <summary> /// Returns file content as byte array. /// Returns null if null input provided. /// </summary> /// <param name="pgmFile"></param> /// <returns></returns> public static byte[] ExtractFileContent(this IFormFile pgmFile) { byte[] pgmFileContent = null; if (pgmFile?.Length > 0) { ...
Read More

Quick tip na HTTP 403

Zdarza się, że podczas wykonywania żądania GET z poziomu kodu otrzymujemy odpowiedź 403 Forbidden, mimo że podobna operacja z poziomu przeglądarki lub Postmana działa bez zarzutu.Winny może być brak nagłówka User-Agent. WebClient wb = new WebClient(); wb.Headers.Add("User-Agent: Other"); wb.DownloadFile(url, fileName); Teraz działa bez zarzutu :) ...
Read More

Scalanie pliku EXE z bibliotekami DLL

Większość tworzonych przez nas aplikacji .NET jest oparta o zewnętrzne biblioteki. W wyniku ich kompilacji programu otrzymamy: program EXE lub bibliotekępliki DLL bibliotek zależnychdokumentację powyższych w formie *.XMLplik symboli PDFkonfigurację programu w formie *.CONFIG Poniżej przykład aplikacji konsolowej, która korzysta z bibliotek oferujących funkcje kontenera DI oraz serializatora JSON. W wyniku kompilacji powstało aż 7 plików. Pokażę, jak w łatwy sposób zminimalizować wynik do dwóch plików. Na początek należy dołączyć do naszego programu pakiet NuGet o nazwie Costura.Fody https://github.com/Fody/Costura Od teraz każda kompilacja programu spowoduje, że biblioteki zależne zostaną dołączone do niego jako zasoby. Po kolejnej budowie solucji pozostało tylko 5 plików. Bardziej dociekliwi mogą zauważyć, że rozmiar pliku wynikowego EXE jest dużo mniejszy niż łączny rozmiar plików DLL na poprzednim zdjęciu. Powodem jest automatyczna kompresja zasobów podczas procesu scalania plików przez Fody. Aby zapobiec tworzeniu pliku PDB, należy zmienić ustawienia projektu.W zakładce Build klikamy przycisk Advanced..., w kolejnym oknie zmieniamy dla opcji Debugging information z Full na None i zapisujemy zmiany. Aby...
Read More

FluentValidation – Cannot pass null model to Validate

FluentValidation to znakomita biblioteka ułatwiająca walidację danych. Pozwala zdefiniować reguły walidacji w całkiem zgrabny sposób. Dla podstawowych scenariuszy zawiera gotowe komunikaty błędu w wielu wersjach językowych. Niestety posiada też pewną kuriozalną cechę.Jeśli do metody Validate zostanie przekazana wartość null, zostanie rzucony wyjątek z informacją "Cannot pass null model to Validate". Co na ten temat mówi autor biblioteki? "This is actually by design. The purpose of FluentValidation is to validate properties on objects, which by definition requires a non-null instance in order to work."https://github.com/JeremySkinner/FluentValidation/issues/486#issuecomment-307696164 Czyli jak to często w świecie IT bywa: "It's Not a Bug, It's a Feature." Bywają jednak sytuacje, że null jest wartością spodziewaną i chcemy zwrócić błąd walidacji spójny z pozostałymi regułami. Można to zrobić nadpisując metodę Validate walidatora: public class Product { public string Title { get; set; } public decimal Price { get; set; } ...
Read More

Azure Blob Storage

Wprowadzenie Jest to usługa dedykowana do przechowywania danych tekstowych i binarnych. Krótko mówiąc, działanie Blob Storage jest zbliżone do serwisu OneDrive, choć oferuje znacznie więcej funkcjonalności. Po przesłaniu danych otrzymujemy link do zasobu, więc aby go pobrać, wystarczy nam przeglądarka. Można to również zrobić z poziomu kodu. Hierarchia zasobów Obiekty blob służą do przechowywania naszych zasobów. Mają swoją nazwę i właściwości. Kontenery pełnią funkcję folderu dla naszych obiektów blob. Kontenery natomiast są trzymane w ramach tzw. konta magazynu. Konto magazynu to zasób Blob Storage, który tworzymy w portalu Azure. Typy zasobów Obiekty blob to nasze pojedyncze zasoby, mogą mieć jeden z trzech typów: Block blobs Dane składają się z bloków danych, jest to dobry wybór do przechowywania plików zdjęć, dokumentów i filmów, zapewnia wsparcie dla równoległego pobierania danych.Append blobs Podobne do block blobs, ale zoptymalizowane pod równoległe dopisywanie nowych danych, nadpisanie starych danych nie jest możliwe. Nadają się do przechowywania logów.Page blobs Stanowią zbiór stron po 512 bajtów, zoptymalizowane pod losowy odczyt/zapis. Tworzenie konta magazynu Blob Storage Przed rozpoczęciem...
Read More

ViewModel i INotifyPropertyChanged

O interfejsie INotifyPropertyChanged słyszał każdy, gdy napotkał wzorzec MVVM. Niestety podstawowy sposób tworzenia właściwości w klasie ViewModel jest zbyt czasochłonny. Zacznijmy od przykładu: public class BasicViewModel : INotifyPropertyChanged { private string customerName; public event PropertyChangedEventHandler PropertyChanged; public string CustomerName { get { return customerName; } set { ...
Read More