急問-- Delphi + mysql 的 select 問題 (有關date 型態) |
尚未結案
|
dedo
一般會員 發表:13 回覆:16 積分:5 註冊:2003-11-21 發送簡訊給我 |
各位大大,
我遇到的問題很怪,我是透過BDE存取mysql
在下select指令時,若用到某些mysql的函數或 date 型態就會有問題
比如, Query1.SQL.ADD('select current_time');
s:=Query1.FieldByName('current_time').value;
showmessage(s);
這種就會有錯誤,錯誤訊息大概是說invalid keyword : current_time 另外一種有關於mysql的 date 型態欄位怪問題,比如 :
Query1.SQL.Add('Select c_date from table where c_date > :mydate');
Query1.ParamByName('mydate').AsString := mydate;
(然後我用 DBGrid 將c_date顯示在form上)
若我的資料庫裡c_date是設為date型態,錯誤訊息是Type mismatch for field 'c_date', expecting:String actual:Date
而若把c_date改為char型態,就不會有問題 這樣簡述不知大伙看不看的懂 有人遇過相同的情況嗎
謝謝指教 ^^ < >< >
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好! 問題的原因在于資料表中的欄位形態和您程式碼中指定的值形態不符.
Query1.SQL.ADD('select current_time');
s:=Query1.FieldByName('current_time').value;
showmessage(s);
//current_time欄位是Datetime欄位形態, 而S是字串形態 Query1.SQL.Add('Select c_date from table where c_date > :mydate');
Query1.ParamByName('mydate').AsString := mydate;
//這里是同樣的問題, c_date欄位是date形態, 而您的程式碼中用AsString, 此函數是針對字串形態欄位而言, 賦值給不同形態的欄位, 當然就會出問題了, 而當您把c_date欄位改為char形態, 即可与字串形態值相賦相通, 如果您不改動c_date欄位的形態, 依舊是date形態, 您可將程式碼改成如下皆可:
Query1.ParamByName('mydate').AsDate := mydate;
P.S mydate變數需宣告為TDate形態 參考看看! =====================
努力,相信會獲得美麗!
忻晟 發表人 - cashxin2002 於 2003/12/06 05:26:04
------
忻晟 |
dedo
一般會員 發表:13 回覆:16 積分:5 註冊:2003-11-21 發送簡訊給我 |
您好,
第一個問題好像不是出在型態,因為依錯誤訊息來看,好像是它看不懂一些mysql的token,我的寫法如下: var mydate : TDate; Query1.Close;
Query1.SQL.Clear;
Query1.Params.Clear;
Query1.SQL.Add('Select current_date');
if Query1.Prepared=False then Query1.Prepare;
Query1.Open;
Query1.First;
mydate := Query1.FieldByName('current_date').Value;
showmessage(DateToStr(mydate));
而錯誤訊息如下:
EDBEngineError with message 'Invalid use of keyword.
Token : CURRENT_DATE 這種它看不懂token的錯誤訊息在我用mysql的password()函數加密字串時也有出現,寫法如下:
Query1.SQL.Add('select no from city where id=:id and pw=password(:pw)');
Query1.ParamByName('id').AsString := id ;
Query1.ParamByName('pw').AsString := pw ;
if Query1.Prepared=False then Query1.Prepare;
Query1.Open;
其錯誤訊息依然是'Invalid use of keyword. Token : password(?) 但很奇怪的是,相同的password函數,若我用insert指令,就不會有問題,寫法如下:
Query1.SQL.Add('Insert into city (id,pw) values(:id,password(:pw))');
Query1.ParamByName('id').AsString := id ;
Query1.ParamByName('pw').AsString := pw ;
Query1.ExecSQL;
這個insert指令裡的password()它就看的懂,我到mysql裡去看的確也寫入加密過的pw了。 這樣的問題 有人知道為什麼嗎
|
cashxin2002
版主 發表:231 回覆:2555 積分:1937 註冊:2003-03-28 發送簡訊給我 |
您好﹗ 附上您的程式碼如下﹕
var mydate : TDate; begin Query1.Close; Query1.SQL.Clear; Query1.Params.Clear; Query1.SQL.Add('Select current_date'); if Query1.Prepared=False then Query1.Prepare; Query1.Open; Query1.First; mydate := Query1.FieldByName('current_date').Value; showmessage(DateToStr(mydate)); end;//Query在新增的SQL語法中﹐少了'From 資料表名稱'字句 ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟 |
dedo
一般會員 發表:13 回覆:16 積分:5 註冊:2003-11-21 發送簡訊給我 |
您好, 'from 資料表名稱' ?
你是指'select xxx from table'這樣嗎...
若是的話,在這一句裡是不用的喔,因為current_date和curdate()是一樣的,
在mysql都是去抓系統日期,意即,若在mysql資料庫指令模式下打select current_date; 或 select curdate(); 都會得到如下結果: +--------------+
| current_date |
+--------------+
| 2003-12-06 |
+--------------+
1 row in set (0.09 sec) +------------+
| curdate() |
+------------+
| 2003-12-06 |
+------------+
1 row in set (0.00 sec)
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |