文本字段的简写c#if语句为空

时间:2017-01-13 19:48:22

标签: c# if-statement

有没有办法简写下面的if / else语句?

if (txtInvoiceDate.Text != "")
{
    query.Parameters.AddWithValue("@InvoiceDate", SqlDbType.SmallDateTime).Value = DateTime.Parse(txtInvoiceDate.Text.ToString());
}
else
{
    query.Parameters.AddWithValue("@InvoiceDate", SqlDbType.SmallDateTime).Value = DBNull.Value;
}

5 个答案:

答案 0 :(得分:3)

        query.Parameters.AddWithValue("@InvoiceDate", SqlDbType.SmallDateTime).Value =
            string.IsNullOrWhiteSpace(txtInvoiceDate.Text)
                ? (DateTime?)DBNull.Value
                : DateTime.Parse(txtInvoiceDate.Text);

答案 1 :(得分:2)

  • 您不必要地致电String.ToString()
  • 您的代码不会处理非空但无效的输入。

我的版本:

{
    Object paramValue = DBNull.Value;
    DateTime value;
    if( DateTime.TryParse( txtInvoiceDate.Text, out value ) ) {
        paramValue = value;
    }
    query.Parameters.AddWithValue("@InvoiceDate", SqlDbType.SmallDateTime).Value = paramValue;
}

请注意我使用{}个匿名范围,因此paramValuevalue变量不会污染本地范围。

如果您发现自己经常这样做,可以将其更改为方法:

static SqlParameter AddDateParameter(SqlCommand cmd, String parameterName, String inputValue) {
    SqlParameter p = cmd.CreateParameter();
    p.Name = parameterName;
    p.SqlDbType = SqlDbType.SmallDateTime;
    cmd.Parameters.Add( p );

    DateTime value;
    if( DateTime.TryParse( inputValue, out value ) ) {
        p.Value = value;
    }
    else {
        p.Value = DBNull.Value;
    }
    return p; // return `p` in case the caller wants to modify the parameter further
}

像这样使用:

AddDataParameter( query, "@InvoiceDate", txtInvoiceDate.Text );

顺便说一句,将txtInvoiceDate(我假设是TextBox)替换为DateTimePicker控件可能是一个想法,这可能会直接阻止无效输入并暴露出来直接使用强类型DateTime值,无需使用DateTime.TryParse

答案 2 :(得分:1)

query.Parameters.AddWithValue("@InvoiceDate", SqlDbType.SmallDateTime).Value = 
    (!string.IsNullOrEmpty(txtInvoceDate.Text) ? 
      DateTime.Parse(txtInvoiceDate.Text) : 
      DBNull.Value);

答案 3 :(得分:0)

我会为此创建一个简单的扩展名。

public delegate bool TryParseHandler<T>(string value, out T result);

public static T? DbNullOrValue<T>(this string input, TryParseHandler<T> handler) where T : struct, IConvertible
{
    T res;
    if (!string.IsNullOrEmpty(input))
        if(handler(input, out res))
            return res;

    return null;
}
然后可以在任何地方调用

,如:

"12/13/15".DbNullOrValue<DateTime>(DateTime.TryParse)

编辑:从Generic TryParse开始我更新上面的代码,以检查它是否可以在实际转换之前进行转换,非常有趣的技术。

答案 4 :(得分:0)

感谢所有答案的人。当我尝试使用时:

query.Parameters.AddWithValue("@InvoiceDate", SqlDbType.SmallDateTime).Value =
        string.IsNullOrWhiteSpace(txtInvoiceDate.Text)
            ? DBNull.Value
            : DateTime.Parse(txtInvoiceDate.Text);

我收到的错误是

  

由于存在,因此无法确定条件表达式的类型   System.DBNull&#39;之间没有隐式转换。和&#39; System.DateTime&#39;

为了解决这个问题,我不得不使用:

query.Parameters.AddWithValue("@InvoiceDate", SqlDbType.SmallDateTime).Value = (string.IsNullOrEmpty(txtInvoiceDate.Text) ? (DateTime?)null : DateTime.Parse(txtInvoiceDate.Text));