Mam taki problem, w warunku 'where' jest coś takiego: x.Dzien > '2015-11-27 0000'.
'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
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
" 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 0000" co na SQL Serverze 2012 interpretowane jest jako 25 miesiąc, 11 dzień.
'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.
@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.
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?
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.
Na szybko:
" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value.Date + "',121) "
" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value + "',121) "
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.
Ale jeśli już musisz, to możesz spróbować uzyskać:
x.Dzien > '20151127'
Przynajmniej nie będzie się czepiał formatu daty.