Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 在Asp.Net的数据库中插入数据。哪条路更好?_C#_Sql_Asp.net_Stored Procedures_Ado.net Entity Data Model - Fatal编程技术网

C# 在Asp.Net的数据库中插入数据。哪条路更好?

C# 在Asp.Net的数据库中插入数据。哪条路更好?,c#,sql,asp.net,stored-procedures,ado.net-entity-data-model,C#,Sql,Asp.net,Stored Procedures,Ado.net Entity Data Model,我正在一个Asp.Net网站上工作,以便在数据库中插入数据。在阅读了互联网上的不同文章之后,有人建议我们应该使用参数化查询,因为它可以防止SQL注入攻击 所以我想知道哪种方式更好: 在数据库中创建一个带有参数的存储过程,然后在按钮单击事件中调用它以将数据插入数据库中,例如 CREATE PROCEDURE AddInfraction @Description varchar(255), @Penalty money, @Points int AS BEGIN INSERT IN

我正在一个Asp.Net网站上工作,以便在数据库中插入数据。在阅读了互联网上的不同文章之后,有人建议我们应该使用参数化查询,因为它可以防止SQL注入攻击

所以我想知道哪种方式更好:

在数据库中创建一个带有参数的存储过程,然后在按钮单击事件中调用它以将数据插入数据库中,例如

CREATE PROCEDURE AddInfraction
@Description varchar(255), @Penalty money, @Points int
AS
  BEGIN
       INSERT INTO Infractions (Description, Penalty, Points)
       VALUES (@Description, @Penalty, @Points)
  END

using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
        {
            using (SqlCommand command = new SqlCommand("AddInfraction"))
            {
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("Description", Description.Text);
                command.Parameters.AddWithValue("Penalty", Convert.ToInt16(Penalty.Text));
                command.Parameters.AddWithValue("Points", Convert.ToInt16(Points.Text));
                connection.Open();
                queryResult = command.ExecuteNonQuery();
                if (queryResult == 0)
                {
                    return;
                }
            }
            connection.Close();
        }
或者首先在数据库中添加ADO.NET实体数据模型,然后在按钮单击事件中创建最近添加的数据模型的对象,然后调用特定的存储过程并将数据插入数据库中

using (ETrafficChallanSystemEntities eTrafficChallanSystemEntities = new ETrafficChallanSystemEntities())
{
  eTrafficChallanSystemEntities.AddInfraction(Description.Text, 
  Convert.ToInt16(Penalty.Text), Convert.ToInt16(Points.Text));
}

哪种方法是在数据库中插入数据的最佳方法。

这两种方法都适合在数据库中插入数据。使用参数化查询始终是一个不错的选择。我建议使用第二种方法,因为您已经在项目中添加了ADO.NET实体模型。

这两种方法都适合在数据库中插入数据。使用参数化查询始终是一个不错的选择。我建议使用第二种方法,因为您已经在项目中添加了ADO.NET实体模型。

如前所述,这应该是您的首选方法。然而,随着最近微服务模式的发展趋势,最好减少应用程序逻辑与数据库产品的关联。实际上,这取决于应用程序的用途以及后端移动的频率,如前所述,这应该是您的首选。然而,随着最近微服务模式的发展趋势,最好减少应用程序逻辑与数据库产品的关联。实际上,这取决于应用程序的用途以及后端移动的频率。这个问题没有绝对的答案。任何程序(应用程序)都有自己的要求,但我考虑了使用每种方法的一些要点

using (ETrafficChallanSystemEntities eTrafficChallanSystemEntities = new ETrafficChallanSystemEntities())
{
  eTrafficChallanSystemEntities.AddInfraction(Description.Text, 
  Convert.ToInt16(Penalty.Text), Convert.ToInt16(Points.Text));
}
A)使用存储过程优点:

  • 第一次跑得很慢,但下一次跑得很快
  • 数据处理逻辑是独特的和集成的,因此这是不断变化的 如此简单、易懂、快速、可靠和干净
  • 从一个IDE/Language/Maybe框架迁移到另一个IDE/Language/Maybe框架是很容易的,因为大多数业务逻辑都在DB层,所以许多存储过程都是用新语言调用的
B)使用实体数据模型Pros:

  • 没有花时间编写安全且功能强大的存储过程

  • 数据处理逻辑可以通过编码缓慢地改变 进步

  • 对数据库实体(表/视图和 关系)在编码时间

  • 在某些情况下可以更改数据库体系结构,例如 代码优先编程


毕竟,我认为最好将实体模型方式保留在最可变/前端相关/小流程部分,并将存储过程用于持久/深层后端相关/大型和多流程部分。

这个问题没有绝对的答案。任何程序(应用程序)都有自己的要求,但我考虑了使用每种方法的一些要点

A)使用存储过程优点:

  • 第一次跑得很慢,但下一次跑得很快
  • 数据处理逻辑是独特的和集成的,因此这是不断变化的 如此简单、易懂、快速、可靠和干净
  • 从一个IDE/Language/Maybe框架迁移到另一个IDE/Language/Maybe框架是很容易的,因为大多数业务逻辑都在DB层,所以许多存储过程都是用新语言调用的
B)使用实体数据模型Pros:

  • 没有花时间编写安全且功能强大的存储过程

  • 数据处理逻辑可以通过编码缓慢地改变 进步

  • 对数据库实体(表/视图和 关系)在编码时间

  • 在某些情况下可以更改数据库体系结构,例如 代码优先编程


毕竟,我认为最好在最易更改/前端相关/小流程部分保留实体模型,在持久/深层后端相关/大型和多流程部分使用存储过程。

我不建议在简单的读/写查询中使用存储过程,基于以下原因:

  • 有些逻辑是在数据库中实现的,不受源代码控制
  • 难以维护
  • 对项目来说更详细
对于您的案例(Microsoft数据库框架),可以覆盖几乎90%的案例


当然,如果您想对Sql查询进行更多控制,可以使用查询生成器,如(我是此库的作者)

我不建议对简单的读/写查询使用存储过程,原因如下:

  • 有些逻辑是在数据库中实现的,不受源代码控制
  • 难以维护
  • 对项目来说更详细
对于您的案例(Microsoft数据库框架),可以覆盖几乎90%的案例


当然,如果您想更好地控制Sql查询,可以使用查询生成器,如(我是此库的作者)

最好的方法是您自己选择。就个人而言,如果我使用实体框架,我不会使用存储过程。它是否足够安全,不受SQL注入攻击。它是安全的,因为您使用的是参数。参数化查询是最安全的,而且可能更快(因为许多检查/转换可以在程序端完成)。不知道ADO.Net在哪里兼容。但是如果你需要显式的强制转换,这通常是一个不好的类型安全标志,因此是防注入的。最好的方法是你的偏好。就我个人而言,我会的