【问题标题】:What is the best practice to manage stored procedures in C# code?在 C# 代码中管理存储过程的最佳实践是什么?
【发布时间】:2013-12-21 15:10:18
【问题描述】:

我是新手,如有违反本站规则的地方请见谅。

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

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

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

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

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

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

【问题讨论】:

  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • “但我不认为在代码中说明存储过程的名称是一个明智的想法,因为它很难跟踪。” - 我从来没有遇到过这样的困难。如果你从多个地方调用同一个 SP,你可能会犯不同的错误。在其他新闻中:除非您绝对别无选择,否则我也不建议使用 SP。与直接(但参数化)的 sql 相比,它们几乎没有给你买任何东西。

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


【解决方案1】:

您可以拥有一个具有具有 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";
}

【讨论】:

  • 非常感谢您的回答:)
【解决方案2】:

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

您可以为此使用配置文件,但仅当名称频繁更改或编译后需要保持可更改时,才会付出额外的努力。

【讨论】:

  • 我同意。不过,我喜欢 Priyank 的想法(希望可以使用名称)
【解决方案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名称保存在一个唯一的地方,而且如何从数据集中提取数据的逻辑也在同一个地方。

【讨论】:

  • -1 代表DataSet ds = new DataSet(); ds = new value;
【解决方案4】:

我认为您所做的事情没有什么大问题。您需要将 SP 名称存储在某处,因此无论是在查询中还是在另一个配置或辅助函数中。

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

【讨论】:

  • 我征服了。我有这样一个存储库 - SqlDBHelper
【解决方案5】:

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

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

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

如果您想将所有存储过程放在一个地方,您可以创建一个 static class 并使用逻辑来创建存储过程的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多