有誰知道(或關心做出suppostion爲)爲什麼將TSQLDataSet有的CommandText屬性(String),而TSqlQuery有SQL屬性(字符串列表)?dbExpress的設計問題
考慮sql語句
select id, name from
table
order by name
如果我使用一個TSqlQuery,那麼我就可以動態地訪問SQL更改查詢表名[1],但如果我使用的是將TSQLDataSet(因爲我有到如果我需要一個bidrectional數據集,該數據集連接到服務提供商,然後到的TClientdataSet),我不得不從字面上設置在CommandText字符串。雖然上面的例子很簡單,但當sql語句涉及更多時,它可能會成爲問題。
更新: 從目前的評論和答案來看,似乎我被誤解了。我不很在乎對於提高組件的運行時性能(什麼呢一毫秒無論何時查詢需要一秒鐘),但我做一下程序員(即我)並保持程序的能力照顧。在現實生活中,我有存儲在TSqlQuery以下查詢:我沒有算過字符串中的字符數
select dockets.id, dockets.opendate, customers.name, statuses.statname,
dockets.totalcost, dockets.whopays, dockets.expected, dockets.urgent,
(dockets.totalcost - dockets.billed) as openbill,
(dockets.totalcost - dockets.paid) as opencost,
location.name as locname, dockets.attention,
statuses.colour, statuses.disporder, statuses.future, dockets.urgcomment
from location, statuses, dockets left join customers
on dockets.customer = customers.id
where dockets.location = location.id
and dockets.status = statuses.id
,但我敢肯定,有超過255個,因此排除將查詢存儲在一個簡單的字符串中。在某些情況下,我想通過添加'and statuses.id = 3'或'and customers.id = 249'行來過濾顯示的數據量。如果查詢存儲爲TStrings,那麼我可以在基本查詢中添加虛擬行'和1 = 1',然後根據需要更新此行。但查詢是一個很長的字符串,我不能輕鬆訪問它的結尾。
我目前在做什麼(代替一個更好的解決方案)創造另一個將TSQLDataSet,並設置其CommandText爲默認將TSQLDataSet的CommandText,而附加額外的條件。
如果考慮更改關於語句本身執行時間的SQL文本語句花費的時間,則更改整個SQL字符串不是問題。在所有情況下,整個SQL語句將被髮送到後臺數據庫驅動程序,所以這兩種方法都是等價的。 (即使設置SQL [1]可能會稍微慢一點,如果'ParamCheck = true' - 請參閱da-soft答案)如果您想更快速地使用dbExpress,但不要使用dbExpress,而應使用直接數據庫訪問組件。 –
1)對不起,但這不是1ms。只要相信...... 2)自Delphi2以來,255不是Delphi字符串的限制。 3)您可以有效地使用作爲字符串的TStrings。我的答案有這一切。 –
爲了防止da-soft沒有清楚地說清楚; 1995年應用於德爾福1的255個字符串字符限制。它自1996年版本2.0起就沒有再應用於Delphi,並且這已經超過15年了!多行字符串可以在delphi屬性檢查器中編輯,如果他們有一個designtime「helper」註冊,在這種情況下,TSqlDataSet.CommandText已經在那裏供您使用。只需單擊屬性檢查器中的省略號按鈕即可獲得一個很好的SQL編輯器助手對話框。它不是RapidSQL或Toad,但它比使用1「寬的字符串屬性更好 –