Async - DataReader HasRows但reader.Read()不起作用

时间:2018-05-07 19:31:40

标签: c# sql-server asynchronous sqldatareader

我已经查看了几十个现在试图找到解决方案的线程,但我似乎已根据Microsoft文档(https://msdn.microsoft.com/en-us/library/1a674khd(v=vs.110).aspx)并根据我见过的SO线程提供了所有内容。任何见解将不胜感激。

当我运行下面的代码时,我没有从reader.Read()上的DataReader获取数据。 HasRows显示True,但没有数据被读取。当“while(reader.Read())”被击中时,它会跳过以下部分,表明(我相信)读者中没有数据。当我运行一个基本上是“从表名中选择前1 *”的测试查询时,我确实得到了结果,所以我相信我的代码格式正确,可以从读者那里获取数据。

注意,为了简洁起见,我没有显示所有数据... SQL查询是正确的,因为我在执行期间从检查窗口直接复制到带参数的SSMS,并且值正确返回。最后一节中的switch语句被截断以节省空间。 DataHolder类只是一个其他类(如“Type1”)的列表,用于暂存数据以便稍后上传。

MyDecrypt()

SQL查询:

static async Task<DataHolder> DataBuilder(string type)
    {
        var constr = ConfigurationManager.ConnectionStrings["BS-CW"].ConnectionString;
        var start = new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1); 
        var end = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMilliseconds(-1); //getting all the data for the previous month
        var holder = new DataHolder();

        using (SqlConnection con = new SqlConnection(constr))
        using (SqlCommand cmd = new SqlCommand(Query(type), con))
        {
            // Query(type) does produce the correct SQL query, as tested in SSMS
            cmd.CommandTimeout = 1800; //30 min timeout
            cmd.Parameters.AddWithValue("@startdate", start);
            cmd.Parameters.AddWithValue("@enddate", end);

            con.Open();

            IAsyncResult result = cmd.BeginExecuteReader();

            var count = 0;
            var totalCount = 0;
            while (!result.IsCompleted)
            {
                if (count < 60)
                {
                    count++;
                    Console.Write(".");
                    System.Threading.Thread.Sleep(1000);
                }
                else
                {
                    count = 0;
                    totalCount++;
                    Console.WriteLine($"{totalCount} minute(s) waited...");
                }
            }

            using (SqlDataReader reader = cmd.EndExecuteReader(result))
            {
                holder = AddData(type, reader);
            }
        }
        return holder;
    }

static DataHolder AddData(string type, SqlDataReader reader)
    {
        var holder = new DataHolder();

        switch (type)
        {
            case "type1":
                while (reader.Read()) // FAILS HERE == NO DATA IN READER??
                {
                    var data = new Type1()
                    {
                        Date = Convert.ToDateTime(reader["Date"]),
                        DeviceId = Convert.ToInt64(reader["DeviceId"]),
                        Value = Convert.ToInt32(reader["Type1"])
                    };
                    holder.Type1List.Add(data);
                }
                break;
           default:
             break;
        }
    return holder;
}

0 个答案:

没有答案