【问题标题】:How to handle multiple rows scenario in SqlDataReader?如何在 SqlDataReader 中处理多行场景?
【发布时间】:2020-04-23 05:22:20
【问题描述】:

我有一个SQL 查询,其中supposed 只返回来自业务数据库的ONE 行。基于此,我写了以下sql script 来从结果集中获取数据。

string query = @"select 
ProdMaster.data_Id Id,
ProdMaster.data_name Name,
ProdMaster.data_countryname CountryName
from RM.Db
order by ProdMaster.data.FromDate desc"

SqlCommand command = new SqlCommand(query, conn);
using (SqlDataReader reader = command.ExecuteReader())
{
 if (reader.Read()) 
   {                            
      countryname = reader["CountryName"].ToString(); 
   }
}

但是,数据库中存在一些数据问题,有时它会返回多行。

我们如何检查count 行?如果行多于一个,我们希望返回一个自定义异常。

注意

  • 我不想在查询中使用 COUNT(*)。
  • 我们无法控制 RM.Db 数据库 - 它可能存在数据问题(第 3 方)

【问题讨论】:

  • 这取决于您在command 中的内容。你能证明吗?
  • 更新了查询
  • 您想知道返回的确切行数,还是只想在行数超过 1 时抛出异常?
  • @IliarTurdushev 是的,如果只有一行,那么我想读取该值。
  • 如果您将if 更改为while,那么您可以跟踪行数。

标签: c# sql database


【解决方案1】:

你不考虑下一个解决问题的方法吗:

SqlCommand command = new SqlCommand(query, conn);
using (SqlDataReader reader = command.ExecuteReader())
{
    if (reader.Read()) 
    {                            
        countryname = reader["CountryName"].ToString(); 
    }

    // Try to read the second row.
    if (reader.Read())
    {
        // If we are inside this if-statement then it means that the query has returned more than one row.
        // Here a custom exception must be thrown.
    }
}

【讨论】:

    【解决方案2】:

    您可以改用SqlDataAdapter 并将表格中的内容填充到数据集中。数据集里面会有一个表格,你可以像这样计算行数 - ds.Tables[0].Rows.Count

    可能存在与 Datareader 相关的问题,因为它是数据流,并且 db 在读取时可能会发生变化。可以在此线程上找到对此进行更彻底的讨论 - How to get number of rows using SqlDataReader in C#

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2012-02-28
      • 2018-07-27
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多