SqlDataReader rdItems;
SqlCommand itemsCmd = new SqlCommand();
itemsCmd.CommandText = query;
itemsCmd.CommandTimeout = 0;
itemsCmd.Connection = sqlCon;
sqlCon.Open();
rdItems = itemsCmd.ExecuteReader();
if (rdItems.HasRows)
{
while (rdItems.Read())
{
itemType = rdItems["I1"].ToString();
以上是我用于从SqlDataReader
读取数据的代码。问题是rdItems
中存在数据但是当执行rdItems.Read()
行时,阅读器中的行会消失。请让我知道我哪里出错了。
答案 0 :(得分:0)
AFAIK,SqlDataReader
只能在ExecuteReader
之后消费一次,意味着while
循环遍历阅读器,只需在所有行完成阅读时退出。因此,当选中HasRows
后循环移动到下一行时,读取器上的所有先前行都不再可用,除非它们被放入DataTable或列表中。
通过使用DataTable
,您可以检查DataReader内容是否存在,并在存在任何行时迭代它们:
// assume your query like "SELECT DISTINCT I1 FROM NewItems"
// resulting single column with multiple distinct value rows
rdItems = itemsCmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(rdItems); // load DataReader contents to a DataTable, resulting an empty DataTable if no row exists
// check if datatable is not empty as substitute of SqlDataReader.HasRows property
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
// get row data
itemType = row.Field<String>(0);
}
}
欢迎任何建议或改进。
参考:DataReader has rows and data, trying to read from it says "no data is present"