.load(SqlDataReader) 后数据表为空

Posted

技术标签:

【中文标题】.load(SqlDataReader) 后数据表为空【英文标题】:DataTable empty after .load(SqlDataReader) 【发布时间】:2015-09-25 15:10:58 【问题描述】:

我运行DataTable.load(SqlDataReader)后,DataTable似乎是空的,但是DataReader包含结果(调试时可以看到)。

有人可以帮我解决这个问题吗?我似乎找不到这个问题的任何解决方案,我也找不到我的算法中的错误.. 我找到了一些使用 DataAdapter & Fill() 的解决方案,但我只是对这个“问题”感到好奇。 我的代码:

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()')。

从我的错误中吸取教训..

【问题讨论】:

你试过using(var daSelectDeviceProperties = new SqlDataAdapter(query, connectionDBTest)) daSelectDeviceProperties.Fill(DeviceProperties);instead 吗? ` 感谢您的回答,但您能否详细说明一下将上述代码放在哪里?第二点,我有点想知道为什么 DataTable DeviceProperties 是空的,即使我在包含结果的 SqlReader 上使用了负载.. 【参考方案1】:

不确定是什么导致了这个问题,但我会使用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..");

【讨论】:

感谢您的回复。我想我发现了“问题”是什么。调试时,数据表预览看起来是空的(显示了“ ”),但数据表仍然被数据读取器的结果填充。我的程序的其余部分没有做任何事情的原因是因为我在索引表时犯了一个错误(快乐快乐快乐快乐!)。但是非常感谢你们俩,很抱歉浪费了你们时间.. @user5110371:您可以在调试器中点击放大镜查看 D​​ataTable 数据。 好吧..这也解决了..好吧,这只是你觉得自己很愚蠢的日子之一.. :) 再次感谢您的回复。

以上是关于.load(SqlDataReader) 后数据表为空的主要内容,如果未能解决你的问题,请参考以下文章

从 SqlDataReader 读取数据

您可以从 SqlDataReader 获取列名吗?

单元测试 - 存根 SqlDataReader

关于SqlDataReader使用的一点疑惑

SqlDataReader

SqlDataReader