因此,仅在此处寻找一般经验法则,似乎无法找到前进的合法方法。我经常看到这两者。
从本质上讲,您有这样的东西:
List[Any]
正在访问:
DataTable dt = new DataTable();
dt blah blah blah .Fill
所以问题是,我看到了两者的优点。如果我们一直使用整数,那么一天更改表中的列名将无效。在同一方面,从可读性的角度来看,使用列名绝对看起来更容易。或者,也许有理由从性能的角度来选择一个。
那么,你们在一致的实践中看到了什么?
答案 0 :(得分:1)
这不会回答“什么是正确的方法”的问题,但是如果您想在仍使用索引的同时保持可读性,则可以创建一个enum
:
enum ColumnNames
{
FirstName = 1,
LastName =2,
}
dt.Rows[i][(int)ColumnNames.FirstName].ToString();
答案 1 :(得分:1)
那么,你们在一致的实践中看到了什么?
它们都存在是有原因的,而当另一个都不存在时它们都非常有用。您将始终与SQL域中的表紧密耦合。如果要通过列索引或字符串将其耦合,这只是您的选择。
在实践中,我从未设计过使用数据表的系统。我有一个类型严格的面向对象语言,所以我选择在通用数据容器上使用对象。
有ORM个框架,例如Entity Framework (microsoft),Dapper,NHibernate 等,它们允许您的数据库行(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 单一责任原则
// 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) ...