gpt4 book ai didi

c# - DataReader - 硬编码序数?

转载 作者:可可西里 更新时间:2023-11-01 03:12:22 26 4
gpt4 key购买 nike

当从 DataReader 返回数据时,我通常会使用 DataReader 上的序号引用来获取相关列:

if (dr.HasRows)         
Console.WriteLine(dr[0].ToString());

if (dr.HasRows)         
Console.WriteLine(dr.GetString(0));

if (dr.HasRows)         
Console.WriteLine((string)dr[0]);

我一直这样做是因为在早期有人建议我使用 dr["ColumnName"] 或更优雅的索引方式会导致性能下降。

然而,尽管对数据实体的所有引用都变得越来越强类型,但我对此感到更加不舒服。我也知道上面没有检查 DBNull

DataReader 返回数据的最可靠方法是什么?

最佳答案

在这种情况下,双方都有可能争论不休。正如其他人已经指出的那样,使用名称更具可读性,并且如果有人更改基础数据库中列的顺序也不会中断。但也有人可能会争辩说,如果有人更改基础数据库中的列名,使用序号的好处是不会破坏。不过,我更喜欢前一个论点,并且认为列名的可读性论点通常胜过第二个论点。名称的另一个论据是它可以“ self 检测”错误。如果有人确实更改了字段名称,那么代码更有可能被破坏,而不是在读取错误的字段时出现看似有效的细微错误。

这似乎很明显,但也许值得一提的是同时具有自检测错误和序数性能的用例。如果您在 SQL 中明确指定 SELECT 列表,那么使用序数将不会有问题,因为代码中的语句保证了顺序:

SELECT name, address, phone from mytable

在这种情况下,使用序号访问数据会相当安全。如果有人在表中移动字段并不重要。如果有人更改了名称,则 SQL 语句在运行时会产生错误。

还有最后一点。我刚刚对我帮助编写的提供程序进行了测试。该测试读取了 100 万行并访问了每条记录上的“姓氏”字段(与值进行比较)。 rdr[“lastname”] 的使用耗时 3301 毫秒,而 rdr.GetString(1) 耗时 2640 毫秒(大约提速 25%)。在这个特定的提供程序中,名称的查找使用排序查找将名称转换为序号。

关于c# - DataReader - 硬编码序数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2882280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com