private static void PrepareCommand(SqlCommand cmd,SqlConnection conn,string cmdText, SqlParameter[] cmdParms) 
{
if (conn.State != ConnectionState.Open)
conn.Open();
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = CommandType.Text;
if (cmdParms != null) 
{
foreach (SqlParameter parameter in cmdParms)
{
if ( ( parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input ) && 
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
cmd.Parameters.Add(parameter);
}
}
}
不明白这段代码中的:
if ( ( parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input ) && 
(parameter.Value == null))
{
parameter.Value = DBNull.Value;
}
是什么意思?加上这个有什么用处?

解决方案 »

  1.   

    如果这个参数是可以输入或可以输入的`而且它为空。。不同于数据库的NULL值。。就赋值为数据库的NULL`
      

  2.   

    干脆翻译出来给你看:
    如果参数是输入输出双向参数
    或者阐述是输入参数并且值为空
    那么就把参数的值设成 DBNull.ValueC# 里面的 null 和 DBNull.Value 的区别主要是
    后者专门用于指数据库里提交空值再说简单点,C# 里面的 null 和 SQL 语句里面的 null 本质上不是一个相同的值
    这里替换一下入库更科学
      

  3.   

    谢谢两位
    不是太明白
    如果不是执行存储过程,也有输入输出吗?
    DBNull.Value提交空值是提交null还是""?
      

  4.   

    有没有输入输出根据你的需要来定啊
    如果你需要多个返回值,可以使用输出参数
    因为默认的返回值只能有一个
    参数就没限制如果需要把 C# 里面的值传入到数据库,就必须要输入参数DBNull.Value 提交的值等同于 SQL 里面的 NULL
    只是和 C# 里面的 null 不同
      

  5.   

    是数据库里的null值
    在C#里打印即不是null也不是""
      

  6.   

    int reRows = 0;
    StringBuilder strSql=new StringBuilder();
    strSql.Append("insert into DMBlue_Blog_Users(");
    strSql.Append("UserId,UserPassWord,Sex,Email,Oicq,DelFlag)");
    strSql.Append(" values (");
    strSql.Append("@UserId,@UserPassWord,@Sex,@Email,@Oicq,@DelFlag)");
    SqlParameter[] parameters = {
    new SqlParameter("@UserId", SqlDbType.VarChar,50),
    new SqlParameter("@UserPassWord", SqlDbType.VarChar,50),
    new SqlParameter("@Sex", SqlDbType.VarChar,2),
    new SqlParameter("@Email", SqlDbType.VarChar,50),
    new SqlParameter("@Oicq", SqlDbType.Int,4),
    new SqlParameter("@DelFlag", SqlDbType.TinyInt,1)};
    parameters[0].Value = _userInfo.UserId;
    parameters[1].Value = _userInfo.UserPassWord;
    parameters[2].Value = _userInfo.Sex;
    parameters[3].Value = _userInfo.Email;
    parameters[4].Value = _userInfo.Oicq;
    parameters[5].Value = _userInfo.DelFlag;
    reRows = new SQLHelper().ExecuteNonQuery(strSql.ToString(),parameters);
    return reRows;上面这个要用下面这个来执行: public int ExecuteNonQuery(string SQLString,params SqlParameter[] cmdParms)
    {
    int rows = 0;
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    using (SqlCommand cmd = new SqlCommand())
    {
    try
    {
    PrepareCommand(cmd, connection, SQLString, cmdParms);
    rows=cmd.ExecuteNonQuery();
    cmd.Parameters.Clear();
    }
    catch(System.Data.SqlClient.SqlException )
    {
    //throw new Exception(E.Message);
    rows = -1;
    }
    catch(Exception )
    {
    //throw new Exception(E.Message);
    rows = -1;
    }
    }
    }
    return rows;
    }那么在什么情况下,我会用到DBNull呢?
    谢谢回答
      

  7.   

    打个比方
    数据库有 A B C 三个字段
    你让用户输入 A B
    那么 C 就为空
    如果 SQL 已经固定必须传入 C
    你在传递到 SQL 时就用 DBNull.Value
    如果 SQL 本身没写死 那么你完全不用管 C 只管 INSERT A, B 即可
    C 会在记录增加时自动被赋 NULL
      

  8.   

    to vengair
    谢谢你在传递到 SQL 时就用 DBNull.Value这个怎么传成DBNull
    我要让@c的值等于DBNull?
      

  9.   

    sqlCommand.Parameters["@c"].Value = DBNull.Value;
    完整的看看 MSDN
    SqlCommand 的例子