poniedziałek, 30 listopada 2009

C# operator: as czy zwykłe rzutowanie z nawiasami

Który sposób rzutowania jest lepszy?
Rzutowanie za pomocą operatora as, czy "stary" sposób z uzyciem nawiasów (cast):

 
IAaa aa = obj as IAaa;
IAaa aa = (IAaa)obj;


Jesli używamy operatora as musimy pamietać, że gdy konwersja nie jest możliwa to:
cast rzuca wyjątek
operator as zwraca null


Stąd używając operatora as należy sprawdzić, czy wynik konwersji nie jest null.
Jesli tego nie sprawdzimy dostaniemy NullReferenceException na pierwszym odwołaniu do zmiennej.

sobota, 28 listopada 2009

log4net - pełna konfiguracja w kodzie

Kod tworzący appender:
private static log4net.Appender.FileAppender CreateAppender(string fileName, string appenderName)
{
log4net.Appender.RollingFileAppender fileAppender = new log4net.Appender.RollingFileAppender(); 

log4net.Layout.PatternLayout patternLayOut = new log4net.Layout.PatternLayout(); 
patternLayOut.Header = System.Environment.NewLine; 

patternLayOut.Footer = System.Environment.NewLine; 
patternLayOut.ConversionPattern = "%d %m%n"; 
patternLayOut.ActivateOptions(); 
fileAppender.Layout = patternLayOut; 
fileAppender.AppendToFile = true; 
fileAppender.File = fileName; 
fileAppender.Name = appenderName; 
fileAppender.MaxSizeRollBackups = 5; 
fileAppender.MaxFileSize = 100000; 
fileAppender.ActivateOptions(); 
return fileAppender; 
} 

Powyższy kod stosowalem dlatego, że nie umialem skierowac loga do pliku w katalogu APPDATA. Teraz już wiem jak to zrobić za pomocą xml. Scieżkę do loga można zdefiniować w sposób następujący:



<param name="File" value="${ALLUSERSPROFILE}/Company/Product/Logs/error.log"/>  

Jak wygenerować w SQL kod wypełniający tabelę danymi

Jak wygenerować w SQL kod wypełniający tabelę danymi:

 
CREATE TABLE [dbo].[ForInsert](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Kod] [varchar](20) NOT NULL,
[Opis] [varchar](255) NOT NULL,
[InsertInto] [varchar](1024) NOT NULL,
CONSTRAINT [ForInsertPrimary] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
) ON [PRIMARY]
GO

INSERT INTO [dbo].[ForInsert] ([Kod],[Opis],[InsertInto]) VALUES('ALA', 'MA KOTA', '')
INSERT INTO [dbo].[ForInsert] ([Kod],[Opis],[InsertInto]) VALUES('AS', 'AS TO PIES ALI', '')
GO

UPDATE [dbo].[ForInsert]
SET [InsertInto] = 'INSERT INTO [dbo].[ForInsert] ([Kod],[Opis]) VALUES(''' + LTRIM(Kod) + ''',''' + LTRIM(Opis) + ')'
GO

SELECT [InsertInto] from [dbo].[ForInsert] ORDER BY Kod

środa, 4 listopada 2009

TFS - dobre rady (1)

1. Aby zmienić lokalną scieżkę do projektu należy otworzyć kartę: File -> Source Control -> Workspaces... i nacisnąć przycisk EDIT

2. Jesli robisz check-in na projekcie po usunięciu/zmienieniu nazwy plików to check-inuj także te zmienione/usunięte pliki bo później co innego jest w pliku projektu, a co innego w fizycznej strukturze plików i są problemy

niedziela, 25 października 2009

Uruchamianie cmd.exe "jako administrator"

Windows 7 lub Vista
Aby uruchomić konsolę z uprawnieniami administratora trzeba po wpisaniu w okienku: Uruchom: cmd nacisnąć klawisze Shift+Ctrl+Enter.

W tak otwartym okienku bez problemy wykonamy ulubione pliki komend (np. rejestruj.bat z pakietu Comarch Opt!ma)

środa, 14 października 2009

Klawiatura USB nie działa po przejściu do BIOS

Co jeśli po otwarciu ustawień BIOS twoja klawiatura USB sprawia wrażenie nieaktywnej lub martwej?

Najprawdopodobniej masz wyłączoną opcję: USB Legacy Support
Aby ją włączyć:
1. Podłącz klawiaturę PS-2
2. Znajdź opcję: USB Legacy Support (najprawdopodobniej w menu: Advanced, Peripheral, lub Peripheral Configuration.
3. Zmień stan USB Legacy Support z Disabled na Enabled
4. Zapisz zmienione ustawienia BIOS (w tym momencie komputer się zresetuje)
5. Ponownie wejdź do BIOS i upewnij się, że opcja USB Legacy Support ma ustawiony stan: Enabled
6. Wyjdź z BIOS bez zapisu.
7. Poczekaj na uruchomienie komputera
8. Zamknij system
9. Podłącz ponownie klawiaturę USB

Jeżeli USB Legacy Support jest ustawiony jako Disabled, nie będzie możliwe używanie myszki i klawiatury USB w następujących sytuacjach:
- uruchamianie komputera w Safe mode.
- uruchamianie Windows Startup menu.
- wystartowanie komputera w trybie MS-DOS
- wystartowanie komputera z dyskietki (także wtedy gdy pozostawimy dyskietkę w stacji podczas wyłączania komputera)
- jeśli Windows wyświetli "blue screen" z napisem "Press any key to continue".
- sterowanie zachowaniem programu ScanDisk podczas uruchamiania komputera
- edytowanie ustawień BIOS.
- wprowadzenie hasła do BIOS

wtorek, 13 października 2009

Nazwa procesu, który uruchomił kod danej klasy

Czasami potrzebuję znać nazwę procesu, który uruchomił daną klasę.
Najczęściej w kontekście zapisywania operacji do loga. Kiedy ta sama klasa jest wykorzystywana przez kilka aplikacji, logowanie powinno odbywać się do pliku związanego z tą właśnie aplikacją.
Rozwiązanie znalazłem na blogu: Brad'a Abramsa:

currentProcessName = Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])

środa, 7 października 2009

VS 2008; Blokada otwierania formatera okna

Chciałbym aby domyślną akcją dla klasy dziedziczącej z Windows.Forms.Form było otwarcie okna z kodem.
W VS 2003 używałem atrybutu:
System.ComponentModel.DesignerCategory("Code")]

[System.ComponentModel.DesignerCategory("Code")]
public class FrmManager : System.Windows.Forms.Form

Niestety w VS 2008 SP1 to nie działa. Nadal domyślną akcją jest otwieranie formatera.

Maciej Aniserowicz (.jak.NET) podpowiedział mi, że należy to zrobić tak:

1. Prawym przyciskiem myszy otwórz menu na pliku formy.
2. Z menu wybierz "Open with...".
3. Zaznacz "CSharp Editor", kliknij "Set as Default"
4. Kliknij OK

Teraz domyślnym edytorem dla wszystkich formatek jest edytor kodu, a formater wybieram prawym przyciskiem myszy.