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.

0 0 votes
Article Rating
3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Gutek
13 years ago

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
13 years ago

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
13 years ago

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

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również