今天在向数据库中插入时,可空值处理很不方便,请大家支支招.下面的字段在数据库中设置都是可空的.
具体问题是这样的:
    cmd.Parameters["@TcpPort"].Value = Convert.ToInt32(txt_TcpPort.Text.ToString());
当txt_TcpPort.Text=""时,就报错:参数化查询 '(@Name varchar(6),@ParentID varchar(1),@IPAddr varchar(8000),@Tc' 需要参数 @TcpPort,但未提供该参数.
若当txt_TcpPort.Text=""时,cmd.Parameters["@TcpPort"].Value=null也出错.这是为什么呀?
我不想给其赋值,却非得赋0才好.
而对下面的这个:        
   if (txt_IPAddr.Text =="")
            {
                cmd.Parameters["@IPAddr"].Value =null;
            }
            else
            {
                cmd.Parameters["@IPAddr"].Value = txt_IPAddr.Text;
            }
同样出错,将上面的null换成""就好了,而直接写成下面的一句话,同样是上面的那种报错.
cmd.Parameters["@IPAddr"].Value = txt_IPAddr.Text;
这又是为什么呢? 大家帮帮忙呀.

解决方案 »

  1.   

    if (txt_IPAddr.Text =="" || txt_IPAddr.Text ==null)这样试试 
      

  2.   

    cmd.Parameters["@TcpPort"].Value = Convert.ToInt32(txt_TcpPort.Text.ToString()); 
    上面不需要@,写在sqlserver的sql语句中时需要@,写在参数里面时不需要。另oracle中是":"。
     cmd.Parameters["@IPAddr"].Value =null
    后面改成DbNull.Value
      

  3.   

    可以用DBNull.Value,插入数据库中后就是null
      

  4.   

    谢谢!用cmd.Parameters["@IPAddr"].Value =null; 是正确的,插入后显示为NULL.
    另外上面也可以不用转换,直接把DataBase中的TcpPort字段改为string类型,这样在插入时就不用去判断了,当txt_TcpPort.Text为空与否,同等处理就可,是个端口号,用int和string是一样的吧?
    当txt_IPAddr.Text =""时,txt_IPAddr.Text =null并不成立,不能等同.并且这时插入数据库中的是显示的是空(没有值),也不是NULL.
    3楼说得可以,但同时要把cmd.Parameters.Add("@ParentID", SqlDbType.VarChar);这里的@也去掉才行,否则会提示:
    “此 SqlParameterCollection 中未包含带有 ParameterName“ParentID”的 SqlParameter。”
    SQL语句中的不能去,去了就有以下提示:
    “在此上下文中不允许使用名称 "ParentID"。有效表达式包括常量、常量表达式和变量(在某些上下文中)。不允许使用列名。”
      

  5.   

    这个肯定插不进去啊,你的@tcpport是字符串吧,你要给它赋值,要加“”,null只能查看单元格中的数据是否为空,is null
      

  6.   

    null 换成 system.DBNull.Value;