C# 使用SQL查询在数据库中创建新条目时添加(最新添加的Id+1)
注意:我知道以前有人问过这个问题,很抱歉这样愚蠢的回复。然而,我发现的所有解决方案实际上都没有帮助我。我可能找错地方了,请原谅 对,所以我尝试在数据库的Releases表中添加一个新条目。下面显示了我的代码的外观C# 使用SQL查询在数据库中创建新条目时添加(最新添加的Id+1),c#,sql-server,asp.net-core,C#,Sql Server,Asp.net Core,注意:我知道以前有人问过这个问题,很抱歉这样愚蠢的回复。然而,我发现的所有解决方案实际上都没有帮助我。我可能找错地方了,请原谅 对,所以我尝试在数据库的Releases表中添加一个新条目。下面显示了我的代码的外观 [HttpPost] public IActionResult Create(Release release) { var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier); string conn
[HttpPost]
public IActionResult Create(Release release)
{
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
string connectionString = Configuration["ConnectionStrings:DefaultConnection"];
using (SqlConnection connection = new SqlConnection(connectionString))
{
string sql = $"Insert Into Releases (Id, Name, StartDate, EndDate, OwnerId) Values ('(SELECT MAX(Id) + 1 FROM dbo.Releases)', '{release.Name}','{release.StartDate}','{release.EndDate}','{userId}')";
using (SqlCommand command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
}
return View();
}
在我的代码片段中,我使用SELECT MAXId+1插入新条目,其中列Id+1的值是最新条目。这在以前对我是有效的,但现在,由于某种原因,我得到了以下错误:
System.Data.SqlClient.SqlException:“将varchar值“从dbo.Releases”选择MAXId+1转换为数据类型int时,转换失败。”
虽然这个解决方案可能不太理想,但我正在寻找解决我问题的合适方案 在回答您的问题时,“从dbo.Releases中选择MAXId+1”不应包含在引号中;从dbo中选择MAXId+1。发布将返回id列所需的整数值 但是,您确实应该使用列作为id,因为同时请求可能会尝试两次插入相同的id
您还应该使用查询而不是字符串插值,因为这将打开数据库以进行SQL注入。在回答您的问题时,“从dbo.Releases中选择MAXId+1”不应该用引号括起来;从dbo中选择MAXId+1。发布将返回id列所需的整数值 但是,您确实应该使用列作为id,因为同时请求可能会尝试两次插入相同的id
您还应该使用查询而不是字符串插值,因为这将打开数据库以进行SQL注入。1列id的数据类型是什么?2表中id最大值的当前值是多少?id字段不是int吗?还要对IsnullMaxid 0+1进行空检查。最好的方法是在数据库为多用户时使用存储过程,该存储过程将在更新时锁定ID,以便多个用户不会获得相同的ID,也不会跳过数字。是否有不使用标识列的原因?这样也可以避免并发问题。嵌套的select不应该被引用,它必须是INLINE。你不能只做一个ID,因为我相信这是你“标识”的主键。那么您就不必担心传入id了。1列id的数据类型是什么?2表中id最大值的当前值是多少?id字段不是int吗?还要对IsnullMaxid 0+1进行空检查。最好的方法是在数据库为多用户时使用存储过程,该存储过程将在更新时锁定ID,以便多个用户不会获得相同的ID,也不会跳过数字。是否有不使用标识列的原因?这样也可以避免并发问题。嵌套的select不应该被引用,它必须是INLINE。你不能只做一个ID,因为我相信这是你“标识”的主键。那你就不用担心通过身份证了。是的,现在可以了!那对我来说是相当愚蠢的。很高兴我问了这个问题,因为我得到了关于使用参数化查询正确处理这些内容的信息。非常感谢您的详细回答@问题请尝试使用propper自动增量!这两个提示都很重要!是的,现在可以工作了!那对我来说是相当愚蠢的。很高兴我问了这个问题,因为我得到了关于使用参数化查询正确处理这些内容的信息。非常感谢您的详细回答@问题请尝试使用propper自动增量!这两个提示都很重要!