sqldatareader如何得到查询出记录的总条数???

时间:2021-08-31 23:24:53
使用sqldatareader查询数据库没有绑定到dataset上,如何查询的总条数呢?使用RecordsAffected提示没有这个属性,如果把查询语句改为select count(*) as cun,* from huifu where bianhao='0001'
则提示有未包含在聚合函数中的列,请问这个问题怎么解决,谢谢了。

12 个解决方案

#1


写二条sql语句实现

#2


SqlDataReader.RecordsAffected 属性

已更改、插入或删除的行数;如果没有任何行受到影响或语句失败,则为 0;-1 表示 SELECT 语句。

直到读取了所有行并关闭 SqlDataReader 时,才会设置 RecordsAffected 属性。

该属性的值是累积值。例如,如果以批处理模式插入两个记录,则 RecordsAffected 的值将为二。

当 SqlDataReader 关闭后,只能调用 IsClosed 和 RecordsAffected 属性。

#3


1. 循环SqlDataReader,取出总条数
2。 查询时用两个SQL语句,用SqlDataReader.NextResult获取第二个结果

#4


select count(*) as cun,* from huifu where bianhao='0001'


你这条里面改成
select count(*) as cun from huifu where bianhao='0001'
试试

#5


select count(*) from tablename where condition

#6


由于sqlreader都是有command对象查询出来的,而在command对象里面的sqlparameter可以设置传出值,
reader是以向前游标方式读取数据,因此光用reader不能得道记录数

#7


1\、select count(*) as cun from huifu where bianhao='0001'
2、调用command对象的 ExecuteScalar ,返回一个对象类型,仅表示结果集中第一行第一列的值。需要显式的转换成整形
3、自己用循环写出来(最差的方法了)

#8


不想用循环所以才问有没有其他办法的,
to:vivianfdlpw()您所说的用两个sql语句实现起来应该怎么做呢,能不能给个例子看看啊,谢谢了。

#9


不知道楼主这么做是因为什么?
你的查询语句就算获取数据总数,也会有大量的冗余 
每条记录都会有一个记录总数的的字段,
若楼主坚持这么做的话 ,可以
把查询语句改为
select *,(select count(*) from huifu where bianhao='0001') as cun from huifu where bianhao='0001'
不过最后还是建议楼主用存储过程,用返回值获取记录总数。

#10


谢谢了,现在时间比较紧了,等有空再把它改成存储过程吧。
主要就是不想用循环来计算查询的总数。

#11


string connString="server=(local);database=test;trusted_connection=true";
SqlConnection conn=new SqlConnection (connString);
conn.Open ();

string sql="select * from A select @@rowcount";
SqlCommand cmd=new SqlCommand (sql,conn);

SqlDataReader dr=cmd.ExecuteReader();

//获取第一个记录集
while(dr.Read())
{
    //代码
}

if(dr.NextResult())//下一个记录集
{
     if(dr.Read())
{
Response.Write ("记录数为"+dr[0].ToString());
}
}

//关闭连接
dr.Close ();
conn.Close ();

#12


我的老天,调用command对象的 ExecuteScalar 
这个不就是最好的办法嘛.

看一下.net framework1.1开发包中关于ExecuteScalar 
的这部分.简单的一塌糊涂.

#1


写二条sql语句实现

#2


SqlDataReader.RecordsAffected 属性

已更改、插入或删除的行数;如果没有任何行受到影响或语句失败,则为 0;-1 表示 SELECT 语句。

直到读取了所有行并关闭 SqlDataReader 时,才会设置 RecordsAffected 属性。

该属性的值是累积值。例如,如果以批处理模式插入两个记录,则 RecordsAffected 的值将为二。

当 SqlDataReader 关闭后,只能调用 IsClosed 和 RecordsAffected 属性。

#3


1. 循环SqlDataReader,取出总条数
2。 查询时用两个SQL语句,用SqlDataReader.NextResult获取第二个结果

#4


select count(*) as cun,* from huifu where bianhao='0001'


你这条里面改成
select count(*) as cun from huifu where bianhao='0001'
试试

#5


select count(*) from tablename where condition

#6


由于sqlreader都是有command对象查询出来的,而在command对象里面的sqlparameter可以设置传出值,
reader是以向前游标方式读取数据,因此光用reader不能得道记录数

#7


1\、select count(*) as cun from huifu where bianhao='0001'
2、调用command对象的 ExecuteScalar ,返回一个对象类型,仅表示结果集中第一行第一列的值。需要显式的转换成整形
3、自己用循环写出来(最差的方法了)

#8


不想用循环所以才问有没有其他办法的,
to:vivianfdlpw()您所说的用两个sql语句实现起来应该怎么做呢,能不能给个例子看看啊,谢谢了。

#9


不知道楼主这么做是因为什么?
你的查询语句就算获取数据总数,也会有大量的冗余 
每条记录都会有一个记录总数的的字段,
若楼主坚持这么做的话 ,可以
把查询语句改为
select *,(select count(*) from huifu where bianhao='0001') as cun from huifu where bianhao='0001'
不过最后还是建议楼主用存储过程,用返回值获取记录总数。

#10


谢谢了,现在时间比较紧了,等有空再把它改成存储过程吧。
主要就是不想用循环来计算查询的总数。

#11


string connString="server=(local);database=test;trusted_connection=true";
SqlConnection conn=new SqlConnection (connString);
conn.Open ();

string sql="select * from A select @@rowcount";
SqlCommand cmd=new SqlCommand (sql,conn);

SqlDataReader dr=cmd.ExecuteReader();

//获取第一个记录集
while(dr.Read())
{
    //代码
}

if(dr.NextResult())//下一个记录集
{
     if(dr.Read())
{
Response.Write ("记录数为"+dr[0].ToString());
}
}

//关闭连接
dr.Close ();
conn.Close ();

#12


我的老天,调用command对象的 ExecuteScalar 
这个不就是最好的办法嘛.

看一下.net framework1.1开发包中关于ExecuteScalar 
的这部分.简单的一塌糊涂.