Mam taki problem, w warunku 'where' jest coś takiego: x.Dzien > '2015-11-27 00:00:00'.
'Dzien' to kolumna tablicy typu datetime, łańcuch z datą wystawia kontrolka na kliencie, problem w tym, że SQL Server 2012 w czasie wykonywania zwraca błąd o przekroczeniu wartości poza zakres - odczytuje łańcuch jako YYYY-dd-mm, a nie YYYY-mm-dd. Wiem, bo sprawdzałem, jak obie wartości po roku są < 13 to zapytanie działa.
Co się dzieje, gdzieś rozjechały się formaty daty?
Pozdrawiam,
Jan
zapytanie do bazy na SQL server w stringu
- Rejestracja: dni
- Ostatnio: dni
- Postów: 20
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
jak nie chcesz mieć takich problemów to NIGDY nie podawaj daty jako stringa a jako datę. To jest jedyne akceptowalne rozwiązanie. BTW poczytaj o czymś takim jak parametry zapytania albo jeszcze lepiej co to jest ORM
- Rejestracja: dni
- Ostatnio: dni
- Postów: 20
" and a.CreationDate < '" + dateTimePicker1.Value.Date + "' "
" and a.CreationDate < '" + dateTimePicker1.Value + "' "
Tak to wygląda w kodzie, oba warianty działają dając taki string:
"2015-11-25 00:00:00" co na SQL Serverze 2012 interpretowane jest jako 25 miesiąc, 11 dzień.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 20
'jak nie chcesz mieć takich problemów to NIGDY nie podawaj daty jako stringa a jako datę. To jest jedyne akceptowalne rozwiązanie.'
Jak widzisz, nie podaję daty, jako stringa, tylko z metody komponentu 'dateTimePicker'.
A i tak się zapytanie pieprzy.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
@JanF a teraz wyobraź sobie że ktoś ustawia to dateTimePicker1.Value.Date w DOM na przykład na
'2015-11-27 00:00:00' union select password from users where '1'='1
albo cokolwiek innego sobie tym unionem wyciąga ;] NIGDY nie sklejaj inputu od usera w stringa do SQL. To się nazywa SQL Injection.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 20
Dzięki za udział.
Potrzebuję coś na szybko, stąd ADO.Net - jeśli będzie zainteresowanie i czas od strony czynników, to (i tu się zgadzam) to LINQ, (czas to czas potrzebny na naukę).
W tym momencie chciałbym zrozumieć co się dzieje, qrna, co wpływa na takie a nie inne zachowanie serwera?!
Kodowanie DB ustawione jest na Latin1 - może to?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1107
Shalom napisał(a):
albo cokolwiek innego sobie tym unionem wyciąga ;] NIGDY nie sklejaj inputu od usera w stringa do SQL. To się nazywa SQL Injection.
Bez przesady można (a nawet trzeba) się przed tym zabezpieczyć. Przecież bardzo często trzeba wyszukać coś w bazie po tym co wpisze user :)
JanF napisał(a):
W tym momencie chciałbym zrozumieć co się dzieje, qrna, co wpływa na takie a nie inne zachowanie serwera?!
To czemu nie chcesz formatować daty tak jak chce tego serwer bazodanowy? Żaden problem sklejając string formatować datę do postaci YYYY-dd-mm.
Ewentualnie poszukaj może serwer obsługuje jeszcze inne formaty np. YYYY/mm/dd. Tu już musisz niestety sięgnąć do dokumentacji serwera.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 3891
Na szybko:
" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value.Date + "',121) "
" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value + "',121) "
- Rejestracja: dni
- Ostatnio: dni
- Postów: 20
Bardzo dziękuję wszystkim za podzielenie się wiedzą!
Przyznam się, że zaniepokoiła mnie możliwość ataku 'SQL Injection', nigdy o tym nie słyszałem, będę musiał poczytać o tym.