【问题标题】:Sqldatareader optional parameterSqldatareader 可选参数
【发布时间】:2023-12-24 12:50:01
【问题描述】:

我有一个数据读取器,它正在从我的存储过程中获取结果。存储过程取决于某些值,例如 ("ismarried" = true) 返回 10 列,但如果 ("ismarried" = false) 它只返回 5 列。

在我的 asp.net 页面中,我的 datareader 无论如何都需要 10 列,并且想知道我的 asp.net c# 代码中是否有一种方法可以使用可选参数。我知道你可以使用 SQL 中的 ISNULL("Column", '') 但我没有这样做,而是希望有一种方法可以告诉我的数据读取器这 5 个参数可能并不总是存在。

谢谢

【问题讨论】:

  • 如果它需要 10 列,那么你必须给它 10 列。 “我知道 1+1=2,但我希望它 =3!”
  • Nathan 显然你无法跳出你的框框思考,根据其他回答看起来有可能。

标签: c# asp.net ado.net dapper sqldatareader


【解决方案1】:

您可以使用FieldCount 属性来判断存储过程返回了多少列。如果它返回 5 或 10,您的代码可以做出相应的反应。

【讨论】:

    【解决方案2】:

    我所做的是动态创建查询。我使用字符串生成器来连接查询,如果一个值以 null 或空的形式到达,那么在代码中没有添加参数并且在 where 也没有添加条件。

    【讨论】:

      【解决方案3】:

      与其检查返回的列,然后根据字段计数等进行映射,更简洁的解决方案是创建一个类,比如说 Person 这样...

      public class Person
      {
          public int Id { get; set; }
          public string Name { get; set; }
          public bool IsMarried { get; set; }
          //etc...
      }
      

      然后,您可以使用dapper 来返回您的结果...

      var people = cnn.Query<Person>("spName", 
                           commandType: CommandType.StoredProcedure).ToList();
      

      dapper 会将字段映射到您的类属性,并忽略任何丢失的字段。请注意,属性名称需要与数据库中的字段名称相匹配。这将减少任何逻辑检查,并且必须手动将每个属性映射到返回的字段。

      【讨论】: