2016-10-05 34 views
1

我想跨線程共享SQLite連接。Microsoft.Data.SQLite(.net core)get atomic last_insert_rowid

如果我在SQLite外殼中鍵入以下內容:

sqlite> begin;插入Person值('Tweety','Bird',80);選擇last_insert_rowid();承諾;

shell打印新的rowid。

在使用Microsoft.Data.SQLite

一個DOTNET芯控制檯應用程序
  SqliteCommand command = new SqliteCommand("begin; insert into Person values('Tweety','Bird',81); select last_insert_rowid(); commit;", connection); 

Console.WriteLine(command.ExecuteScalar());

我希望控制檯會打印新的rowid,但是ExecuteScalar()返回null。我已經確認插入了新行。

  1. 是否有可能使用一個組合命令獲取新的rowid?
  2. 如果我通過多個線程共享連接,這是一個原子事務嗎?
+0

您可以在單獨的命令中執行「select last_insert_rowid()」(連接應保持打開狀態)。 –

+0

但是另一個線程在共享連接的同時會插入一個新行嗎? – EternalIdiot

+0

爲每個線程使用單獨的數據庫連接是常見的做法;由於連接池的使用效率保持良好。在一個連接會話期間(打開和關閉之間),「last_insert_rowid()」返回在此會話中執行的最後一次插入的ID。 –

回答

0

我會引述維塔利Fedorchenko評論:

這是對每個線程使用單獨的數據庫連接常見的做法;由於連接池的使用效率保持良好。在一個連接會話 (在打開和關閉之間)期間,「last_insert_rowid()」返回在此會話中執行的最後一次插入的ID。