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

C# 使用列名或整数检索数据表,c#,sql,datatable,C#,Sql,Datatable,因此,在这里只是寻找一个一般的经验法则,似乎无法找到一个合法的方法来继续。我经常看到这两个 基本上你有这样的东西: DataTable dt = new DataTable(); dt blah blah blah .Fill 现在访问: dt.Rows[i]["ColumnName"].ToString(); dt.Rows[i][ColumnInteger].ToString(); 所以问题是,我看到了两者的优点。如果我们一直使用整数,有一天更改表中的列名将没有任何效果。同样,从可读性的

因此,在这里只是寻找一个一般的经验法则,似乎无法找到一个合法的方法来继续。我经常看到这两个

基本上你有这样的东西:

DataTable dt = new DataTable();
dt blah blah blah .Fill
现在访问:

dt.Rows[i]["ColumnName"].ToString();
dt.Rows[i][ColumnInteger].ToString();
所以问题是,我看到了两者的优点。如果我们一直使用整数,有一天更改表中的列名将没有任何效果。同样,从可读性的角度来看,使用列名显然更容易。或者,从性能的角度来看,有理由选择其中一个

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

这并不能回答“什么是正确的方法”的问题,但是如果您想在仍然使用索引的情况下保持可读性,您可以创建一个
枚举

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

dt.Rows[i][(int)ColumnNames.FirstName].ToString();
这不会回答“什么是正确的方法”的问题,但是如果您想在仍然使用索引的情况下保持可读性,您可以创建一个
枚举

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

dt.Rows[i][(int)ColumnNames.FirstName].ToString();
所以说真的,你们在一贯的实践中都看到了什么

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

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

还有一些框架,例如,以及更多的框架,允许您的数据库行(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()}";

这就是它的工作,但是面向对象语言中的逻辑应该被封装。使用ORM,您的数据通过一个表示数据访问的类被请求,并被配置为获取数据并映射它(我将不详细介绍细节)。首先,创建一个:

然后通过数据访问类请求它们

实体框架(DbContext)

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

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

使用:

S单一责任原则

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

所以说真的,你们在一贯的实践中都看到了什么

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

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

还有一些框架,例如,以及更多的框架,允许您的数据库行(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()}";

这就是它的工作,但是面向对象语言中的逻辑应该被封装。使用ORM,您的数据通过一个表示数据访问的类被请求,并被配置为获取数据并映射它(我将不详细介绍细节)。首先,创建一个:

然后通过数据访问类请求它们

实体框架(DbContext)

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

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

使用:

S单一责任原则

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


为了补充@Erik在最后一段中所说的内容:我也喜欢使用实体框架来处理objects.Ty。明智的反应。我认为下面的帖子在这种情况下效果更好。但是要明白你在说什么。我已经标记了答案,但请随意发布任何小样本,我相信其他人也会对此感到疑惑。@ErikPhilips华丽的例子。谢谢你编辑。我想大部分时间我都在关注这里发生的事情。那么,从比较的角度来看,您的示例是否具有可读性并遵循OOP实践?就像当你展示从数据表访问时,我可以很快看出,与经过深思熟虑的方法相比,这看起来是多么丑陋和混乱,但这是所有方法的主要目标吗?因此,与我之前的数据访问方法相比,两周后的实体框架就像一场梦。谢谢你,伙计!你对这篇文章的更新太棒了。再次感谢@MikeCMR很高兴听到它对你有用。请注意,就像任何框架一样,它们都有赞成和反对的一面。有了EF,你可以得到etc等等,来补充@Erik在最后一段中所说的:我喜欢使用实体框架来处理objects.Ty。明智的反应。我认为下面的帖子在这种情况下效果更好。但是要明白你在说什么。我已经标记了答案,但请随意发布任何小样本,我相信其他人也会对此感到疑惑。@ErikPhilips华丽的例子。谢谢你编辑。我想大部分时间我都在关注这里发生的事情。那么,从比较的角度来看,您的示例是否具有可读性并遵循OOP实践?就像当你展示从数据表访问时,我可以很快看出,与深思熟虑的方法相比,这看起来是多么丑陋和混乱,但这是它的主要目标吗?因此,与我的数据访问方法相比,两周后的实体框架就像一场梦
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}";
    }
  }
}
// What else could this class possibly be used for?
public class Person ....
var tom = dbContext.Persons.FirstOrDefault(p => p.FirstName == "Tom");

if (tom.IsMarried) ...

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