通过将存储过程写为字符串来执行存储过程是一种好习惯吗?

时间:2019-04-15 17:20:54

标签: 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("@age",SqlDbType.Int)).Value=age;

1 个答案:

答案 0 :(得分:2)

这是添加了Commandtype的代码:

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#代码保持同步。
    • 可以创建自动测试以通知Stored Proc是否有重大更改

如果存储过程仅插入单个UserDetails实体,则也可以使用Entity Framework。 This article显示了如何通过在Fluent API中调用MapToStoredProcedures()自动将实体CUD(创建,更新,删除)操作映射到存储过程。本文还介绍了如何将自己的自定义存储过程映射到EF实体。