我需要在 DataReader 中进行两次迭代。有没有一种方法可以在不使用 DataSets 和不运行两次查询的情况下完成此操作?顺便说一下,我正在使用 C#。
谢谢
我需要在 DataReader 中进行两次迭代。有没有一种方法可以在不使用 DataSets 和不运行两次查询的情况下完成此操作?顺便说一下,我正在使用 C#。
谢谢
这是一个只能向前读取的阅读器,无法后退。最好的方法是在一次迭代中执行您想要执行的两个操作,而不是迭代两次数据阅读器。
您可以自己缓存结果,但这就像破坏了DataReader的目的,因此,如果您需要多次方便地使用数据,则必须选择另一种访问方式。
这是可能的,但并不简单,因为数据读取器在每次Read()调用时都会发生变化。因此,您需要将先前的值存储在某个地方以便下次访问。在这里使用数据集并不是一个坏主意。
我有一种解决这个问题的方法,可能不是最好的,但我已经多次使用它而没有问题。 您可以在选择子句中创建一个子查询来生成将返回多少行。 例如:
SELECT productid,
name,
price,
(SELECT COUNT(*) FROM tblProduct WHERE categoryid=1 AND price <= 1000)
AS 'RowCount'
FROM tblProduct
WHERE categoryid=1 AND price <= 1000;
IDataReader
规范不允许重置列表,但是请检查特定的实现是否还实现了 IEnumerator
或者是否有一个 GetEnumerator()
函数,因为该接口中包含了 Reset 命令。
...
StringBuilder VBAstrBldr = new StringBuilder();
List<object> objects = new List<object>();
string destPath = string.Empty;
string _filePath = string.Empty;
string timestampSuffix = string.Empty;
...
string commandTextDC = @" SELECT [CategoryID]
,[AreaNo]
,[CategoryDesc]
,[CategoryNo]
,[CatCodeDisableDate]
,[CatCodeDeprecateDate]
FROM [dbo].[Categories] ";
...
using (var connection = new SqlConnection(_dbLogConn))
{
connection.Open();
using (var tran = connection.BeginTransaction())
{
using (var command = new SqlCommand(commandTextDC, connection, tran))
{
try
{
var adapter = new SqlDataAdapter(command);
DataSet thedataSet = new DataSet();
adapter.Fill(thedataSet);
VBAstrBldr.Clear();
foreach (DataTable table in thedataSet.Tables)
{
foreach (DataRow row in table.Rows)
{
VBAstrBldr.Append(Environment.NewLine);
foreach (DataColumn column in table.Columns)
{
object item = row[column];
// read column and item
VBAstrBldr.Append("columnName: " + column.ColumnName.ToString() + " Value: " + item.ToString());
VBAstrBldr.Append(Environment.NewLine);
}
}
}
_filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);
destPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "VBAwithDC" + timestampSuffix + ".txt");
using (StreamWriter sw = new StreamWriter(System.IO.File.Create(destPath)))
{
sw.Write(VBAstrBldr);
}
}
catch (Exception Ex)
{
string msg = Ex.Message.ToString();
tran.Rollback();
throw;
}
}
}
}