【问题标题】:C# SqlCommand naming conventionC# SqlCommand 命名约定
【发布时间】:2015-12-13 01:07:24
【问题描述】:

我对使用 C# 和 ASP.NET 还很陌生,我很好奇在 SQL 数据库上运行多个查询时是否有命名 SqlCommands 的约定。例如,我创建了我的 SqlConnection,我希望调用一个函数、两个存储过程,然后只创建一个常规的简单查询。目前,我正在使用:

SqlCommand function = new SqlCommand();
SqlCommand command = new SqlCommand();
SqlCommand proc1 = new SqlCommand();
SqlCommand proc2 = new SqlCommand();

这些不同的命令是否有更可接受的命名约定,或者我应该只使用一个命令,因为我在后面的代码块中使用 CommandText 和 CommandType 调用?

【问题讨论】:

  • 为什么不将所有函数/SP 包装到一个单独的 StoredProcedure..
  • 您不需要为每个查询都有实例。只需更改 commandType。
  • 我一般只是创建一个单数SqlCommand cmd,分配它的属性并执行它。然后根据其他数据库相关任务的需要,使用相同的cmd 对象重新分配所有内容。或者,正如 Mayank 所说,您可以创建一个通用方法,该方法采用过程名称、参数集合并循环这些。
  • 由于内部编码策略,命令不能放在单个过程中。因此,我不得不进行多次调用,并且不确定是否可以简单地将 command.* 用于四个完全不同的命令。当代码交给我时,名为函数和命令的那些已经存在于代码中,我只需要重构它们并在 SQL 端进行一些修改。这两个存储的过程是新添加的,我觉得命名很奇怪。

标签: c# sql asp.net coding-style naming-conventions


【解决方案1】:

一个好的和更易读的约定是表达命令将做什么。 如果您阅读 updateProductCommandqueryCategoryCommand,每个人都会立即知道该命令的用途。 当您以存储过程为目标时,最好使用 sproc 名称作为命令前缀,例如 sp_UpdateProductCommand

【讨论】:

  • 这实际上是我问的原因。我的第一直觉是这样做并为命令提供描述性名称,但我没有编写我正在使用的原始代码,而是试图遵循已经存在的约定,因为我不确定是否还有更多接受的做事方式。
【解决方案2】:

如果您在同一范围内有很多命令,则可以使用personCommandproductCommand 之类的名称。从MSDN General Naming Conventions 你可以:

请选择易于阅读的标识符名称。例如,一个属性 命名为 Horizo​​ntalAlignment 比英文更易读 对齐水平。

更倾向于可读性而不是简洁。该物业 名称 CanScrollHorizo​​ntally 比 ScrollableX 好(一个不起眼的 参考 X 轴)。

请勿使用下划线、连字符或任何 其他非字母数字字符。 X 不要使用匈牙利符号。

避免使用与广泛使用的关键字冲突的标识符 编程语言。

查看更多关于C# Coding Conventions。在其他情况下,我更喜欢只使用commandKeep It Simple,因为范围会告诉我。

另一个好技巧,当您使用实现了IDisposable 接口的类型(如SqlCommandSqlConnection)时,您可以使用using() { } 结构在此范围之后处理对象。示例:

public IEnumerable<Person> GetPersons()
{
    var result = new List<Person>();

    using (var connection = new SqlConnection("connection string"))
    {
       // I know it is a person command, because it is in a method for it.
       // Keep it simple!
       using (var command = new SqlCommand("select id, name from persons", connection))
       {
          using (var reader = command.ExecuteReader())
          { 
              while (reader.Read())
              {
                  result.Add(new Person() {
                     Id = (int) reader["id"];
                     Name = reader["name"] as string;                    
                  });
              }
          } // reader is disposed here
       } // command is disposed here
    } // connection is disposed here

    return result;
}

还有更多关于编码约定的内容。请参阅参考资料中的链接。

【讨论】:

  • 如何/为什么这比在int foo() { var cmd = new SqlCommand(); /* do stuff */ return someInt; } 之类的方法中简单地创建对象更好?一旦方法返回,他们不是自己Dispose 吗?这不是垃圾收集器的重点吗?我以前见过这样做,所以我显然遗漏了一些东西。
  • 添加关于您对命名约定的编辑的第二条评论。没有下划线?在多份工作中,甚至在大学里,我也经常看到类似这样的代码:private string _someString; public string SomeString { get { return _someString; } }。但这似乎与他们那里的指导方针背道而驰。这确实被认为是糟糕的形式吗?
  • to @sab669... 下划线前缀通常用于定义类级别的变量,以便您可以快速区分类共享的本地范围... .Net 中更常见的模式是使用自动属性现在。哦,您应该始终调用.Dispose(),因为对象可能持有需要释放的系统资源。如果您等待终结者,您很容易造成资源泄漏。
  • 啊,只是为其他人添加这个。 (来自MSDN)“using 语句确保即使在调用对象上的方法时发生异常也调用 Dispose。您可以通过将对象放在 try 块中然后在 finally 中调用 Dispose 来获得相同的结果块;实际上,这就是编译器翻译 using 语句的方式。”
  • 正如@MatthewWhited 所说,当您在get/set 中没有两条规则时,自动属性很容易创建属性。关于命名约定有很多东西,如果我们尝试在这里解释所有内容,那将是一本书哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2010-09-19
相关资源
最近更新 更多