C# Sqldatareader可选参数

C# Sqldatareader可选参数,c#,asp.net,ado.net,dapper,sqldatareader,C#,Asp.net,Ado.net,Dapper,Sqldatareader,我有一个从存储过程中获取结果的数据读取器。取决于某些值的存储过程,例如(“ismarried”=true)返回10个coulmns,但如果(“ismarried”=false),则只返回5列 在我的asp.net页面中,我的datareader需要10列,不管是什么,并且想知道在我的asp.net c#代码中是否有一种方法可以包含可选参数。我知道你可以用 SQL中的ISNULL(“Column”和“”),但我不希望这样做,而是希望有一种方法可以告诉我的datareader这5个参数可能并不总是存

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

在我的asp.net页面中,我的datareader需要10列,不管是什么,并且想知道在我的asp.net c#代码中是否有一种方法可以包含可选参数。我知道你可以用 SQL中的ISNULL(“Column”和“”),但我不希望这样做,而是希望有一种方法可以告诉我的datareader这5个参数可能并不总是存在


谢谢

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

我要做的是动态创建查询。我使用字符串生成器连接查询,如果值到达时为null或为空,则在代码中不添加参数,也不添加条件。

与其检查返回的列,然后根据字段计数等进行映射,不如创建一个类,让我们假设像这样的人

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsMarried { get; set; }
    //etc...
}
然后,您可以使用返回您的结果

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

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

如果它需要10列,那么你必须给它10列。“我知道1+1=2,但我希望它等于3!”内森显然你没有能力跳出你的框框思考。根据其他回答,似乎有可能。