全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1696
推到 Plurk!
推到 Facebook!

在Delphi7中以ADO元件存取ACCESS的"日期/時間"欄位

 
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-19 18:57:08 IP:210.64.xxx.xxx 未訂閱
請教各位先進: 在參考下面兩篇文章後: http://delphi.ktop.com.tw/topic.php?topic_id=47414 http://delphi.ktop.com.tw/topic.php?topic_id=30968 對於存取"日期/時間"欄位感到非常頭疼. 按照參考文章第一篇,修改為新增或更新含有"日期/時間"欄位的Record,程式碼如下:
procedure TFORM2.FormCreate(Sender: TObject);
begin
   WITH FORM1.U_TAB1 DO
   BEGIN
      SQL.Add('UPDATE LAB1');
      SQL.Add('   SET OP_RT = :RT,');
      SQL.Add('       OP_USER =:USER,');
      SQL.Add('       OP_DATE = :DATE');
      SQL.Add(' WHERE ORDER_KIND = :ORD_KD');
   END;
end;    PROCEDURE TFORM2.EXECUTE_SQL;
BEGIN
   WITH FORM1.U_TAB1 DO
   BEGIN
      Close;
      Parameters.ParamByName('RT').Value := SYS_ROLE_CD;
      Parameters.ParamByName('USER').Value := SYS_USER_ID;
      Parameters.ParamByName('DATE').Value := FormatDateTime('YYYY-M-D AMPM H:M:S',NOW);
      Parameters.ParamByName('ORD_KD').Value := WK_ORD_KD;
      ExecSQL;
   END;
END;
以上的程式碼若改為下面的方式(紅色為相異處):
procedure TFORM1.FormCreate(Sender: TObject);
begin
   WITH U_TAB1 DO
   BEGIN
      SQL.Add('UPDATE LAB1');
      SQL.Add('   SET OP_RT = :RT,');
      SQL.Add('       OP_USER =:USER,');
      SQL.Add('       OP_DATE = :DATE');
      SQL.Add(' WHERE ORDER_KIND = :ORD_KD');
      Parameters.AddParameter.Name := 'RT';
      Parameters.AddParameter.Name := 'USER';
      Parameters.AddParameter.Name := 'DATE';
      Parameters.AddParameter.Name := 'ORD_KD';
      Parameters.ParamByName('RT').DataType := ftString;
      Parameters.ParamByName('USER').DataType := ftString;
      Parameters.ParamByName('DATE').DataType := ftDateTime;
      Parameters.ParamByName('ORD_KD').DataType := ftString;
   END;
end;    PROCEDURE TFORM2.EXECUTE_SQL;
BEGIN
   WITH FORM1.U_TAB1 DO
   BEGIN
      Close;
      Parameters.ParamByName('RT').Value := SYS_ROLE_CD;
      Parameters.ParamByName('USER').Value := SYS_USER_ID;
      Parameters.ParamByName('DATE').Value := FormatDateTime('YYYY-M-D AMPM H:M:S',NOW);
      Parameters.ParamByName('ORD_KD').Value := WK_ORD_KD;
      ExecSQL;
   END;
END;
小弟有幾個問題請教: Q1:上方兩組程式碼差別僅為,一組其宣告與執行皆在同一個FORM之中,另一組其宣告與執行在不同FORM之中,但第二組卻必須增加中間紅色部分的程式碼,編譯後才能正常執行,與BDE元件相當不同,請問這是ADO元件特有的用法嗎? Q2:兩組程式碼皆會將系統時間寫入資料庫,第一組寫入的內容是正常的完整時間(YYYY/MM/DD X午 HH:MI:SS),但第二組寫入的卻只有日期(YYYY/MM/DD),請問為何? Q3:若要在SQL COMMAND中直接進行DateTime計算,如下方的程式碼:
1.  SQL.Add('SELECT :DATE - CREATE_DATE AS LAS_DATE FROM LAB2');
2.  SQL.Add('SELECT * FROM LAB2 WHERE :DATE - CREATE_DATE > 20/1440');
第一組的內容已寫入ADO元件的SQL屬性中,欲顯示在DBGRID,但當要編輯DBGRID的TITLE內容時(顯示為中文FieldName),無法將該Query元件Active,當然也無法編輯,應該如何處理呢? 第一組與第二組共同的問題是,能否直接在SQL COMMAND取得系統時間,而不須藉由:DATE變數傳入? Q4:承上,有兩個DateTime欄位DATE1與DATE2,DATE1一定有值,但DATE2卻不一定,在Oracle中可以NVL(DATE2,SYSDATE) - DATE1計算時間的差,請問在ACCESS中要改為怎樣的寫法?(程式碼的意義為,若DATE2有值,就直接計算與DATE1的差值;若DATE2無值,就計算目前系統時間與DATE1的差值)
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-19 21:08:58 IP:220.132.xxx.xxx 未訂閱
Hi, 請修改你的文章為發問而非發表.    A1, 原則上若是你的 TADOQuery有設定 Connection 時, 可以不需要去 AddParameter 應該就可以直接取用, 如
   WITH U_TAB1 DO
   BEGIN
      SQL.Clear; // 先清除
      SQL.Add('UPDATE LAB1');
      SQL.Add('   SET OP_RT = :RT,');
      SQL.Add('       OP_USER =:USER,');
      SQL.Add('       OP_DATE = :DATE');
      SQL.Add(' WHERE ORDER_KIND = :ORD_KD');
      Parameters.ParamByName('RT').DataType := ftString;
      Parameters.ParamByName('USER').DataType := ftString;
      Parameters.ParamByName('DATE').DataType := ftDateTime;
      Parameters.ParamByName('ORD_KD').DataType := ftString;
   END;
A2. 已設定 DATE 參數為 ftDateTime , 則賦值時, 直接給 Now 即可, 無需再轉型為 string, 如
   WITH FORM1.U_TAB1 DO
   BEGIN
      Close;
      Parameters.ParamByName('RT').Value := SYS_ROLE_CD;
      Parameters.ParamByName('USER').Value := SYS_USER_ID;
      Parameters.ParamByName('DATE').Value := NOW;
      Parameters.ParamByName('ORD_KD').Value := WK_ORD_KD;
      ExecSQL;
   END;
Q3 的部分, 弟實測是沒有不能 active 的狀況, 請問錯誤訊息為何? 另, 要取得系統時間, 可以利用 now 即可, 如 SQL.Add('SELECT * FROM LAB2 WHERE now - CREATE_DATE > 20/1440'); Q4, 在 access 中要使用判斷 null 的重給值方式為 iif(isnull(xx), true_value, false_value), 所以可以這麼寫, iif(isnull(DATE2), NOW, DATE2) - DATE1
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-20 11:32:02 IP:210.64.xxx.xxx 未訂閱
感謝timhuang撥空回覆:    1.已修改回【問題】,應該是游標還未離開選項時動到了滑鼠滾輪所致,抱歉.    2.我的TADOQuery是利用TADOConnection與DB連接的,首先貼上弟的測試程式碼(有點複雜喔!)
procedure TForm1.FormCreate(Sender: TObject);
begin
   WITH ADOQuery1 DO
   BEGIN
      Close;
      SQL.Clear;
      SQL.Add('UPDATE LAB1');
      SQL.Add('   SET OP_RT = :RT,');
      SQL.Add('       OP_USER =:USER,');
      SQL.Add('       OP_DATE = :DATE');
      SQL.Add(' WHERE ORD_KD = :ORD_KD');
      Parameters.ParamByName('RT').DataType := ftString;
      Parameters.ParamByName('USER').DataType := ftString;
      Parameters.ParamByName('DATE').DataType := ftDateTime;
      Parameters.ParamByName('ORD_KD').DataType := ftString;
   END;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
   WITH ADOQuery1 DO
   BEGIN
      Close;
      Parameters.ParamByName('RT').Value := 'AA';
      Parameters.ParamByName('USER').Value := 'BB';
      Parameters.ParamByName('DATE').Value := NOW;
      Parameters.ParamByName('DATE').Value := FormatDateTime('YYYY-M-D AMPM H:M:S',NOW);
      Parameters.ParamByName('ORD_KD').Value := 'CC';
      ExecSQL;
   END;
end;
因為Query元件是尚未被使用的,所以綠色的部分弟認為不加亦無妨,對實驗結果亦無影響. 再來是紅色部分的影響,再有這段Code的情況下,無論是使用桔色紫色的Code(此二Code不會同時"有效")將時間傳入,得到的結果皆如圖一;若無這段Code,使用桔色Code可得到的結果如圖一,但紫色Code可得到的結果如圖二: TABLE設定: 圖一: 圖二: 如果捨棄從外部傳入,直接使用SQL.Add(' OP_DATE = NOW')也可以得到如圖二的結果,這也是弟原本Q2的問題. 弟原本Q1要請教的是當procedure TForm1.FormCreate寫在FORM1,而procedure TForm1.Button1Click卻寫在FORM2,當FORM2 USES FORM1且紅色的Code沒有寫時,可以通過編譯的檢查,但執行時會出現錯誤:有寫紅色的Code就沒問題(經弟測試,因為Code的"量"相差許多,本程式並不會發生此問題,但對於使用了15個Query元件的原本程式就會發生問題),請問這是為何?(這個問題好像怪怪的.....)
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-20 13:51:26 IP:203.95.xxx.xxx 未訂閱
關於 parameter 找不到對應的參數名部分, 可以多加一行指令操作, 如, ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text, true); 另外關於存入 access 資料庫會只有日期而沒有時間的部分, 弟做了多資的測試, 皆試不出來, 請問你連結資料庫是用 jet4.0 或是 odbc 呢? 另外 access 的版本為何? 什麼作業系統呢?
系統時間:2024-09-11 18:27:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!