c#中SqlDataReader dr = cmd.ExecuteReader();然后读取dr.read(),用了while循环,就一直循环了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中SqlDataReader dr = cmd.ExecuteReader();然后读取dr.read(),用了while循环,就一直循环了相关的知识,希望对你有一定的参考价值。

我查到的数据只有3条然后就一直循环出现这3条数据,代码如下
string sql =sql语句; SqlConnection con = new SqlConnection("server=XL-20120505YISU;database=jianguan;uid=sa;pwd=123");
SqlCommand cmd = new SqlCommand(sql, con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())

this.label2.Text += " " + dr[0].ToString() + " " + dr[1].ToString() + "\n";

从语句上看并没有什么问题,建议确认下数据返回是否正确。必要时下断点看看流程。 参考技术A 用IF(dr.Read())试试

关系对象映射 c#

【中文标题】关系对象映射 c#【英文标题】:Relational object mapping c# 【发布时间】:2013-05-27 17:34:00 【问题描述】:

映射关系表的最佳方法是什么? 超过 150 列。我不想使用任何第三方或实体框架。如果 我正在使用数据阅读器,很难写出所有的列和 将其转换为相关类型。

有没有简单的方法或者这是唯一的方法?

 SqlDataReader _dr = _sqlCom.ExecuteReader() ;

        Info inObj= new Info ();


        while (_dr.Read())
        

            inObj.a=  (int)_dr["a"];
            inObj.b= (int)_dr["b"];
            inObj.c= (int)_dr["c"];
            inObj.d= (int)_dr["d"];
            inObj.e= (int)_dr["e"];
            .....

            ......
        

【问题讨论】:

有一个名为PetaPOCO的微ORM。如果您不想要真正的 ORM,您可能想要使用它。否则你必须自己编写所有代码,或者使用反射,这既糟糕又慢。 【参考方案1】:

如果你想为你完成它,你需要使用 ORM,那里有一些好的,比如Dapper,或者使用反射(但会慢一些)。否则你需要自己处理这一切。然而,除了丑陋的转换之外,您可以编写更多的代码来摆脱转换,并且可能会表现得更好

SqlDataReader _dr = _sqlCom.ExecuteReader() ;


Info inObj = new Info();

if (!_dr.HasRows)  return; 

int aPosition = _dr.GetOrdinal("a");
int bPosition = _dr.GetOrdinal("b");
int cPosition = _dr.GetOrdinal("c");
int dPosition = _dr.GetOrdinal("d");
int ePosition = _dr.GetOrdinal("e");

while (_dr.Read())

    inObj.a = _dr.GetInt32(aPosition);
    inObj.b = _dr.GetInt32(bPosition);
    inObj.c = _dr.GetInt32(cPosition);
    inObj.d = _dr.GetInt32(dPosition);
    inObj.e = _dr.GetInt32(ePosition);

    .....

    ......

【讨论】:

【参考方案2】:

您可以使用反射,如果您可以承受性能损失的话。像这样的东西应该可以工作:

SqlDataReader reader = ...;
var propertyMappings = typeof (Info).GetProperties(BindingFlags.Instance | BindingFlags.Public)
    .Select(p => new Property = p, Ordinal = reader.GetOrdinal(p.Name))
    .ToList();
while (reader.Read())

    var info = new Info();
    foreach (var propertyMapping in propertyMappings)
        propertyMapping.Property.SetValue(info, reader[propertyMapping.Ordinal]);

【讨论】:

我不知道确切的数字,但这并不是微不足道的。在许多情况下,这不是问题,但如果您正在处理 10 列的 100K 行,它可能会增加您的问题。您可能需要进行自己的测试。请注意,上面的代码在进入 Read() 循环之前提取了每个属性的序号。这将提高基于字符串的 reader["column"] 调用的性能。因此,如果您希望在执行自己的性能测试时进行同类比较,则需要更改代码以也使用序数。

以上是关于c#中SqlDataReader dr = cmd.ExecuteReader();然后读取dr.read(),用了while循环,就一直循环了的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SqlDataReader 读取多个结果集? [复制]

c# IDataReader SqlDataReader 区别

SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 Read 无效”

关系对象映射 c#

存储多行存储过程数据以便稍后在 c# 中循环遍历行

SQLDataReader 在 ExecuteReader 之后读取为空