2016-10-17 26 views
0

我已經寫了一些批量插入vb.net代碼(工作)。它爲每個插入調用ExecuteNonQuery(),然後在最後執行commit()。ExecuteNonQuery()在批量插入過程中會做什麼?

我的問題是放置這些插入的位置,而等待commit()命令?我還沒有做任何改變來支持批處理。因此,在調用commit()之前,我現有的代碼將會插入一百萬行。我明顯地問這個問題,知道我是否會遇到內存問題,因此迫使我現在更改我的代碼。

+0

'ExecuteNonQuery()'將返回受影響的行數。是否可以包含你正在使用的樣本片段,那麼你會得到更好的答案? –

+1

他們沒有放在任何地方。他們被執行。你可能不會遇到內存問題,但找出最簡單的方法就是去做。你寫這10行程序並運行它來測試它需要多長時間? –

+1

這裏是一些隨機互聯網人發表的一篇小博客文章,我在使用谷歌時遇到了一些你可能想要閱讀的內容:https://www.jokecamp.com/blog/make-your-sqlite-bulk-inserts-very- fast-in-c/ –

回答

3

在正常的rollback journal mode中,更改只是寫入數據庫。但是,要允許atomic commits,將所有已更改的數據庫頁面的先前內容寫入回滾日誌,以便回滾可以恢復以前的狀態。 (當你做了這麼多插入需要分配新頁面時,這些頁面沒有舊狀態。)

WAL mode中,所有更改都寫入預寫日誌。

在任何情況下,直到數據量溢出page cache(默認大小約爲2 MB)纔會真正寫入數據。

所以一個事務的大小不受內存的限制,只限於磁盤空間。

-3

在批量插入查詢中,command.ExecuteNonQuery()返回受插入,更新或刪除語句影響的行數。

在你的情況下,每次成功插入後,它將返回1作爲整數。 如果您沒有使用事務查詢,則Commit沒有任何意義。如果您未明確使用事務,則會自動提交更改。

+1

呃..我認爲那不是OP問的? –

+0

如果事務沒有被使用,提交就會出錯,所以推測他們是。問題是關於這個未提交的數據實際存儲在哪裏。 – user1751825

+0

這不是我的問題。我知道它返回了什麼。 – pnizzle