konto usunięte

Temat: C# i SQL Server 2008 Express

Używam Visual C# 2008 Express oraz serwer bazy danych SQL Server 2008 Express, i mam takie pytanie, mam kod:

string sConnectionString ="User ID=magda;Password=root;Initial Catalog=;Data Source=.\\SQLEXPRESS";
SqlConnection objConn = new SqlConnection(sConnectionString);
objConn.Open();

string imie = textBox1.Text;
string nazwisko = textBox2.Text;
string sql = "insert into [test].[dbo].[dane]([id],[imie],[nazwisko]) values('2','"+imie+"','"+nazwisko+"')";
SqlCommand sqlcmd = new SqlCommand(sql, objConn);
try{
sqlcmd.ExecuteNonQuery();
MessageBox.Show("Dodano", "Informacja",MessageBoxButtons.OK,MessageBoxIcon.Information);
}catch(Exception s)
{
MessageBox.Show(s.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);

}

Wszystko elegancko dodaje, ale chodzi mi tutaj o kwestie bezpieczeństwa, jak dodatkowo można filtrować dane idące do bazy, bo samo zrobienie string, według mnie to mało.

I kolejna sprawa jak ustawić kolumnę ID jako autoincrement, aby automatycznie zwiększało ID?
Kamil Boś

Kamil Boś .NET/SharePoint
Developer

Temat: C# i SQL Server 2008 Express

Witaj,

Po pierwsze kod wymaga refaktoringu ze względu na:
1. Przechowywanie ustawień do połączenia się z bazą danych - powinieneś stworzyć wydedykowaną klasę która będzie posiadać właściwość pobierającą informacje jak User ID czy Password z pliku konfiguracyjnego, np:

public class Connection
{
public static string ConString
{
get
{
return ConfigurationManager.ConnectionStrings["conString"].ConnectionString;
}
}
}


2. Dobrze byłoby gdybyś umieścił cały kod w klauzuli using(...) {}, wówczas po zamknięciu klamry zamykasz automatycznie połączenie z bazą kiedy pobierzesz lub dodasz nowe dane.

using (SqlConnection conn = new SqlConnection(Connection.ConString))
{
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "...";
.... // operacje na bazie danych
}
}

3. Kwestia bezpieczeństwa przez Ciebie wspomniana - w ten sposób jak zrobiłeś narażasz się na możliwość wstrzyknięcia niechcianego kodu (zachęcam do poczytania na temat Sql Injection). W takiej sytuacji należy skorzystać z zapytań sparametryzowanych, czyli:

cmd.Parameters.AddWithValue("@Imie", imie)
lub
cmd.Parameters.Add(new SqlParameter("@Imie", imie));


4. Aby ID dodawało się automatycznie, należy w ustawieniach tabeli z danym ID ustawić "Identity Column / Specifiaction" na "Yes". Tam również można ustawić skok o który będzie zwiększane ID.

PozdrawiamKamil B. edytował(a) ten post dnia 16.12.10 o godzinie 12:05

konto usunięte

Temat: C# i SQL Server 2008 Express

Dziękuję za wyjaśnienie wszystkiego i cenne rady :)

konto usunięte

Temat: C# i SQL Server 2008 Express

No i przede wszystkim powinieneś stosować procedury składowane - to zabezpieczy Twoją aplikację przed analizowaniem struktury docelowej bazy danych poprzez podgląd stringów (przez reflector czy process explorer np.) - nie w 100% bo to bezpieczeństwo zależy od wielu czynników, ale przynajmniej znacznie utrudni taką analizę. Poza tym procedury są bardziej efektywne.
Krzysztof Raczkowski

Krzysztof Raczkowski Stała współpraca,
Logifact-Systems Sp.
z o.o.

Temat: C# i SQL Server 2008 Express

Sergiusz B.:
No i przede wszystkim powinieneś stosować procedury składowane - to zabezpieczy Twoją aplikację przed analizowaniem struktury docelowej bazy danych poprzez podgląd stringów (przez reflector czy process explorer np.) - nie w 100% bo to bezpieczeństwo zależy od wielu czynników, ale przynajmniej znacznie utrudni taką analizę. Poza tym procedury są bardziej efektywne.

Że efektywne to zgoda ale że zabezpieczy przed zrozumieniem logiki ????? No chyba, że je zakodujesz (trochę trzeba przy tym samodyscypliny) ale z tego co wiem ... można to rozkodować:

http://databases.aspfaq.com/database/how-do-i-protect-...

Pozdrawiam
K.R.

konto usunięte

Temat: C# i SQL Server 2008 Express

Krzysztof Raczkowski:
>
Że efektywne to zgoda ale że zabezpieczy przed zrozumieniem logiki ?????

Tak bo w kodzie zamiast trzymać selecty i inserty w stringach trzymasz wywolanie procedury, która przykrywa nazwy tabel i relacje pomiędzy nimi.

Jeśli ktoś ma dostęp do bazy to wtedy jedyną radą jest rzeczywiście zakodowanie sp.
Krzysztof Raczkowski

Krzysztof Raczkowski Stała współpraca,
Logifact-Systems Sp.
z o.o.

Temat: C# i SQL Server 2008 Express

Sergiusz B.:

Jeśli ktoś ma dostęp do bazy to wtedy jedyną radą jest rzeczywiście zakodowanie sp.

Ale właśnie napisałem iż zakodowanie procedury nic nie daje bo można to rozkodować.

Swoją drogą jeżeli piszesz duży system to trzymanie wszystkich zapytań po stronie bazy danych (nawet tych najtrywialniejszych) nie jest moim zdaniem wygodne - po prostu z moich doświadczeń o wiele prościej (mniej pracochłonne) jest wersjonowanie kodu niż bazy danych.
Maciej Aniserowicz

Maciej Aniserowicz software
developer/architect

Temat: C# i SQL Server 2008 Express

Sergiusz B.:
No i przede wszystkim powinieneś stosować procedury składowane

Procedury składowane?? W 95% przypadków powinny być zastąpione ORMem, co znacznie upraszcza sprawę, skraca czas powstawania projektu, redukuje ilość kodu, ułatwia jego utrzymanie, ........

konto usunięte

Temat: C# i SQL Server 2008 Express

zarówno procedury jak i ORM-y mają swoje wady i zalety. Najlepiej wybrać to co w aktualnym zadaniu będzie najodpowiedniejsze. Raz będzie to ORM, raz procedury, a czasem coś po środku

konto usunięte

Temat: C# i SQL Server 2008 Express

Krzysztof Raczkowski:

Swoją drogą jeżeli piszesz duży system to trzymanie wszystkich zapytań po stronie bazy danych (nawet tych najtrywialniejszych) nie jest moim zdaniem wygodne - po prostu z moich doświadczeń o wiele prościej (mniej pracochłonne) jest wersjonowanie kodu niż bazy danych.

Nie wersjonujesz bazy danych tylko skrypty bazy danych, włącznie z sp - przy skomplikowanych projektach, które tak jak ogry mają warstwy, jest wręcz krytyczne aby maks. izolować od siebie te warstwy, szczególnie jeśli masz oddzielne zespoły DEV np. od GUI, bazy danych czy "logiki biznesowej".

Trzymanie zapytań "z palca" w kodzie, oprócz w/w względów bezpieczeństwa ogranicza skalowalnośc i rozwój aplikacji, zaburza homogeniczność warstw, no chyba, że to jakiś mały projekt - wtedy rzeczywiście może to być armata na muchę.
Maciej Aniserowicz:

Procedury składowane?? W 95% przypadków powinny być zastąpione ORMem, co znacznie upraszcza sprawę, skraca czas powstawania projektu, redukuje ilość kodu, ułatwia jego utrzymanie,

ORMy to narzut dodatkowego kodu do utrzymania, który nie "dodaje wartości biznesowej", to narzut na wydajność aplikacji, izolowanie się od struktury danych i tym samym w dłuższej perspektywie tworzenia nawyku kodowania byle-jak, wreszcie to decentralizacja dostępu do danych co ogranicza skalowalność - LINQ pod tym względem jest masakryczny.

Temat: C# i SQL Server 2008 Express

Chłopaki, dajcie spokój. Autor zadał proste pytania, a tutaj zaczyna się 15752 spór o wyższość ORMów nad SP. Ten spór toczy się na kilku grupach samego GL, kilkudziesięciu (set?) forach całego świata, o blogach nie wspomnę i - do dnia dzisiejszego nie ma konsensusu. Na całym świecie najlepsi, certyfikowani "most valuable" specjaliści samego tylko Microsoftu stoją po obu stronach barykady i podają kolejne, zarówno obiektywne jak i "religijne" argumenty za i przeciw. Dajcie na razie początkującemu koledze wytchnienie od takich rzeczy. Jak będzie gotowy na projekty, gdzie takie dywagacje naprawdę mają sens, to sam wpisze w Google "ORM vs. stored procedures", albo w pracy "wypiorą" mu mózg "w kierunku jedynie słusznego podejścia" :) Ja pracowałem przy dużym projekcie, gdzie SP były traktowane, jak zło konieczne, a cała logika była w
kodzie. 2 lata wcześniej pracowałem przy projektach, gdzie z kolei wszystko było trzymane w SP. Gdybym postawił obok siebie szefów obu tych projektów... :)Adrian Olszewski edytował(a) ten post dnia 19.12.10 o godzinie 16:37

konto usunięte

Temat: C# i SQL Server 2008 Express

Adrian Olszewski:
Dajcie na razie początkującemu koledze wytchnienie od takich rzeczy.

Wręcz przeciwnie - początkujący kolega musi mieć świadomość obu rozwiązań, ich wad i zalet bo jak się z tym obudzi po kilku latach, z wyrobionymi "złymi" nawykami to wyląduje w koszu byle-jakich-programistów-i-jeszcze-gorszych-architektów, a tego koledze nie życzymy :)

Temat: C# i SQL Server 2008 Express

Wiem, Sergiuszu i naprawdę doceniam, że są jeszcze ludzie, którzy w tych czasach chcą poświęcać swój cenny czas na naukę innych i dzielą się z nimi "best practices", sam z tego korzystam :)

Tylko, że "złymi nawykami" jedna strona nazywa UDP, a druga ich unikanie. Turaj, tutaj i tutaj (ale pośw. PHP) są takie dyskusje. A znowuż "pisanie ugodowe", że "czasem warto tak, a czasem tak, zależnie od sytuacji", chociaż jest najrozsądniejsze - to też niewiele wnosi, bo brak tu konkretnych opisów sytuacji (bo i tak każdy je poznaje w ramach indywidualnych doświadczeń). To jeszcze nie ten etap, moim skromnym zdaniem, choć oczywiście "za chwilę" stanie się obowiązkowym (takich zagadnień jest więcej). A tak naprawdę wszystko zweryfikuje praca zawodowa w kilku firmach, w różnych projektach. Jak będzie miał szczęście, to popracuje w obu modelach (SP/ORM), a może nawet będzie pisał jakieś dedykowane warstwy CRUDowe... I aby nie wejść w ten spór (bo sam też mam pewne przemyślenia w zakresie ORM/SP, zwłaszcza, że podobne i męczące, spory toczyłem w pracy), tutaj zakończę :)Adrian Olszewski edytował(a) ten post dnia 19.12.10 o godzinie 18:08

konto usunięte

Temat: C# i SQL Server 2008 Express

Mogę od siebie dodać że nie zgadzam się tak do końca z tym że trzymanie Sql w kodzie jest takie bardzo złe w ogromnych projektach, można przecież takie zapytania trzymać w specjalnie spreparowanych xml resources gdzie pod maską generuje nam się kod wywołania, i wtedy działa to nad wyraz dobrze, zachowana jest separacja warstw oraz przenoszalność, oraz nie jesteśmy zdani na pojedynczy silnik bazy co w dużych projektach jest też powszechne że mamy napisany manager (agregator jak kto woli) który spaja ze sobą wszystkie dostępne na rynku enginey baz danych. Więc moją propozycją jest pewien kompromis pomiędzy ORM a SP.

Natomiast warto dodać że przy faktycznie czymś bardzo ciężkim ORM nie jest w stanie uciągnąć ciężaru danych, chociaż kuszącym jest jego użycie (ze względu na bogate możliwości spajania ze sobą wszystkich standardów SQL).
Krzysztof Raczkowski

Krzysztof Raczkowski Stała współpraca,
Logifact-Systems Sp.
z o.o.

Temat: C# i SQL Server 2008 Express

Sergiusz B.:
Krzysztof Raczkowski:

Swoją drogą jeżeli piszesz duży system to trzymanie wszystkich zapytań po stronie bazy danych (nawet tych najtrywialniejszych) nie jest moim zdaniem wygodne - po prostu z moich doświadczeń o wiele prościej (mniej pracochłonne) jest wersjonowanie kodu niż bazy danych.

Nie wersjonujesz bazy danych tylko skrypty bazy danych, włącznie z sp - przy skomplikowanych projektach,

OK - miałem na myśli skrypty, nie dane
warstwy, jest wręcz krytyczne aby maks. izolować od siebie te warstwy, szczególnie jeśli masz oddzielne zespoły DEV np. od GUI, bazy danych czy "logiki biznesowej".

Rezygnacja z logiki w SP, czy też ograniczenie SP do zadań wymagających odpowiedniej wydajności nie koliduje ze stosowaniem tylu warstw ile nam się podoba :)
Trzymanie zapytań "z palca" w kodzie, oprócz w/w względów bezpieczeństwa ogranicza skalowalnośc i rozwój aplikacji, zaburza homogeniczność warstw, no chyba, że to jakiś mały projekt - wtedy rzeczywiście może to być armata na muchę.

Trzymanie zapytań razem z kodem (to określenie jest lepsze niż w kodzie - np. zasoby, jak jeden z kolegów zauważył) również umożliwia rozwój aplikacji, skalowalność ... wszystko zależy jak to napiszemy.

ORMy to narzut dodatkowego kodu do utrzymania, który nie "dodaje wartości biznesowej", to narzut na wydajność aplikacji, izolowanie się od struktury danych i tym samym w dłuższej perspektywie tworzenia nawyku kodowania byle-jak, wreszcie to decentralizacja dostępu do danych co ogranicza skalowalność - LINQ pod tym względem jest masakryczny.

Zgadzam się iż daleko odbiegliśmy od tematu głównego. Zgadam się również z Tobą w 100% iż nie należy początkujących "wpuszczać w maliny" i głównie dlatego zdziwiło mnie to iż uważasz że stosowanie SP w jakikolwiek sposób utrudnia zrozumienie logiki działania aplikacji. Stosowanie wszędzie na siłę ORM to dla mnie taka sama skrajność jak ustalenie iż wszystkie zapytania mają być w SP.

Tak naprawdę przy dużych projektach jakiekolwiek analizowanie działania aplikacji bez dokumentacji jest niesłychanie trudne więc ... często brak dokumentacji jest wystarczającym zabezpieczeniem :)

Co do chronienia własnych pomysłów, jakbym miał jakiś *super tajny* algorytm i ze względów wydajnościowym chciałbym go umieścić na serwerze to pomyślał bym raczej o funkcjach w .NET + jakiś "obfuskator"

--
Pozdrawiam
K.R.

konto usunięte

Temat: C# i SQL Server 2008 Express

Krzysztof Raczkowski:

Trzymanie zapytań razem z kodem (to określenie jest lepsze niż w kodzie - np. zasoby, jak jeden z kolegów zauważył) również umożliwia rozwój aplikacji, skalowalność ... wszystko zależy jak to napiszemy.

Zmieniła się nazwa tabeli albo nazwy kolumn - trzymając zapytania "z palca" w zasobach lub co gorsza w kodzie aby zaktualizować aplikację musisz ją przekompilować i wysłać binarkę do kilkuset klientów. Wyciągając dane poprzez SP aktualizujesz tylko część serwerową (bazy danych), binarka pozostaje ta sama, nie zawracasz gitary klientom.

Doszła kolejna tabela, kilka tabel, z których musisz wyciągać dane prezentując ten sam raport - j.w.

Musisz dodatkowo przetworzyć dane z zupełnie innej tabeli przed każdorazowym wygenerowaniem tego samego raportu - j.w.

Przykłady można mnożyć, w firmach gdzie każdy nowy kod musi przejść określoną ścieżkę zdrowia zanim wejdzie na produkcję stajesz przed dylematem: rekompilować aplikację i przechodzić przez trzy cykle testów za każdym razem jak zmieni się jakaś głupota (o poważniejszych rzeczach nie wspominając nawet) w modelu danych czy może jednak trochę pomyślec i wyizolować i ograniczyć effort do naprawdę niezbędnego minimum?

konto usunięte

Temat: C# i SQL Server 2008 Express

Sergiusz B.:
Zmieniła się nazwa tabeli albo nazwy kolumn - trzymając zapytania "z palca" w zasobach lub co gorsza w kodzie aby zaktualizować aplikację musisz ją przekompilować i wysłać binarkę do kilkuset klientów. Wyciągając dane poprzez SP aktualizujesz tylko część serwerową (bazy danych), binarka pozostaje ta sama, nie zawracasz gitary klientom.

No to się robi automatyczną aktualizację przez Internet/Intranet po połączeniu szyfrowanym. Są przecież gotowe rozwiązania a i samemu takie stworzyć można w 2-3 tygodnie.

konto usunięte

Temat: C# i SQL Server 2008 Express

Sergiusz B.:
Przykłady można mnożyć, w firmach gdzie każdy nowy kod musi przejść określoną ścieżkę zdrowia zanim wejdzie na produkcję stajesz przed dylematem: rekompilować aplikację i przechodzić przez trzy cykle testów za każdym razem jak zmieni się jakaś głupota (o poważniejszych rzeczach nie wspominając nawet) w modelu danych czy może jednak trochę pomyślec i wyizolować i ograniczyć effort do naprawdę niezbędnego minimum?

to tak frywolnie bez testu zmieniasz kod SP :)

konto usunięte

Temat: C# i SQL Server 2008 Express

Adam Michalski:
Sergiusz B.:
Zmieniła się nazwa tabeli albo nazwy kolumn - trzymając zapytania "z palca" w zasobach lub co gorsza w kodzie aby zaktualizować aplikację musisz ją przekompilować i wysłać binarkę do kilkuset klientów. Wyciągając dane poprzez SP aktualizujesz tylko część serwerową (bazy danych), binarka pozostaje ta sama, nie zawracasz gitary klientom.

No to się robi automatyczną aktualizację przez Internet/Intranet po połączeniu szyfrowanym. Są przecież gotowe rozwiązania a i samemu takie stworzyć można w 2-3 tygodnie.

praca w korpo gdzie user nie ma internetu, co gorsza nic nie może zainstalować

konto usunięte

Temat: C# i SQL Server 2008 Express

Przemysław R.:
Adam Michalski:
Sergiusz B.:
Zmieniła się nazwa tabeli albo nazwy kolumn - trzymając zapytania "z palca" w zasobach lub co gorsza w kodzie aby zaktualizować aplikację musisz ją przekompilować i wysłać binarkę do kilkuset klientów. Wyciągając dane poprzez SP aktualizujesz tylko część serwerową (bazy danych), binarka pozostaje ta sama, nie zawracasz gitary klientom.

No to się robi automatyczną aktualizację przez Internet/Intranet po połączeniu szyfrowanym. Są przecież gotowe rozwiązania a i samemu takie stworzyć można w 2-3 tygodnie.

praca w korpo gdzie user nie ma internetu

Intranet z wewn. zasobami prawie na pewno ma.
co gorsza nic nie może zainstalować

Może, jeśli zatrudniają adminów, którzy potrafią skonfigurować poprawnie konto użytkownika.

Następna dyskusja:

Seminarium Microsoft SQL Se...




Wyślij zaproszenie do