【问题标题】:SQL Stored Procedure and ASP.NET API ControllerSQL 存储过程和 ASP.NET API 控制器
【发布时间】:2021-08-26 17:16:21
【问题描述】:

我正在尝试为我的删除方法编写一个存储过程。它适用于我创建的字符串查询,但我正在努力使其更安全。这是我在更改之前所拥有的。

存储过程之前 控制器

[HttpDelete]
        public JsonResult Delete(int ID)
        {
            string query = @"DELETE FROM dbo.WeatherForecast WHERE ID =" + ID;

            DataTable table = new DataTable();
            string sqlDataSource = _configuration.GetConnectionString("WeatherAppCon");
            SqlDataReader myReader;
            using (SqlConnection myCon = new SqlConnection(sqlDataSource))
            {
                myCon.Open();
                using (System.Data.SqlClient.SqlCommand myCommand = new SqlCommand(query, myCon))
                {
                    
                   
                    myReader = myCommand.ExecuteReader();
                    table.Load(myReader);

                    myReader.Close();
                    myCon.Close();
                }
            }


            return new JsonResult("Row Deleted Successfully");
        }

存储过程之后 控制器

    [HttpDelete]
    public JsonResult Delete(int ID)
    {
        string query = "dbo.p_WeatherForecastDelete";

        DataTable table = new DataTable();
        string sqlDataSource = _configuration.GetConnectionString("WeatherAppCon");
        SqlDataReader myReader;
        using (SqlConnection myCon = new SqlConnection(sqlDataSource))
        {
            myCon.Open();
            using (System.Data.SqlClient.SqlCommand myCommand = new SqlCommand(query, myCon))
            {
                
               
                myReader = myCommand.ExecuteReader();
                table.Load(myReader);

                myReader.Close();
                myCon.Close();
            }
        }


        return new JsonResult("Row Deleted Successfully");
    }

SQL 存储过程(不起作用)

USE [WeatherTemplate]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[p_WeatherForecastDelete]
AS
BEGIN
    DELETE FROM dbo.WeatherForecast WHERE ID = + ID;
END

【问题讨论】:

  • 为什么使用存储过程只是为了删除一条记录?您希望通过这样做获得什么优势?
  • 这仅用于学习目的。
  • 你在学什么?您应该注意,您的第一个代码示例容易受到 SQL 注入攻击,因为您没有正确参数化查询。调用 SQL 时要避免字符串连接。你应该了解Little Bobby Tables。对于您的存储过程,您尚未声明要传入 ID 的变量。了解parameters in T-SQL procs
  • 是的,这就是我想要使用存储过程的原因。我只是不确定如何正确地做到这一点。我展示了第一个例子来展示我事先在做什么。
  • 您想使用存储过程来确保安全?那是没有意义的。您可以使用正确参数化的查询同样安全。查看我发送给您的 Little Bobby Tables 的链接。单击左侧的 C#,然后单击 ADO.NET 页面。你会在那里看到很多关于如何正确参数化它的信息。对此的存储过程完全是浪费。

标签: asp.net stored-procedures http-delete


【解决方案1】:

有几点需要纠正:

  1. 指定 SqlCommand 类型

    myCommand.CommandType = CommandType.StoredProcedure;

  2. 添加参数

    myCommand.Parameters.Add(new SqlParameter("@ID", ID));

  3. 修复存储过程接收参数并正确使用

    ALTER PROCEDURE [dbo].[p_WeatherForecastDelete]
        @ID INT
    AS
    BEGIN
        DELETE FROM dbo.WeatherForecast WHERE ID = @ID;
    END

您似乎也没有读取执行结果,因此您可以安全地将 myCommand.ExecuteReader() 替换为 myCommand.ExecuteNonQuery()

【讨论】:

  • 谢谢,我现在可以使用了。但是,我正在使用此方法从 Angular 前端的表中删除列表条目。我如何从前端的数据库中访问 ID # 以便我的表知道要删除哪个条目?例如,如何传递查询字符串“WeatherForecast/?ID=*chosen number based on delete button for each entry*
  • @Lwood 这将是一个单独的问题,尽管您当然应该在提问之前对其进行适当的研究。
  • @Lwood - 如果这是正确的答案,你能请教一下吗?至于从 Angular 传递参数 - 那将是 Angular 主题。您需要提供有关如何在 Angular 前端提取和显示数据的更多详细信息,但简而言之,您只需从 Angular 服务向上面的控制器发出删除请求。
猜你喜欢
  • 2020-08-24
  • 2010-09-08
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多