1. ホーム
  2. database

[解決済み] SQLiteのテーブルから最後のオートインクリメントされたIDを取り出すには?

2023-03-11 21:54:44

質問

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();
}