使用列名或整数检索数据表

时间:2018-11-13 18:44:06

标签: c# sql datatable

因此,仅在此处寻找一般经验法则,似乎无法找到前进的合法方法。我经常看到这两者。

从本质上讲,您有这样的东西:

List[Any]

正在访问:

DataTable dt = new DataTable();
dt blah blah blah .Fill

所以问题是,我看到了两者的优点。如果我们一直使用整数,那么一天更改表中的列名将无效。在同一方面,从可读性的角度来看,使用列名绝对看起来更容易。或者,也许有理由从性能的角度来选择一个。

那么,你们在一致的实践中看到了什么?

2 个答案:

答案 0 :(得分:1)

这不会回答“什么是正确的方法”的问题,但是如果您想在仍使用索引的同时保持可读性,则可以创建一个enum

enum ColumnNames
{
  FirstName = 1,
  LastName =2, 
}

dt.Rows[i][(int)ColumnNames.FirstName].ToString();

答案 1 :(得分:1)

  

那么,你们在一致的实践中看到了什么?

它们都存在是有原因的,而当另一个都不存在时它们都非常有用。您将始终与SQL域中的表紧密耦合。如果要通过列索引或字符串将其耦合,这只是您的选择。

在实践中,我从未设计过使用数据表的系统。我有一个类型严格的面向对象语言,所以我选择在通用数据容器上使用对象。

ORM个框架,例如Entity Framework (microsoft)DapperNHibernate 等,它们允许您的数据库行(XML节点,Json对象等)表示.net对象(已定义,匿名,有时甚至是元组)。目的是从存储系统系统中获取数据并将您的请求转换为类。检索数据后;

数据表可能如下所示:

[1]Id     [2]FirstName         [3]LastName
(int)     (string)              (string)
--------------------------------------------
1         Erik                  Philips

因此,计算全名的代码如下所示:

var fullName = $"{dt.Rows[i][2].ToString()} {dt.Rows[i][3].ToString()}";

var fullName = $"{dt.Rows[i]["FirstName"].ToString()} {dt.Rows[i]["LastName"].ToString()}";

这是可以做到的,但是应该封装面向对象语言中的 logic 。使用ORM,您可以通过代表数据访问的类来请求您的数据,并且该类被配置为获取数据并将其映射(我将不对其细节进行详细介绍)。首先,您首先创建一个POCO

public class Person
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

,然后通过数据访问类要求它们;

实体框架(DbContext)

var person = DbContext.Persons.FirstOrDefault(p => p.id == 1);
// OR
var person = DbContext.Set<Person>().FirstOrDefault(p => p.id == 1);

Dapper:(*我没有使用dapper,因此从技术上讲这可能是错误的,但是您会明白的)

var person = connection.Query<Person>("Select * FROM CUSTOMERS WHERE Id = 1").FirstOrDefault()

NHibernate:

var person = session.Get<Person>(Id);

在所有这些情况下,您都会得到一个Person类/对象。现在,我们可以封装业务逻辑(我们需要一种一致的方式来向我们的数据使用者表示“全名”)。

public class Person
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public DateTime BornOn { get; set; }
  public boolean IsMarried { get; set; }
  public string FullName 
  {
    get 
    {
     return $"{FirstName} {LastName}";
    }
  }
}
  

但这是这一切的主要目标吗?

我个人认为,这一切的目的是帮助开发人员编写良好的代码,其中包括(与我将评论的问题相关的项目);

使用S.O.L.I.D. Principles

S 单一责任原则

// What else could this class possibly be used for?
public class Person ....

Writing readable code with as little documentation as possible

var tom = dbContext.Persons.FirstOrDefault(p => p.FirstName == "Tom");

if (tom.IsMarried) ...

if (tom.BornOn > DateTime.Now) ...