作者 主題: 請問 Delphi BDE Query 的 ParamByName 失靈了哩!  (閱讀 5675 次)

0 會員 與 1 訪客 正在閱讀本文。

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
請教先進,看一些網站或書都會用下面這樣的語法,但我試的結果都失敗了
Query1.Clear;
Query1.Add('select * from :PERSON');
Query1.ParamByName('PERSON').Value := 'person';
Query1.Open;

到 Open 時就會出現 Invalid use of keyword. Token: FROM Line Number: 1.
的錯誤訊息哩!!!

是否我少做了什麼嗎? 不然怎麼會這樣子呀! 謝謝。
我是用 DELPHI 7
--
TyroneYeh

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5401
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
請問 Delphi BDE Query 的 ParamByName 失靈了哩!
« 回覆 #1 於: 2007-01-31 20:41 »
ParamByName 可以用在取代 table name 嗎? 以前沒這樣用過.
且依照一般 SQL 的寫法, 應該也是不能這樣用. Parameter 應該不是用來做字串取代的動作而已. 應該只能用來取代 where 條件中的變數.
實際在傳到 SQL 的 Server 時, 是有獨立的 function 在傳送這類的變數.

TyroneYeh

  • 俺是博士!
  • *****
  • 文章數: 2396
  • 性別: 男
    • 檢視個人資料
請問 Delphi BDE Query 的 ParamByName 失靈了哩!
« 回覆 #2 於: 2007-02-01 08:50 »
哦哦! 真的是要在 Where 條件下呀,不是都可以想取代那裡就放在那裡呀??
但它的 SQL.Text 還是沒變耶!
--
TyroneYeh

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5401
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
請問 Delphi BDE Query 的 ParamByName 失靈了哩!
« 回覆 #3 於: 2007-02-01 09:00 »
本來就不會改變 SQL.
想清楚 "parameter" 參數, 這個字的意義吧.

一般 MySQL 的習慣是都不用這類的寫法, 而是把所有的條件都變成 SQL 指令, 所以類似的指令, 只要條件不同, 出來的 SQL 就不同.
但是以 Oracle 的角度來看 (不確定其他的是不是如此), 上述不同的 SQL, 就表示不同的指令, 在最佳化的過程中, 那些指令就是不同的, 都必須再 parsing 一次.
如果改用參數的話, 這類的指令, 就會被視為相同的指令, 而只會 parsing 一次, 就可以減少資料庫的 loading.

除了寫的時候比較麻煩外, 這樣子的寫法, 除了上頭的好處外, 也不會被人家把 SQL 指令加在變數裡頭, 造成 SQL 指令與原本的用途不同 (SQL Injection). 因為不管變數裡頭被放了什麼, 都不會變成指令... 而單純的就是變數.