C# 通过将存储过程写入字符串来执行它是否是一种良好的做法?

C# 通过将存储过程写入字符串来执行它是否是一种良好的做法?,c#,.net,sql-server,C#,.net,Sql Server,这是否符合良好的做法 cmd.CommandText = "StoredProcedureName_InsertUserDetails"; //Is this line a good or bad since Sql injection is possible here. cmd.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar)).Value=name; cmd.Parameters.Add(new SqlParameter("

这是否符合良好的做法

cmd.CommandText = "StoredProcedureName_InsertUserDetails"; //Is this line a good or bad since Sql injection is possible here.
cmd.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar)).Value=name;
cmd.Parameters.Add(new SqlParameter("@age",SqlDbType.Int)).Value=age;

这是添加了命令类型的代码:

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "StoredProcedureName_InsertUserDetails"; // This line is ok
cmd.Parameters.Add(new SqlParameter("@name",SqlDbType.VarChar)).Value=name;
cmd.Parameters.Add(new SqlParameter("@age",SqlDbType.Int)).Value=age;
通过将存储过程编写为 绳子

会出什么问题?

  • SQL注入?如上图所示,当您将
    CommandText
    设置为硬编码字符串时,不存在SQL注入攻击的可能性
  • 存储过程名称与调用代码不同步:如果调用代码引用未知的存储过程,则可以获取运行时异常。
    • 将存储过程创建脚本置于版本控制之下,靠近使用它的代码。这样就可以使存储过程与C代码保持同步
    • 可以创建自动测试,以注意存储过程是否有中断性更改

如果存储过程只插入单个
UserDetails
实体,则还可以使用实体框架。演示如何通过调用Fluent API中的
MapToStoredProcess()
自动将实体CUD(创建、更新、删除)操作映射到存储过程。本文还解释了如何将自己的自定义存储过程映射到EF实体。

如果不知道使用这行代码的真实上下文,很难给出正确的答案。但是,由于该命令是一个常量字符串,因此我看不出该代码有任何问题(同样,在不知道上下文的情况下冷眼旁观这些行)?您是否允许用户选择要执行的存储过程?此外,要运行存储过程,您需要设置CommandTypeSql注入,但此处不可能。只有在动态生成命令文本的情况下,这里的情况似乎不是这样。这不是sql注入漏洞。我喜欢对存储过程名称使用静态只读字符串字段,这样当在多个位置使用时,您就不会键入错误。您别无选择,只能向
CommandText
提供一个字符串。这里不可能进行SQL注入-假设可以创建
cmd.CommandType=CommandType.storedProcess
单元测试注意存储过程是否有中断性更改。这不是一个单元测试。单元测试独立运行,没有外部依赖关系。你说的是集成测试。