SQL Server database last_rowID

本文关键字:rowID last database Server SQL | 更新日期: 2023-09-27 17:57:56

我有一个C#应用程序,它必须使用具有1个表(All_Data)和5列(ID, Name, Surename, Age,Location)的SQL Server数据库

在插入新行之前,我如何查找或获取表中最后一个ID的值

我有一个下面的代码,但它,一个工作不好的

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

错误消息:

ExecuteScalar:连接属性尚未初始化

请帮助我

SQL Server database last_rowID

首先,从代码中不清楚变量connection的值是多少
从错误消息中可以看出,您似乎还没有初始化这个变量,因此您得到了错误。(connection = new SqlConnection(....);

然而,这不是处理这种情况的正确方法
您需要使ID列成为IDENTITY列,然后在执行任何INSERT之前不要尝试检索其值
当有新记录要插入时,IDENTITY列直接从数据库接收其值。如果您想避免并发问题,让数据库代码处理这些数据是最好的选择。

如果您需要在INSERT查询后检索ID值,因为您需要它作为其他表中的外键或您自己的代码,那么您可以简单地使用T-SQL命令

 SELECT SCOPE_IDENTITY()

例如,假设您必须在该表中插入一条记录,并且您想知道分配给ID列的IDENTITY值

 string query = @"INSERT INTO All_Data(Name,Surename,Age,Location)
                  VALUES(@name, @surname, @age, @loc);
                  SELECT SCOPE_IDENTITY()";
 using(SqlConnection connection = new SqlConnection(connectionString))
 using(SqlCommand cmd = new SqlCommand(query, connection))
 {
     connection.Open();
     cmd.Parameters.AddWithValue("@name", yourNameValue);
     .... other parameters ...
     int newID = Convert.ToInt32(cmd.ExecuteScalar());
 }

正如您所看到的,这段代码并没有试图传递ID列的值。它只传递带有参数化查询的其他字段。但在第一个查询的末尾,会调用SELECT SCOPE_IDENTITY(),这将返回数据库为列ID分配的任何值(当然,您应该在字段上设置IDENTITY属性)
这将在多用户和并发场景中正确工作

当命令没有连接时会触发错误。请检查连接是否打开。

错误显示ExecuteScalar: Connectio property has not been initialized
仔细检查连接字符串是否定义正确。您可以在这里查看如何定义连接字符串。

你还没有打开连接,所以在使用前打开它:

comSelect = new SqlCommand(query, connection);
connection.Open();
int ID = (int)comSelect.ExecuteScalar();
connection.Close();