Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SQL查询在数据库中创建新条目时添加(最新添加的Id+1)_C#_Sql Server_Asp.net Core - Fatal编程技术网

C# 使用SQL查询在数据库中创建新条目时添加(最新添加的Id+1)

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

注意:我知道以前有人问过这个问题,很抱歉这样愚蠢的回复。然而,我发现的所有解决方案实际上都没有帮助我。我可能找错地方了,请原谅

对,所以我尝试在数据库的Releases表中添加一个新条目。下面显示了我的代码的外观

[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自动增量!这两个提示都很重要!