在我运行DataTable.load(SqlDataReader)之后,DataTable似乎是空的,但DataReader包含结果(可以在调试时看到)。
谁能帮我解决这个问题?我似乎找不到任何解决这个问题的方法,也找不到我的算法中的错误。我找到了一些使用DataAdapter的解决方案;填充(),但我只是好奇这个"问题"。我的代码: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()')。
从我的错误中吸取教训
不确定是什么原因导致这个问题,但我会使用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..");