2

I have two functions.

One Insert into database. It opens the connection and closes it after insert. Other is GetLastID function.

I know I could query the biggest ID but I was told it's a bad practice.

"SELECT sqlite_last_insert_rowid();" seems no use since I'm closing the connection after Insert.

4

3 に答える 3

3

データを挿入し、同じ接続を使用して(閉じずに)IDを取得する必要があります。

以下のSQLのようなことをします。

string sql = "Insert into Product (Name) values(@Name); SELECT last_insert_rowid() AS ProductID;";

次に、ROWIDを取得するExecuteScalar()代わりに、コマンドオブジェクト関数を使用する必要があります。ExecuteNonQuery()

ProductIDテーブルに、通常は自動インクリメントのINTEGERという名前の列があり、主キーとして設定されていることを確認してください。

于 2011-10-10T06:10:58.540 に答える
0

last_insert_rowid()(および他のデータベースの同様の関数)は、その性質上、現在の接続でのみ機能します。接続を閉じる前にlast_insert_rowid()をクエリするようにコードをリファクタリングできませんか?

なんらかの理由でそれが不可能な場合は、最大のIDを照会するだけで済むと思います。直後に別の行が挿入されている可能性があるため、これは悪い習慣と見なされます。そのため、考えている行のIDを取得できるとは限りません。代わりにクエリできる一意のインデックスを持つ別の列がデータベースにありますか?つまり、次のようなものです。

SELECT id FROM users WHERE email = 'somone@gmail.com'

電子メールが一意であることが保証されている場合は、信頼できる代替手段になります。

于 2011-10-10T06:14:55.580 に答える
0
SELECT seq FROM sqlite_sequence where name=@Table

問題は解決しました。

于 2011-12-16T03:44:07.683 に答える