zapytanie do bazy na SQL server w stringu

0

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

0

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

0

" 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ń.

0

'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.

0

@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.

0

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?

0
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.

0

Na szybko:

" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value.Date + "',121) "
" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value + "',121) "

0

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.

0

Ale jeśli już musisz, to możesz spróbować uzyskać:

x.Dzien > '20151127'
Przynajmniej nie będzie się czepiał formatu daty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1