2014-02-25 87 views
1

我有一個結構數組。我需要將該數組中的所有行插入到表中。 所以我只是用cfquery裏面的cfloop來插入數據庫。在cfloop中使用cfquery是不好的做法嗎?

有人建議我不要在cfloop裏面使用cfquery,因爲每次它都會建立一個到數據庫的新連接。

但在我的情況有沒有什麼辦法可以做到這一點,而不使用cfquop裏面的cfquery?

+0

如果您已將數據源設置爲保持連接,則不會爲每次迭代創建新連接。 –

+0

@ Miguel-F:你能詳細解釋我嗎?如何設置數據源以保持連接。 –

+3

爲什麼不在'cfquery'裏面使用'cfloop'來建立'INSERT'語句? –

回答

2

它並沒有太多的關於維護連接與'n'請求插入或更新cfloop中的每個迭代的數據的服務器。這對於少量記錄的測試看起來沒問題,但是當你把它投入生產並且你的客戶端推動你的應用程序來查看幾百行時,那麼你會打到數據庫服務器幾百次好。

正如Scott建議您應該看到的有關構建單一查詢而不是多次訪問數據庫的循環操作。在cfquery內部循環使用可以使用cfqueryparam,但是如果您可以信任數據即可。它已經被清理了,你可能會發現使用類似cfsavecontent的東西來構建你的查詢並在最後在cfquery中輸出字符串更容易。

+0

是的同樣的問題有數以千計的記錄在數據庫中,這可能是一個很好的選擇,動態生成所有查詢字符串,並將其傳遞給cfquery。 –

+3

同意儘量減少數據庫調用。但是,我沒有看到構建sql字符串而不是使用'cfqueryparam'的好處。你在數據庫驗證前就失去了意義,更不用說確保*所有*數據被正確清理(單引號被處理,等等)的負擔現在就是你的數據,而不是依賴經過良好測試的jdbc方法。國際海事組織你最好堅持'cfqueryparam'。 – Leigh

+0

好的建議,除了2100限制,如果他使用SQL Server。 – Henry

0

我已經使用查詢內循環和內循環查詢方法。雖然查詢中的循環在理論上更快,但情況並非總是如此。你必須嘗試每種方法,看看在你的情況下什麼效果最好。

這裏是循環內部查詢語法,使用oracle爲了挑選數據庫。

insert into table 
(field1, field2, etc) 
select null, null, etc 
from dual 
where 1 = 2 
<cfloop> 
union 
select <cfqueryparam value="#value1#"> 
, <cfqueryparam value="#value2#"> 
etc 
from dual 
</cfloop> 
0

根據數據庫的不同,將結構數組轉換爲XML,然後將其作爲單個參數傳遞給存儲過程。

在存儲過程中,執行INSERT INTO SELECT,其中SELECT語句從XML數據包中選擇數據。通過這種方式,您可以用單個INSERT語句插入數百或數千條記錄。

Here's an example

0

使用<cfqueryparam>時可以執行多少個<CFQUERY><cfloop> ...迭代是有限制的。這也是供應商特定的。如果您不知道將生成多少條記錄,則最好刪除<cfqueryparam>,如果安全的話。確保您的數據來自可信來源&已過濾。這種方法可以節省大量的處理時間,因爲它只能對數據庫服務器進行一次調用,而不像外部循環。

+1

我相信這個問題使用另一個嵌套方向......他在'cfloop'內有'cfquery'。 –

相關問題