运行DataTable.load(SqlDataReader)后,DataTable似乎为空,但DataReader包含结果(可在调试时看到)。
有人可以帮我这个吗?我似乎找不到任何解决这个问题的方法,也不能在算法中找到错误。 我找到了使用DataAdapter& amp;的一些解决方案。填充(),但我只是对这个'问题'感到好奇。 我的代码:
DataTable DeviceProperties = new DataTable();
try
{
string query = "SELECT PropertyID, PropertyName from DeviceProperties WHERE DeviceID = @DeviceID;";
using (SqlCommand cmdSelectDeviceProperties = new SqlCommand(query, connectionDBTest))
{
cmdSelectDeviceProperties.Parameters.Add("@DeviceID", SqlDbType.BigInt).Value = deviceID;
using (SqlDataReader rdrSelectDeviceProperties = cmdSelectDeviceProperties.ExecuteReader())
{
if (rdrSelectDeviceProperties.HasRows)
DeviceProperties.Load(rdrSelectDeviceProperties);
else
Console.WriteLine("No Device Properties found..");
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error getDeviceProperties: " + ex);
}
return DeviceProperties;
仅供参考:rdrSelectDeviceProperties.HasRows每次都会传递,因此读者肯定会包含一些值。在调试期间,可以在rdrSelectDeviceProperties中找到正确的结果。但是DeviceProperties数据表仍为空。
确切问题:调试时数据表显示为空,因为悬停在上方显示:'{}'。 其余代码(取决于数据表)在数据表为空时进行响应。 解决方案:当您按下放大镜并获得数据表中数据的表示时。 我的错误在于其余代码(将数据表中的数据与字符串进行比较,而不使用'.ToString()')。
从我的错误中学习......
答案 0 :(得分:0)
不确定导致此问题的是什么,但我会使用SqlDataAdapter.Fill(dataTable)
代替DataTable.Load(sqlDatareader)
:
DataTable tblSelectDeviceProperties = new DataTable();
using (var daSelectDeviceProperties = new SqlDataAdapter(query, connectionDBTest))
{
// no need to open/close the connection with DataAdapter.Fill
daSelectDeviceProperties.Fill(tblSelectDeviceProperties);
}
if (tblSelectDeviceProperties.Rows.Count == 0)
Console.WriteLine("No Device Properties found..");