在SqlParameters列表中有条件地为空值

时间:2012-02-02 17:37:09

标签: c# asp.net sql

我们有一段代码,用于创建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)},

有没有办法维护参数列表,以便我们不必重写整个模块?

由于

3 个答案:

答案 0 :(得分:4)

你几乎就在那里,你只需要确保条件运算符知道它的结果应该是什么。将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));

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

这是扩展的好例子:

    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

您可以修改其他数据类型...