C# 在Asp.Net的数据库中插入数据。哪条路更好?
我正在一个Asp.Net网站上工作,以便在数据库中插入数据。在阅读了互联网上的不同文章之后,有人建议我们应该使用参数化查询,因为它可以防止SQL注入攻击 所以我想知道哪种方式更好: 在数据库中创建一个带有参数的存储过程,然后在按钮单击事件中调用它以将数据插入数据库中,例如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
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层,所以许多存储过程都是用新语言调用的
- 没有花时间编写安全且功能强大的存储过程
- 数据处理逻辑可以通过编码缓慢地改变 进步
- 对数据库实体(表/视图和 关系)在编码时间
- 在某些情况下可以更改数据库体系结构,例如 代码优先编程
毕竟,我认为最好将实体模型方式保留在最可变/前端相关/小流程部分,并将存储过程用于持久/深层后端相关/大型和多流程部分。这个问题没有绝对的答案。任何程序(应用程序)都有自己的要求,但我考虑了使用每种方法的一些要点 A)使用存储过程优点:
- 第一次跑得很慢,但下一次跑得很快
- 数据处理逻辑是独特的和集成的,因此这是不断变化的 如此简单、易懂、快速、可靠和干净
- 从一个IDE/Language/Maybe框架迁移到另一个IDE/Language/Maybe框架是很容易的,因为大多数业务逻辑都在DB层,所以许多存储过程都是用新语言调用的
- 没有花时间编写安全且功能强大的存储过程
- 数据处理逻辑可以通过编码缓慢地改变 进步
- 对数据库实体(表/视图和 关系)在编码时间
- 在某些情况下可以更改数据库体系结构,例如 代码优先编程
毕竟,我认为最好在最易更改/前端相关/小流程部分保留实体模型,在持久/深层后端相关/大型和多流程部分使用存储过程。我不建议在简单的读/写查询中使用存储过程,基于以下原因:
- 有些逻辑是在数据库中实现的,不受源代码控制
- 难以维护
- 对项目来说更详细
当然,如果您想对Sql查询进行更多控制,可以使用查询生成器,如(我是此库的作者)我不建议对简单的读/写查询使用存储过程,原因如下:
- 有些逻辑是在数据库中实现的,不受源代码控制
- 难以维护
- 对项目来说更详细
当然,如果您想更好地控制Sql查询,可以使用查询生成器,如(我是此库的作者)最好的方法是您自己选择。就个人而言,如果我使用实体框架,我不会使用存储过程。它是否足够安全,不受SQL注入攻击。它是安全的,因为您使用的是参数。参数化查询是最安全的,而且可能更快(因为许多检查/转换可以在程序端完成)。不知道ADO.Net在哪里兼容。但是如果你需要显式的强制转换,这通常是一个不好的类型安全标志,因此是防注入的。最好的方法是你的偏好。就我个人而言,我会的