SqlParameters列表中的条件null值

本文关键字:null 条件 列表 SqlParameters | 更新日期: 2023-09-27 18:22:30

我们有一个代码块,它创建一个sqlParameters列表,然后将它们传递给存储过程。一个要求是根据输入文本框是否为空,有条件地使一些值为空。

基本代码:

var SqlParams = new List<SqlParameter> {
    new SqlParameter("@SomeFloat", SqlDbType.FLoat) {Value = f},
    ....
}

我尝试了一些变体,但它不起作用,VS给出了一个错误,即float和null之间没有隐式转换。

new SqlParameter("@SomeFloat", SqlDbType.Float) {Value = (!string.IsNullOrEmpty(tb.Text) ? double.Parse(tb.Text) : DBNull.Value)},

有没有一种方法可以做到这一点——维护参数列表,这样我们就不必重写整个模块了?

感谢

SqlParameters列表中的条件null值

您就快到了,您只需要确保条件运算符知道它的结果。将double.ParseDBNull.Value中的一个转换为object

我还删除了一些括号,并交换了条件,使其更容易删除。

new SqlParameter("@SomeFloat", SqlDbType.Float) 
    {
        Value = string.IsNullOrEmpty(tb.Text) 
            ? DBNull.Value
            : (object)double.Parse(tb.Text)
    }

然而,我通常会做这样的

if (!string.IsNullOrEmpty(tb.Text))
     command.Parameters.AddWithValue("@SomeFloat", double.Parse(tb.Text));

如果文本框为空,则不指定该值,并让存储过程处理这种情况。

我完全建议将每次调用指向一个方法,并让它决定将作为参数传递的值。

这是一个很好的扩展案例:

    public static object TryParseSqlValue(this object input)
    {
        if (null == input)
            return DBNull.Value;
        if (input.GetType() == typeof(string) && input.ToString() == string.Empty)
            return DBNull.Value;
        else
            return input;
    }
myTextBox.Text.TryParseSqlValue();  // returns either the non-empty 
                                    // string or DBNull.Value

您可以针对其他数据类型对其进行修改。。。