在C#代码中管理存储过程的最佳实践是什么?

时间:2013-12-21 15:10:18

标签: c# .net stored-procedures ado.net

我在这里很新,所以如果我偏离了本网站的规则,请原谅我。

我正在尝试找到管理代码中存储过程名称的最佳方法。

目前,当我正在调用存储过程时,我正在使用此代码:

public static DataSet GetKeyTables()
{
    DataSet ds = new DataSet();
    ds = SqlDBHelper.ExecuteMultiSelectCommand("Sp_Get_Key_Tables", 
        CommandType.StoredProcedure);
    return ds;
}

但我不认为在代码中陈述存储过程的名称是一个明智的想法,因为它很难跟踪。

我考虑过Enum或app.config解决方案,但我不确定这些是最好的方法。

任何想法都将受到高度赞赏。

5 个答案:

答案 0 :(得分:7)

您可以拥有一个具有SP的名称的常量属性的类。并且在单独的类库(dll)中具有此类。将sp_作为过程的开始也看到链接http://msdn.microsoft.com/en-us/library/dd172115(v=vs.100).aspx

是不好的
public class StoredProcedures
{
    public const string GetKeyTables = "Sp_Get_Key_Tables";
}

答案 1 :(得分:6)

最后,无论你做什么,它总是归结为SP的具体名称字符串。您必须手动保持它们同步。 - 没办法......

您可以使用配置文件,但只有在名称经常更改或者需要在编译后保持可更改时才需要付出额外费用。

答案 2 :(得分:3)

您可以将调用包装在一个简单的网关类中:

public static class StoredProcedures
{
    public static DataSet GetKeyTables()
    {
        return SqlDBHelper.ExecuteMultiSelectCommand(
                "Sp_Get_Key_Tables", 
                CommandType.StoredProcedure);
    }

    public static DataSet GetFoobars()
    {
        return SqlDBHelper.ExecuteMultiSelectCommand(
                "Sp_Get_Foobars", 
                CommandType.StoredProcedure);
   }
}

或者,您可以让POCO了解如何与数据库进行交互:

public class KeyTable
{
   public int Id { get; set; }
   // whatever data you need

   public static List<KeyTable> GetKeyTables
   {
      var ds = SqlDBHelper.ExecuteMultiSelectCommand(
                "Sp_Get_Key_Tables",
                CommandType.StoredProcedure);

      foreach (var dr in ds.Tables[0].Rows)
      {
          // build the POCOs using the DataSet
      }
   } 
}

这样做的好处是,不仅SP名称保存在一个独特的位置,而且如何从数据集中提取数据的逻辑也在同一个地方。

答案 3 :(得分:1)

我没有看到你正在做的事情存在很大问题。您需要将SP名称存储在某处,因此要么在查询中,要么在另一个配置或辅助函数中。

根据规范,我倾向于CRUD操作的存储库,因此我知道所有数据访问,包括任何SP调用,都在ISomeRepository实现中。

答案 4 :(得分:0)

当我在C#中使用存储过程时,我遵循以下规则。

  1. 每个存储过程在代码中只使用一次,以便我拥有 只有一个地方可以更新。我讨厌Magic string并避免 它们但存储过程仅在数据访问层中使用一次(例如存储库,ReadQueries等)。

  2. 对于CRUD操作,使用模式“sp_ {Create / Read / Update / Delete} {EntityName}”。

  3. 如果要在所有存储过程中使用单个位置,可以创建一个带有逻辑的static class来创建存储过程的名称。