請問如何預先檢查SQL語法的正確性 |
答題得分者是:change.jian
|
max5020
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
|
a6475
高階會員 ![]() ![]() ![]() ![]() 發表:67 回覆:230 積分:154 註冊:2002-09-15 發送簡訊給我 |
引言: 因為我的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 發送簡訊給我 |
首先感謝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 發送簡訊給我 |
[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 發送簡訊給我 |
我認為你只能直接對資料庫去執行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 發送簡訊給我 |
聽君一席話,勝讀十年書,
我想我大概了解您的意思,
我只是怕我才疏學淺,不知道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 發送簡訊給我 |
令天靈機一動,想到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 發送簡訊給我 |
引言: 這方法我用過了,對於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 發送簡訊給我 |
|
max5020
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
|
max5020
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:277 積分:321 註冊:2003-06-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |