C# 从SQL Server CE数据库的最后一行读取一个值

C# 从SQL Server CE数据库的最后一行读取一个值,c#,sql-server-ce,C#,Sql Server Ce,我有一个包含一些列的数据库,其中一个称为ID datatype=int。 我需要知道最后一行的ID的值,我指的是最后一个创建的行 我尝试了此操作,但出现了运行时错误: string query = "SELECT * FROM Customer WHERE ID = (SELECT MAX(ID) FROM Customer)"; SqlCeCommand comSelect = new SqlCeCommand(query, connection); SqlCeDataReader rdr =

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

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

附言

客户是我的表,ID按升序设置。创建的第一行ID为0,第二行ID为1,以此类推

我需要知道最后一个id,因为当我创建一个新客户时,我想将他的id设置为前一个客户id+1

错误:

System.Data.SqlServerCe.dll中类型为“System.Data.SqlServerCe.SqlCeException”的异常未在用户代码中处理

如果您正在设置Id,并且您可能有其他用户,那么最好保存新数据并获取保存行的代码从db返回的I'd或整个新对象。如果您尝试跟踪用户ID,其他用户可能会添加新项目并将事情搞砸

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

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


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

鉴于并发性可能没有问题,您只需通过调用获取最后一个ID即可

ExecuteScalar返回结果集中第一行的第一列。 查询SELECT MAXID只返回一行和一列。所以ExecuteScalar非常适合这个场景。不需要使用ExecuteReader

但是,处理自动增量方案的正确方法是使用在插入新记录时自动为您设置下一个值的方法。 在这种情况下,您已使用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();

考虑到并发性可能没有问题,您只需通过调用获取最后一个ID即可

ExecuteScalar返回结果集中第一行的第一列。 查询SELECT MAXID只返回一行和一列。所以ExecuteScalar非常适合这个场景。不需要使用ExecuteReader

但是,处理自动增量方案的正确方法是使用在插入新记录时自动为您设置下一个值的方法。 在这种情况下,您已使用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();

您得到了哪个运行时错误?System.Data.SqlServerCe.DLLW中类型为“System.InvalidOperationException”的异常为什么不使用自动增量?我希望您需要参考GetInt325,如果它是第6列,因为该列以基于0的索引开始。您的策略将是线程不安全的,自动递增是一种方法。您会得到哪个运行时错误?System.Data.SqlServerCe.DLL中类型为“System.InvalidOperationException”的异常为什么不使用自动递增?我希望您需要参考GetInt325,如果它是第6列,因为该列以基于0的索引开始。我们的策略将是线程不安全的,自动递增是一种方式。非常感谢!!这工作做得很好!你能告诉我如何使用这个自动增量吗?这似乎是一个更好的解决方案:将IDENTITY属性设置为列,并在插入记录时让数据库计算下一个数字。请记住,您不再需要为此字段传递值。插入后,您可以使用查询SELECT@@IDENTITY检索最后一个插入的值,这让您受益匪浅!我是sql的新手:很高兴能帮上忙,不用担心新手的事。在乞讨会上,我们都是初学者。在SOThanks上再次见到你很多!!这工作做得很好!你能告诉我如何使用这个自动增量吗?这似乎是一个更好的解决方案:将IDENTITY属性设置为列,并在插入记录时让数据库计算下一个数字。请记住,您不再需要为此字段传递值。插入后,您可以使用查询SELECT@@IDENTITY检索最后一个插入的值,这让您受益匪浅!我是sql的新手:很高兴能帮上忙,不用担心新手的事。在乞讨会上,我们都是初学者。今天再见