2

我有一个包含一些列的数据库,其中一个称为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);

GetInt32(6)因为ID是第 6 列)

谢谢大家,对不起我的英语。

附言

客户是我的表,ID 是按升序设置的。创建的第一行有ID = 0第二行,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)只返回一行,只有一列。所以 ExecuteScalar 非常适合这种情况。无需使用 ExecuteReader

但是,处理自动增量方案的正确方法是使用IDENTITY 列,该列会在您插入新记录时自动为您设置下一个值。在这种情况下,您已将 IDENTITY 属性的 ID 列标记为 TRUE,然后将数据插入到表 Customer 中,而不为 ID 列传递任何值。插入后,您立即检索数据库分配给您的 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 回答
0

如果您正在设置Id并且您可能有其他用户最好保存新数据并通过保存行的代码从数据库返回 Id 或整个新对象。如果您尝试跟踪user ids其他用户,可能会添加新项目并将事情搞砸。

如果你必须从数据库中获取最后一个,那么你可以@inserted在你的 sql 中使用来获取添加的最后一行。

于 2013-08-18T16:14:21.173 回答