[解決済み] SQLiteのテーブルから最後のオートインクリメントされたIDを取り出すには?
質問
ID (主キー、オートインクリメント) とコンテンツ (テキスト) のカラムを持つテーブルMessagesを持っています。
私はユーザー名(主キー、テキスト)とハッシュの列を持つテーブルUsersを持っています。
メッセージは1人の送信者(ユーザー)から多くの受信者(ユーザー)に送信され、受信者(ユーザー)は多くのメッセージを持つことができます。
2つのカラムを持つMessages_Recipientsというテーブルを作りました。MessageID (Messages テーブルの ID カラムを参照) と Recipient (Users テーブルのユーザー名カラムを参照) の 2 つのカラムを持つテーブルを作成しました。このテーブルは、受信者とメッセージの間の多対多の関係を表しています。
そこで質問なのですが 新しいメッセージの ID は、それがデータベースに格納された後に作成されます。しかし、この新しいMessageIDを取得するために、先ほど追加したMessageRowへの参照をどのように保持すればよいのでしょうか。
もちろん、最後に追加された行を常にデータベースから検索することはできますが、マルチスレッド環境では異なる行を返す可能性があります。
EDIT: 私が理解するところでは、SQLiteでは
SELECT last_insert_rowid()
. しかし、ADO.Netからこのステートメントを呼び出すにはどうすればいいのでしょうか?
私のPersistenceコード(messagesとmessagesRecipientsはDataTablesです)。
public void Persist(Message message)
{
pm_databaseDataSet.MessagesRow messagerow;
messagerow=messages.AddMessagesRow(message.Sender,
message.TimeSent.ToFileTime(),
message.Content,
message.TimeCreated.ToFileTime());
UpdateMessages();
var x = messagerow;//I hoped the messagerow would hold a
//reference to the new row in the Messages table, but it does not.
foreach (var recipient in message.Recipients)
{
var row = messagesRecipients.NewMessages_RecipientsRow();
row.Recipient = recipient;
//row.MessageID= How do I find this??
messagesRecipients.AddMessages_RecipientsRow(row);
UpdateMessagesRecipients();//method not shown
}
}
private void UpdateMessages()
{
messagesAdapter.Update(messages);
messagesAdapter.Fill(messages);
}
どのように解決するのですか?
SQL Server では、SELECT SCOPE_IDENTITY() で現在のプロセスの最後の ID 値を取得することになります。
SQlite では、オートインクリメントのために次のようになります。
SELECT last_insert_rowid()
を挿入した直後に
http://www.mail-archive.com/[email protected]/msg09429.html
この値を取得するためにSQLまたはOleDbのコードを使用したいというコメントに対する答えです。
using (SqlConnection conn = new SqlConnection(connString))
{
string sql = "SELECT last_insert_rowid()";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
int lastID = (Int32) cmd.ExecuteScalar();
}
関連
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQLiteでテーブルが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] AndroidでSQLiteを使用する際に、並行処理の問題を回避するにはどうすればよいですか?
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] データベースにはすでにオブジェクト名が存在する
-
[解決済み] データベースのインデックスはいくつあっても足りない?
-
[解決済み] DBに型を格納する際のMIMETypeの最大長について
-
[解決済み] SQLite UPSERT / UPDATE OR INSERT
-
[解決済み] scale horizontallyとscale verticallyの意味を教えてください。重複
-
[解決済み] データベースで月額課金システムを設計するためのグッドプラクティス【終了しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Pythonを使用してSQLiteに行を挿入した後、挿入されたIDを取得する方法は?
-
[解決済み] データベースにはすでにオブジェクト名が存在する
-
[解決済み] なぜORMを使う必要があるのですか?[クローズド]
-
[解決済み] 変更履歴/監査データベーステーブルの最適なデザインは?[クローズド]
-
[解決済み] なぜ、いつ、Liquibaseなのか?
-
[解決済み] DynamoDBからアイテム数を取得するには?
-
[解決済み] テーブルのネーミング。アンダースコアとキャメルケース、名前空間?単数形と複数形?
-
[解決済み] SQL Developerで新しい接続を追加する際にOracle TNSの名前が表示されない
-
[解決済み] Postgresqlサーバーのpostgresという名前のデフォルトのデータベース
-
[解決済み] キーの取り外し方法を教えてください。