我有一个包含一些列的数据库,其中一列名为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列)
谢谢大家,对不起我的英语。
P.S。
客户是我的表,ID按升序设置。创建的第一行包含ID = 0
第二行ID = 1
等
我需要知道最后一个ID,因为当我创建新客户时,我想将他的ID
设置为以前的客户ID+1
错误:
在用户代码中未处理的System.Data.SqlServerCe.dll中的类型'System.Data.SqlServerCe.SqlCeException'的异常
答案 0 :(得分: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
但是,处理自动增量方案的正确方法是使用an IDENTITY column,它会在您插入新记录时自动为您设置下一个值。 在这种情况下,您已将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();
答案 1 :(得分:0)
如果您正在设置Id
并且您可能有其他用户更好地保存新数据并获取我或者整个新对象,通过保存行的代码从数据库返回。如果您尝试跟踪user ids
其他用户可能会添加新项目并搞砸了。
如果您必须从数据库中获取最后一个,那么您可以在sql中使用@inserted
来添加最后一行。