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

8

我是一名新手,请谅解我可能会违反这个网站的规则。

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

当前,当我调用存储过程时,我使用以下代码:

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

但是我不认为在代码中声明存储过程的名称是一个明智的做法,因为这样会很难追踪。

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

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


1
附注:您不应该为存储过程使用 sp_ 前缀。Microsoft已经保留了该前缀供自己使用(请参阅命名存储过程,而且您将来可能会遇到名称冲突的风险。这也会影响您的存储过程性能。最好只是避免使用 sp_,并使用其他前缀或根本不使用前缀! - marc_s
1
但我认为在代码中声明存储过程的名称并不是一个明智的想法,因为这将很难追踪。- 我从来没有遇到过这样的困难。如果您从多个位置调用相同的SP,则可能会出现不同的错误。另外:除非您绝对没有其他选择,否则我也不建议使用SP。与直接(但参数化)SQL相比,它们几乎没有什么优势。 - Marc Gravell
5个回答

7
您可以创建一个具有命名为SPs的常量属性的类,并将此类放在单独的类库(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";
}

非常感谢您的回答 :) - Rotem Orbach

6

无论做什么,最终都归结为SP的具体名称字符串。您必须手动保持它们同步-没有其他方法...

您可以使用配置文件来完成此操作,但只有在名称经常更改或需要在编译后保持可更改性时,才会付出额外的努力。


我同意。然而,我喜欢Priyank的想法(希望使用名字没问题)。 - Rotem Orbach

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(纯 C# 对象):

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名称保存在唯一的位置,而且从数据集中提取数据的逻辑也在同一位置。

-1 表示“DataSet ds = new DataSet(); ds = new value;”。 - John Saunders

1
我认为你所做的事情并没有太大问题。你需要在查询或另一个配置或辅助函数中存储SP名称。
根据规范,我倾向于使用存储库进行CRUD操作,这样我就知道所有数据访问,包括任何SP调用,都在ISomeRepository实现中。

我征服了。我有这样一个代码库 - SqlDBHelper。 - Rotem Orbach

0

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

  1. 每个存储过程在代码中只使用一次,这样我就只有一个地方需要更新。我讨厌魔术字符串并且避免使用它们,但是存储过程仅在数据访问层中使用一次(例如存储库、读取查询等)。

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

如果您想要一个包含所有存储过程的单一位置,可以创建一个带有逻辑以创建存储过程名称的静态类


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接