2012-02-11 34 views
0

我使用Delphi/NexusDB和我建立SQL(約800字符長)在運行時,然後我通過它的nexusdb query.sql.text屬性來執行它,但我發現執行時出現無效令牌的錯誤。德爾福/查詢組件 - 分配一個長字符串(800字符)到sql.text屬性修剪SQL到326字符只有

我通過這樣的SQL

Query.SQL.Text := VarStrSQL; // <<---- string variable holding the SQL 

當我跟蹤我發現在Query.SQL.Text SQL字符串被裁剪爲326字符! 雖然保存SQL的字符串變量是完整的,但是當我將該變量分配給query.sql.text時,只有326個字符通過了,當然這導致無效SQL語法的錯誤

請指出爲什麼SQL字符串像那樣修剪?

更新: * 我試圖memo1.lines.text:= VarStrSQL和備忘錄組件也顯示修剪字符串!!是否有可能在我的字符串中的一個字符導致!德爾福2010年導致TStrings修剪我的字符串的錯誤? *

感謝

+0

'Query.SQL.Text:= VarStrSQL;'嘗試打破你的'VarStrSQL'成較小的部分,比如'Query.SQL.Text:= VarStrSQL1 + VarStrSQL2 + VarStrSQL3'然後嘗試運行。 – PresleyDias 2012-02-11 04:54:26

+0

嘗試調試並查看SQL.Text分配發生時會發生什麼,我假定Query將事件分配給TStrings屬性,以便它可以處理您的SQL ...您可能想要執行類似於Query.SQL.Add ();幾次,看看結果... – ComputerSaysNo 2012-02-11 05:34:35

+0

@PresleyDias你的建議不會有什麼區別。 – 2012-02-11 08:44:38

回答

0

我發現這個問題: 這是nxtChar場時,他們都爲空它們的價值#0和原因字符串微調

不過雖然我檢查null這樣varisnull()煤焦領域卻能跳過這個陷阱功能!這讓我自己去了好幾個小時終於我現在檢查他們這樣

If <nxtChar field> = #0 then <nxtChar field> = '' (or <nxtChar field> = null) 
+1

您可以嘗試FieldStr:= ReplaceString(FieldStr,#0,'',[rfReplaceAll])(如果它在null上工作)而不是上面的代碼。 – RobertFrank 2012-02-11 17:55:32

+0

^^^謝謝我的朋友 – Wel 2012-02-13 14:37:35

3

聽起來像DB提供程序本身的錯誤。 TQuery沒有這樣的限制。

我的建議是使用小型SQL,但綁定參數來設置數據。

而不是

Query.SQL.Text := 'INSERT INTO Store_Information (store_name, Sales, Date) 
VALUES ('Los Angeles ... ... ...', 900, '10-Jan-1999')'; 

代碼

Query.FieldByName('store').AsString := 'Los Angeles ... ... ...'; // here you should have no limitation 
Query.FieldByName('sales').AsInteger := 900; 
Query.FIeldByName('Date').AsDAteTime := Now; 
Query.SQL.Text := 'INSERT INTO Store_Information (store_name, Sales, Date) 
VALUES (:store,:sales,:date)'; 

,而且要求將更快,因爲語句可以被引擎化製備,然後再利用。

+0

謝謝,但我不能使用這種解決方案,我無法檢查每種類型 - 我試過memo1.lines.text:= VarStrSQL和備忘錄組件也顯示字符串修剪!是否有可能在我的字符串中的一個字符導致! Delphi中導致TStrings修剪我的字符串的錯誤? – Wel 2012-02-11 10:56:04