有没有办法简写下面的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;
}
答案 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;
}
请注意我使用{}
个匿名范围,因此paramValue
和value
变量不会污染本地范围。
如果您发现自己经常这样做,可以将其更改为方法:
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));