線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2837
推到 Plurk!
推到 Facebook!

請問如何預先檢查SQL語法的正確性

答題得分者是:change.jian
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-12 12:34:23 IP:211.22.xxx.xxx 未訂閱
因為我的SQL是用SQL.LoadFromFile 再看內容決定是用Open或是ExecSQL; 但是我是否可以預先檢查SQL語法的正確性?? (PS.以不會出現SQL.Error為前提)
a6475
高階會員


發表:67
回覆:230
積分:154
註冊:2002-09-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-12 13:02:36 IP:211.23.xxx.xxx 未訂閱
引言: 因為我的SQL是用SQL.LoadFromFile 再看內容決定是用Open或是ExecSQL; 但是我是否可以預先檢查SQL語法的正確性?? (PS.以不會出現SQL.Error為前提)
你可以先一從一行讀取抓取字串的第一個是不是S,還是U;
var lstSQL : TStringList;
    i :integer;
begin
  lstSQL ;= TStringList.Create();
  lstSQL.LoadFromfile('sql.txt');
  for i := 0 to lstSQL.Count -1 do begin
    sTmpSQL := lstSQl[i];
    query1.sql.text := sTmpSQL;
    if (sTmlSQL[1] = 'S') or (sTmlSQL[1] = 's')then begin
      query1.Open;
    end else begin
      query1.Execsql;
    end;   
  end; //for end
  lstSQl.Free; 
end;
另外可以用try,except 來補抓錯誤。 ..-----------βλμε------------..
◎Oo月夜 光明 藍更愁oO◎
藍調月光城v4:http://inping.myweb.hinet.net/ (暫時使用中..) 明日報(藍調.月光):http://mypaper2.ttimes.com.tw/user/a6475 發表人 - a6475 於 2004/07/12 13:05:10 發表人 - a6475 於 2004/07/12 13:06:57
------
月夜 光明 藍更愁
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-12 13:37:20 IP:211.22.xxx.xxx 未訂閱
首先感謝a6475的回應, 我目前是用pos('select', SQL)>0, 來判斷要用Open或ExecSQL, 但是我不太想用Try, Except來測試SQL語法的正確性, 因為SQL內容可能SELECT * FROM ???,或是UPDATE,DELETE等 一來可能會浪費很多時間,,二來也還不能在此時執行SQL的內容, 是否有其他的方法呢??
引言: 因為我的SQL是用SQL.LoadFromFile 再看內容決定是用Open或是ExecSQL; 但是我是否可以預先檢查SQL語法的正確性?? (PS.以不會出現SQL.Error為前提)
你可以先一從一行讀取抓取字串的第一個是不是S,還是U;
var lstSQL : TStringList;
    i :integer;
begin
  lstSQL ;= TStringList.Create();
  lstSQL.LoadFromfile('sql.txt');
  for i := 0 to lstSQL.Count -1 do begin
    sTmpSQL := lstSQl[i];
    query1.sql.text := sTmpSQL;
    if (sTmlSQL[1] = 'S') or (sTmlSQL[1] = 's')then begin
      query1.Open;
    end else begin
      query1.Execsql;
    end;   
  end; //for end
  lstSQl.Free; 
end;
另外可以用try,except 來補抓錯誤。 ..-----------βλμε------------..
◎Oo月夜 光明 藍更愁oO◎
藍調月光城v4:http://inping.myweb.hinet.net/ (暫時使用中..) 明日報(藍調.月光):http://mypaper2.ttimes.com.tw/user/a6475 發表人 - a6475 於 2004/07/12 13:05:10 發表人 - a6475 於 2004/07/12 13:06:57 [/quote]
a6475
高階會員


發表:67
回覆:230
積分:154
註冊:2002-09-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-12 13:43:10 IP:211.23.xxx.xxx 未訂閱
[quote] 首先感謝a6475的回應, 我目前是用pos('select', SQL)>0, 來判斷要用Open或ExecSQL, 但是我不太想用Try, Except來測試SQL語法的正確性, 因為SQL內容可能SELECT * FROM ???,或是UPDATE,DELETE等 一來可能會浪費很多時間,,二來也還不能在此時執行SQL的內容, 是否有其他的方法呢?? [quote]    我才學梳淺, 好像沒有那種可預先檢查SQL語法的功能。 至少我到現在都沒用過>_<    ..-----------βλμε------------..
◎Oo月夜 光明 藍更愁oO◎
藍調月光城v4:http://inping.myweb.hinet.net/ (暫時使用中..) 明日報(藍調.月光):http://mypaper2.ttimes.com.tw/user/a6475
------
月夜 光明 藍更愁
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-12 13:55:03 IP:61.222.xxx.xxx 未訂閱
我認為你只能直接對資料庫去執行LoadFromFile所帶回來的sql指令.雖然我不曉得你的系統是要做出什麼樣的功能,但如果光就"檢查SQL語法是否合法"這個功能,你不應該自己寫. 理由是SQL指令的檢查是資料庫軟體一個滿重要的部分,把一道sql指令解析,然後決定如何抓取/更新資料,這本來就是資料庫的事情.同樣的,即使是判斷要Open或ExecSQL,我也覺得難度很高. 所以,你頂多就是用try-except把執行sql指令的部分包起來(但這卻不是你想要的解法),執行錯誤了,就告訴user,你的sql指令不合法.甚至,連open與execSQL,要用那一種方式,都讓user自己決定,這樣程式會比較簡單. 不過,我以前有看過可以檢查sql指令語法的3-party元件.但成效不彰(那個元件是用來做出類似sql-explorer這類軟體用的),因為很多sql指令明明資料庫可以接受,但元件都顯示錯誤語法.至於那個元件資料....,我沒有,也許有其他人有用過....
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-12 14:24:55 IP:211.22.xxx.xxx 未訂閱
聽君一席話,勝讀十年書, 我想我大概了解您的意思, 我只是怕我才疏學淺,不知道SQL是否有提供這樣的機制, 所以才請教諸位先進,, 其實我只是單純的想要減少Source-Code的字串常數, 以及日後SQL內容更動,不需要改到Source-Code, 所以才要把所有的SQL指令放到Database或SQL-Text File, 但是在建立過程又想要檢查SQL語法的正確性才會這麼做的.. 感謝版主的回答!!    
引言: 我認為你只能直接對資料庫去執行LoadFromFile所帶回來的sql指令.雖然我不曉得你的系統是要做出什麼樣的功能,但如果光就"檢查SQL語法是否合法"這個功能,你不應該自己寫. 理由是SQL指令的檢查是資料庫軟體一個滿重要的部分,把一道sql指令解析,然後決定如何抓取/更新資料,這本來就是資料庫的事情.同樣的,即使是判斷要Open或ExecSQL,我也覺得難度很高. 所以,你頂多就是用try-except把執行sql指令的部分包起來(但這卻不是你想要的解法),執行錯誤了,就告訴user,你的sql指令不合法.甚至,連open與execSQL,要用那一種方式,都讓user自己決定,這樣程式會比較簡單. 不過,我以前有看過可以檢查sql指令語法的3-party元件.但成效不彰(那個元件是用來做出類似sql-explorer這類軟體用的),因為很多sql指令明明資料庫可以接受,但元件都顯示錯誤語法.至於那個元件資料....,我沒有,也許有其他人有用過....
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-13 00:53:27 IP:203.204.xxx.xxx 未訂閱
令天靈機一動,想到Prepare好像可以用,於是測了一下,果然可以喲!不過我只測
了BDE連Paradox而已,其他的我就沒測了。    procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  With Query1 Do Begin
    SQL.Text := Memo1.Text ;
    Try
      Prepare;
      ShowMessage('檢查OK');
      UnPrepare;
    Except
      ShowMessage('檢查Not OK');
    End;
  End;
end;
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-13 09:06:26 IP:211.22.xxx.xxx 未訂閱
引言: 這方法我用過了,對於Interbase, MS-SQL都無效!! 還是感謝版主,花了時間幫我測試,真是不好意思
令天靈機一動,想到Prepare好像可以用,於是測了一下,果然可以喲!不過我只測
了BDE連Paradox而已,其他的我就沒測了。    procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  With Query1 Do Begin
    SQL.Text := Memo1.Text ;
    Try
      Prepare;
      ShowMessage('檢查OK');
      UnPrepare;
    Except
      ShowMessage('檢查Not OK');
    End;
  End;
end;
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-13 09:13:08 IP:211.22.xxx.xxx 未訂閱
[quote] 好象又可以了,是我的疏忽,感謝大家幫忙!! 用Prepare & Unprepare, is OK!!
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-07-13 09:18:05 IP:211.22.xxx.xxx 未訂閱
引言: 原來Prepare只對Select檢查有效, 但是對於Update,Delete,Insert等指令,則沒有檢查效果, 難怪,我之前可以,後來又不行, 然後看了版主Chance36的回覆,再試又可以, 但是現在才發現是這種現象!! [quote] 好象又可以了,是我的疏忽,感謝大家幫忙!! 用Prepare & Unprepare, is OK!!
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-07-13 09:23:55 IP:211.22.xxx.xxx 未訂閱
好象也不是這樣子,我檢查了一些語句,有些可以,有些又不行, 不過目前尙未找到任何的關連性!!
系統時間:2024-09-08 20:27:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!