2010-09-14 43 views
2

我有确定性别的ddl,用户可以不从ddl中选择任何值,所以我试图检查用户是否没有从ddl inser空值或数据库中的任何值中选择任何值这一点,但错误apear(过程或函数 'InsertRegisteration' 需要参数 '@Gender_Id',这是不提供).ANY一个可以帮助我当从ddl没有选定的值时插入空值

(我的代码)

if (DDLGender.SelectedItem.Value[0]!= null) 
    { 
    command.Parameters.Add("@Gender_Id",SqlDbType.Int).Value=null; 
    } 
    else 
    { 
    command.Parameters.Add(Parameter.NewInt("@Gender_Id", DDLGender.SelectedValue)); 
    } 

回答

1

试试这个:

if (DDLGender.SelectedItem.Value[0]!= null) 
{ 
    command.Parameters.Add("@Gender_Id",SqlDbType.Int).Value= DBNull.Value; 
} 
else 
{  
    command.Parameters.Add(Parameter.NewInt("@Gender_Id", DDLGender.SelectedValue)); 
} 

新增nullSystem.DbNull.Value

的区别嘛,null没有任何类型的实例。相反,这是一个无效的参考。

然而,System.DbNull.Value,是的System.DbNull实例(System.DbNull是独立的,并System.DbNull.Value给你的那类的单一实例的引用),表示在数据库中不存在*值的有效参考。

*我们通常会说null,但我不想混淆这个问题。

因此,这两者之间存在很大的概念差异。关键字null代表无效的参考。类System.DbNull表示数据库字段中不存在的值。一般来说,我们应该尽量避免使用相同的东西(在这种情况下为null)来表示两个非常不同的概念(在这种情况下,数据库字段中的值是无效的,而不存在的值)。

请记住,这就是为什么很多人主张一般使用null object pattern,这正是System.DbNull的一个例子。

0

试试这个:

if (DDLGender.SelectedIndex == 0) 
{ 
    command.Parameters.Add("@Gender_Id", DBNull.Value); 
} 
else 
{ 
    command.Parameters.Add("@Gender_Id", (int)DDLGender.SelectedValue); 
} 

你不指定参数的数据类型。

0

假设你正在使用存储过程进行更新, 我认为你可以使存储过程中的更改对此INT列的默认值为NULL,这将使此参数为可选。然后你可以在代码中只执行ELSE部分。

0

可以上面的代码行结合:

cmd.Parameters.Add(new SqlParameter { SqlDbType = SqlDbType.Int, Value = DDLGender.SelectedIndex!=0 ? (int)DDLGender.SelectedValue : null }); 

使用空合并运算符将做无效的检查。如果selectedItem不为null,那么它将作为值传递,否则将传递null。