我的问题是如何在C#中使用SqlDataReader获取查询返回的行数。我已经看到了一些关于这方面的答案,但除了一个用Read()方法执行while循环并递增计数器的答案之外,没有一个是明确定义的。
我的问题是,我试图填充一个多维数组,第一行是列标题名称,之后的每一行都是行数据。
我知道我可以将数据放在列表控件中,不用担心,但为了个人启迪,我也想根据自己的选择将数据拉入和拉出数组,并以不同的格式显示它。
所以我认为我不能先做Read(),然后再递增++,因为这意味着我必须先打开Read(),然后再打开Read(),才能获得行数和列数据。
这只是我所说的一个小例子:
int counter = 0;
while (sqlRead.Read())
{
//get rows
counter++
}然后使用for循环遍历列并弹出
something.Read();
int dbFields = sqlRead.FieldCount;
for (int i = 0; i < dbFields; i++)
{
// do stuff to array
}发布于 2013-09-11 16:15:34
如果您不需要检索所有行,并且希望避免进行双重查询,则可以尝试执行以下操作:
using (var sqlCon = new SqlConnection("Server=127.0.0.1;Database=MyDb;User Id=Me;Password=glop;"))
{
sqlCon.Open();
var com = sqlCon.CreateCommand();
com.CommandText = "select * from BigTable";
using (var reader = com.ExecuteReader())
{
//here you retrieve what you need
}
com.CommandText = "select @@ROWCOUNT";
var totalRow = com.ExecuteScalar();
sqlCon.Close();
}您可能必须添加一个事务,但不确定重用同一命令是否会自动在其上添加一个事务...
发布于 2009-09-05 13:39:28
根据上面的说明,数据集或类型化数据集可能是一个很好的临时结构,您可以使用它来进行过滤。SqlDataReader意味着可以非常快速地读取数据。当您在while()循环中时,您仍然连接到DB,并且它会等待您执行您正在执行的操作,以便在继续执行之前读取/处理下一个结果。在这种情况下,如果拉入所有数据,关闭与数据库的连接,并“离线”处理结果,可能会获得更好的性能。
人们似乎讨厌数据集,所以上面的事情也可以用强类型对象的集合来完成。
发布于 2009-09-05 13:28:45
您不能直接从数据读取器获取行数,因为这就是所谓的firehose游标-这意味着数据是根据正在执行的读取操作逐行读取的。我建议不要对数据进行两次读取,因为在进行两次读取之间,数据可能会发生变化,因此您会得到不同的结果。
您可以做的是将数据读取到一个临时结构中,并使用它来代替第二次读取。或者,您需要更改检索数据的机制,并使用类似于DataTable的内容。
https://stackoverflow.com/questions/1383315
复制相似问题