2

いくつかの列を持つデータベースがあり、そのうちの 1 つがID(datatype = int) と呼ばれます。
最後の行の値を知る必要がありますID(最後の行とは、最後に作成されたものを意味します)。

これを試しましたが、実行時エラーが発生します。

string query = "SELECT * FROM Customer WHERE ID = (SELECT MAX(ID) FROM Customer)";
SqlCeCommand comSelect = new SqlCeCommand(query, connection);
SqlCeDataReader rdr = comSelect.ExecuteReader();
int ID = rdr.GetInt32(6);

(6列目GetInt32(6)なので)ID

ありがとう、そして私の英語でごめんなさい。

PS

Customer は私のテーブルで、ID は昇順で設定されます。作成された最初の行にID = 0は 2 番目ID = 1など があります。

ID新しい顧客を作成するときに、以前の顧客に設定したいので、最後のIDを知る必要がありますID+1

エラー:

ユーザー コードで処理されない System.Data.SqlServerCe.dll の 'System.Data.SqlServerCe.SqlCeException' 型の例外

4

2 に答える 2

4

おそらく同時実行性に問題はないという事実を考えると、ExecuteScalar呼び出しで最後の ID を取得できます。

string query ="SELECT MAX(ID) FROM Customer";
SqlCeCommand comSelect = new SqlCeCommand(query, connection);
int ID = (int)comSelect.ExecuteScalar();

ExecuteScalar は、結果セットの最初の行の最初の列を返します。
クエリSELECT MAX(ID)は、1 つの列のみを含む 1 つの行のみを返します。したがって、ExecuteScalar はこのシナリオに完全に適合します。ExecuteReader を使用する必要はありません

ただし、自動インクリメント シナリオを処理する正しい方法は、新しいレコードを挿入するときに次の値を自動的に設定する IDENTITY 列を使用することです。この状況では、IDENTITY プロパティを使用して ID 列を TRUE にマークし、ID 列に値を渡さずにテーブル Customer にデータを挿入します。挿入後、データベースによってID列に割り当てられた値をすぐに取得します

疑似コード

string query ="INSERT INTO Customers (Name, Address, .....) VALUES (.....)";
SqlCeCommand comInsert = new SqlCeCommand(query, connection);
comInsert.ExecuteNonQuery();
query ="SELECT @@IDENTITY";
SqlCeCommand comSelect = new SqlCeCommand(query, connection);
int ID = (int)comSelect.ExecuteScalar();
于 2013-08-18T16:15:27.630 に答える