我们有一段代码,用于创建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)},
有没有办法维护参数列表,以便我们不必重写整个模块?
由于
答案 0 :(得分:4)
你几乎就在那里,你只需要确保条件运算符知道它的结果应该是什么。将double.Parse
或DBNull.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
您可以修改其他数据类型...