fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

SQL z NHibernate w konsoli Visual Studio


31.03.2011

NHibernate posiada zmienną show_sql, której ustawienie na "true" powoduje wypluwanie na konsolę wszystkich SQLi idących do bazy. Zachciało mi się pewnego dnia podpiąć po prostu debuggerem pod aplikację i zobaczyć te SQLe w Visualu, w okienku Output. Była to aplikacja web – więc konsoli brak. Trial na nhprof akurat się skończył:), więc w danej minucie również niewiele można było na to poradzić.

Rozwiązaniem najprostszym okazała się podmiana docelowego miejsca zapisu wszystkich informacji wypluwanych na konsolę. Zamiast Console.WriteLine() chciałbym mieć wszędzie System.Diagnostics.Debug.WriteLine() Z konsoli w całej mojej aplikacji i tak korzysta tylko NH, więc pomysł był fsamras.

Kluczem do sukcesu okazała się metoda Console.SetOut() pozwalająca na wpięcie się w proces pisania na konsolę. Wystarczy taka "klaska":

  1:  public class CustomDebugWriter : TextWriter
  2:  {
  3:      public override void WriteLine(string value)
  4:      {
  5:          Debug.WriteLine(value);
  6:          base.WriteLine(value);
  7:      }
  8:  
  9:      public override void Write(string value)
 10:      {
 11:          Debug.Write(value);
 12:          base.Write(value);
 13:      }
 14:      public override Encoding Encoding
 15:      {
 16:          get { return Encoding.UTF8; }
 17:      }
 18:  }

i taka instrukcja gdzieś przy starcie systemu:

  1:  #if DEBUG
  2:            Console.SetOut(new CustomDebugWriter());
  3:  #endif

żeby mieć NHIbernatowego SQLa fruwającego w Output aż miło.

P.S. Dodatkowo NH umożliwia podpięcie wielu różnych loggerów za pomocą biblioteki Common.Logging (tutaj opis jak to zrobić dla nLog), ale chciałem coś na szybko, już, teraz.

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Zapisując się na newsletter zgadzasz się na przetwarzanie Twoich danych osobowych w celu wysyłania na wskazany przez Ciebie adres e-mail informacji handlowych o nowościach, promocjach, produktach i usługach związanych z serwisem devstyle.pl. Będzie to marketing bezpośredni, do realizacji którego wykorzystam Twoje telekomunikacyjne urządzenia końcowe. Administratorem Twoich danych osobowych będzie Maciej Aniserowicz prowadzący działalność gospodarczą w Białymstoku (15-215) przy ul. Konopnickiej 14/8, NIP 5422824401. Przysługuje Tobie prawo do cofnięcia zgody, żądania wglądu do Twoich danych, wniesienia sprzeciwu co do ich przetwarzania, sprostowania, usunięcia i ograniczenia przetwarzania. Więcej informacji o tym jak przetwarzam Twoje dane znajdziesz na devstyle.pl/RODO. Powered by ConvertKit
Notify of
Gutek

co do common.logging – to 2 miesiace temu jak na to jeszcze patrzylem to nie wspierali nLog 2.0 a nLog 1.x, szybko to wywalilem :) Dodatkowo tez nie widze sensu robienia abstrakcji w logowaniu w naszej aplikacji (chyba, ze to jest aplikacja typu nh). To jest jak robiebie abstrakcji na DI by moc go wymienic czy tez abstrakcji na ORM :) – mozliwe ze zyskasz mozliwosc wymiany DI, ale tez nie wykorzystasz pelnej mocy danego DI :)

dzieki za tip, mialem sie tym dzisiaj zajac bo wiedzialem ze sie da, ale jeszcze nie wiedzialem jak :) a teraz juz wiem ;)

Marcinii
Marcinii

Dzięki za ten przykład, pisząc aplikacje desktopowe wystarczyło ustawić zmienną show_sql i już wszystko było widoczne w Output. A gdy napisałem usługę WCF to te show_sql już nie działało – myślałem że to taki feature NH :)

Btw. Nie to żebym się czepiał, ale tworzysz klasę o nazwie CustomDebugWriter a potem używasz nazwy DebugWriter :)

procent

@Marcinii:
Faktycznie, dzięki, poprawione:)

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Facebook

Książka

Zobacz również