我已经查看了几十个现在试图找到解决方案的线程,但我似乎已根据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;
}