Sql insert i DataTimePicker

0

Witam Wszystkich.
Mam taki problem stworzylem tabele z rubryka jakas_data i typem date.
W zapytaniu z komponetme DataTime wyrzuca mi bład ze sa niepoprawne typy string end date
FormSprzedaz.SQuery.SQL.Add('INSERT INTO dokumenty VALUES(+pik+,+SP1DokComboBox.text+,SP1DataTime.Date)');
wiec zmienilem na:
FormSprzedaz.SQuery.SQL.Add('INSERT INTO dokumenty VALUES(+pik+,+SP1DokComboBox.text+,+DateToStr(SP1DataTime.Date)+)');
ale nadal nie moge umiesicic tego w bazie bo wywala blad 'Type mismatch in expression'
Czy ktosby mogl pomoc jak wrzucic to do bazy.

0

Więc tak. Właściwość SQL komponentu query jest tupu string więc nie możesz tam wpisać data i stad pierwszy błąd.

A roziwazanie bedzie takie

FormSprzedaz.SQuery.SQL.Add('INSERT INTO dokumenty VALUES('''+pik+''','''+SP1DokComboBox.text+''','''+quetedstr(DateToStr(SP1DataTime.Date))+''')');

lub

FormSprzedaz.SQuery.SQL.Add('INSERT INTO dokumenty VALUES('''+pik+''','''+SP1DokComboBox.text+''','''+SP1DataTime.Text)+''')');

ale nie jestem pewien czy ten komponent ma wlasciowsc text. Jakas jego odmaina ma ale to chyba w jedi.

pozdrawiam

0

Zaden ze sposobów nie działa:(. Jedyne co udalo mi sie to najpierw zrzucenie daty do jakiegos edit.text a dopiero pozniej zapis w bazie ale to kolejene komponenty i taka droga na okolo. Moze macie jeszcze jakies pomysly. Ktos przeciez musial umieszczac date w bazie:)

0

a o zmiennych słyszałeś? :| po co komponent, do przechowywania tekstu przez chwile?

0

Duzo osob zapisywalo date do bazy ale ja moze raz w zyciu sie spotkalem z kims kto w ten sposob zapisuje. Wdlug mnie ma to tylko uzasadniejnie w momencie gdy nie masz tej tabeli otwartej przez porogram gdy cod do nie zapusuejesz. Bo jesli masz to robi sie to w ten sposob:

Query1.append;
query1.fieldbyname('data').asdatetime:=datetimepicker1.date;
query1.post;

poprzednio nie wczytalem sie dokladnie. Sproboj tak:

FormSprzedaz.SQuery.SQL.Add('INSERT INTO dokumenty VALUES('''+pik+''','''+SP1DokComboBox.text+''','+quetedstr(datetostr(SP1DataTime.Date))+')');

Jezeli to Ci nie dziala to sprawdz czy format daty sie zgadza (co uzywane jest przez baze danych a co prze datetimepicker)

0

O zmiennych slyszalem:) Tylko ze jak wrzucalem do zmiennej powiedzmy X i pozniej ja umieszczalem w bazie +x+ to mi wstawial zawsze 2:)

0

zamiast pisać takie głupoty, że się płakać chce to byście poszukali. PARAMETRY!!!

0

Parametry sie przydaja gdy mamy stala tresc sql.
A taki sposob zmusza do zamieszczenia kikunastu query na kazdej formie!!
A w moim drugim posicie dzialaja oba sposoby.
Wiec na Twoim miesjcu bym tylko powiedzial i zasugerowal inne rozwiazanie bez ublizania innym.

0

Zacznijmy od tego, że rzeczywiście czasem jest wygodniej wrzucać coś do SQla niż po prostu użyć parametrów (np. generujesz skrypt SQLowy).
Po drugie za przeproszeniem co za tuman używa datetimetostr do wrzucania do BD.
Datetimetostr używa ustawień systemowych - co oznacza że jeśli format daty różnic się od bazodanowgo to kicha, a jak nie to w chwili gdy ktoś zmieni ustawienia regionalne na portugalski to możemy się pożegnać z poprawną pracą programu. Tak się składa że baza danych ma skończoną liczbę poprawnych formatów daty (bywa że jedną) i jeśli piszemy pod konkretną BD to po prostu warto użyć FormatDateTime i ustawić na stałe jak będzie wyglądała data idąca do SQLa.
Sprawdź czy przypadkiem nie masz jakiegoś dziwnego (nieznanego BD) ustawienia daty.
Skoro masz SQLa to przed jego wykonaniem zrzuć go do pliku i odpal w jakimkolwiek innym programie - może wtedy zobaczysz co masz źle poskładane.

0

Po drugie za przeproszeniem co za tuman używa datetimetostr do wrzucania do BD.

Masz racje. Mie pomyślałem o tym, pracuje tylko na bazach sql serwera tam sobie ustawiam format daty taki sam jak format systemu.

On nie moze sobie poradzic z wprowadzeniem danych z komponentów dlatego nie radzilem sprawdzenie w jakims Query Analyzer albo cos w tym stylu co zreszta jest dolaczone do delphi.

pozdrawiam

0

Parametry sie przydaja gdy mamy stala tresc sql.
A taki sposob zmusza do zamieszczenia kikunastu query na kazdej formie!!
A w moim drugim posicie dzialaja oba sposoby.
Wiec na Twoim miesjcu bym tylko powiedzial i zasugerowal inne rozwiazanie bez ublizania innym.

CO??? Zanim coś napiszesz zastanów się ze trzy razy. Co za problem napisać tak

with Query, SQL do
begin
  Clear;
  Add('INSERT INTO tabela (pole_a, pole_B) VALUES(:a, :b');
  ParamByName('a').AsString := 'coś';
  ParamByName('b').AsDateTime := Now;
  ExecSQL;
  Clear;
  Add('SELECT * FROM tabela WHERE pole_a = :a');
  ParamByName('a').AsString := 'coś';
  Open;
end;

gdzie tu masz kilkanaście Query na formie???? Tak Ciężko ci dopisać kilka linijek kodu??? Przynajmniej nie masz problemów z konwersją, nie pieprzą ci się cudzysłowie i dokładnie wiesz jakiego typu masz każdy parametr

0

Masz duzo wiecej kodu co raczej nigdy nie jest lepszym rozwiazaniem.
Nie ktorzy dodaja na form powiedzmy 10 query i w kazde wpisuja jakas operacje do jakiej tabeli, np. wstawienie nowego wiersza, update itd.

Nie widze tu rozwiazanego klopotu zwiazanego np. z konwersja daty. Nadal ona bedzie podawana w formacie systemu.

0
daroch napisał(a)

Nie widze tu rozwiazanego klopotu zwiazanego np. z konwersja daty. Nadal ona bedzie podawana w formacie systemu.

to może powinieneś kupić sobie okulary :> Przecież podajesz datę jako datę a nie jako string - czy to aż tak ciężko zauważyć??
ParamByName('b').AsDateTime := Now;

0

Mowie w sensie format (kolejnosc!)

0

Może się mylę ale data to przecież tylko liczba...
I jako taka nie wymaga formatowania.

0

To się zastanów, bo ja znam kilka formatów daty jako liczb... a na dokładkę można formatowac ją tekstowo na wiele sposobów.
Coż to jest data? Umowny sposób przedstawienia wartości niematerialnej rzeczywistej. Co to znaczy 2006-06-14 1200 ? Ze w 2007 roku po narodzeniu Chrystusa (a raczej dniu przyjętym jako dzień jego urodzin, a właściwie dniu wypadająxcym około jego anrodzin, ale najważniejsze że przyjmowanym ogólnie) w szóstym miesiącu, i 14 dniu - w połowie tego dnia (aby nie wdawać się w dyskucje o sekundach...) Ale nie powiedziano co to jest dzień, i niestety nie można policzyć go w sekundach o tym wie każdy co się zetknął z UTC.
Data jako wartość umowna posiada bardzo wiele umownych zapisów. A jęśli ktoś sądzi że TDateTime wyznacza format daty i czasu we wszystkich systemach i po wsze czasy ( :) ) jest ignorantem i tyle.
Co prawda unifikuje się coraz bardziej narzędzia (i całe szczęście) i można poruszać się cąłkiem dowolnie po programach nie zauważając problemu. Wyniak to z umiejętności programistów którzy mają świadomość problemu i umiejętnie sobei z tym radzą. Jesli napiszesz kiedyś program który pójdzie do kilku krajów nagle dowiesz się tylu ciekawych rzeczy - to co u nas normalne gdzie indziej już nie jest, nie wspominając o takich pierdołach jak testowa reprezentacja daty.
A na koniec - a co powiesz na TSystemTime? W delphi implementowany, w innych systemach bywa podstawa?

0
daban2 napisał(a)

...

wszystko to prawda ale co to ma do wątku date konwertować ręcznie do stringa czy używać parametrów???
Przecież jeśli konwertujesz ręcznie to musisz wiedzieć
a) jakiego formatu używa system operacyjny
b) w jakim formacie przechowuje ją baza
a jak użyjesz parametru to zarówno a jak i b masz głęboko w poważaniu, bo tym zajmują się mechanizmy już dawno zaprogramowane.
BTW czy ja gdzieś tam napisałem, że TDateTime to jedyny słuszny zapis daty i czasu??
BTW2 czy ja gdzieś tam napisałem, żeby konwertować datę do formatu liczbowego?? (a to, że TDateTime to alias Doubel to swoją drogą)

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