在SQL Server中插入新数据的发布或放置方法?

时间:2018-12-19 18:01:33

标签: c# asp.net asp.net-web-api

我是ASP.NET的新手,我想问问哪种方法更适合在SQL Server中插入新行。

我要避免的最大问题是将数据两次插入SQL Server。可能由于某些网络延迟,我将在客户端应用程序中出现服务器错误,但是服务器已接收到我的数据并将其插入SQL Server。当我重试时,它将重新插入它们。

post或put方法可以避免这种情况吗?还是我需要创建自己的机制?

public void Post([FromBody]string value)
{
}

// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}

还有最后一个问题,我可以在同一个控制器内创建两个post方法,还是必须创建一个新方法?

对不起,如果问题看起来很简单,但是正如我所说,我是asp.net的新手。谢谢

2 个答案:

答案 0 :(得分:5)

POST或PUT方法本身无法解决任何问题。如果要避免描述的行为,应通过向该方法添加自己的逻辑来解决。是您的实现,必须控制数据是否存在。

理想情况下,在REST API上,POST用于创建资源,而PUT用于更新现有资源。

话虽如此,您可以根据谁在调用该端点以及在应用程序的哪个实例中实施逻辑。例如,如果某人两次发送具有相同资源的POST,则可以检查该资源是否存在并发送描述情况的HTTP状态。

编辑:

我将添加一些代码向您展示。如何运作:

假设您要在应用程序中创建和更新用户。其终结点可能类似于:http://localhost:8080/api/users/使用POST方法,并在请求正文上将用户作为JSON发送。

您将有一个类似的UsersController:

    public HttpResponseMessage Post([FromBody]UserModel user)
    {
        SQL.InsertUser(user);

        return Request.CreateResponse(HttpStatusCode.OK);
    }

然后在数据层上,您可以执行以下操作:

    public static void InsertUser(UserModel user)
    {
        try
        {
            using (_conn = new SqlConnection(_connectionString))
            {
                _conn.Execute(@"IF EXISTS(SELECT * FROM USER WHERE ID = @ID)
                                BEGIN
                                    /*DO THE UPDATE*/
                                END
                            ELSE
                                BEGIN
                                    /*DO THE INSERT*/
                                END", user);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

这不是最佳方法,但是我想在这里显示的是您可以在POST或PUT上插入资源。事实是,RESTful API的设计应遵循RESTful标准。如果使用PUT方法插入数据,则可能会遇到体系结构问题,并且API根本不是RESTful的。即使它使用HTTP方法进行通讯等等。

在RESTful API上遵循该标准非常重要。对于您和使用API​​的人。

您在这里获得了RESTful入门圣经。我通常将此邮件发送给希望了解RESTful世界的每个人:https://blog.octo.com/en/design-a-rest-api/

答案 1 :(得分:1)

我们用[HttpPost]属性修饰的

Post()方法。

Put()能够更新RESTful服务中的内容