执行带参数的Sql语句
第一种写法:
SqlParameter myparm = new SqlParameter();
myparm.ParameterName = txtparm.Text;
myparm.SqlDbType = SqlDbType.NVarChar;
myparm.Size = 20;
myparm.Value = txtvalue.Text;
string sql = "update myTable set name='nnn' where id=@id";
SqlHelper.ExecuteNonQuery(SqlHelper.conn, CommandType.Text, sql, myparm);第二种写法:
string sql = "update myTable set name='nnn' where id='"+txtvalue.Text+"'";
SqlHelper.ExecuteNonQuery(SqlHelper.conn, CommandType.Text, sql, null);=================
这两种写法结果一样,难道是id=@id 这里是变量,即当txtparm.Text等于xyz,txtvalue.Text等于123的时候,执行下来变为xyz=123???

解决方案 »

  1.   

    呵呵,
      第一种方法比较安全,防止恶意的SQL注入,
    第二种是直接拼接起来的,呵呵,效果差不多
      

  2.   

    第一个是参数化查询@id等于第二个的 txtvalue.text
    myparm.Value = txtvalue.Text; 这句就是给@id赋值了第二个是拼接字符串参数化查询可以防止sql注入!!!
      

  3.   

    第一种方法比较规范和安全,第二种方法容易受SQL注入
      

  4.   

    在安全方面,拼接字符串很容易被攻击
    http://topic.csdn.net/u/20090808/19/6339d889-d8d9-454e-99af-acdbfed4dc49.html
      

  5.   

    @id 是变量 可以用
    SqlParameter[] para = new SqlParameter[]{"@id",要赋的值};
    这种可以放SQL注入
      

  6.   

    都说完了,主要是防止SQL注入!!~
      

  7.   

    用第一种方法,防止sql注入式攻击
    下面是我经常用到的方法
           /// <summary>
           /// 执行增,删,改的方法,支持存储过程
            /// </summary>
           /// <param name="connectionString">连接字符串</param>
           /// <param name="commandType">命令类型,如果是sql语句,则为CommandType.Text,如果是存储过程则为CommandType.StoredProcdure</param>
            /// <param name="cmdText">SQL语句或者存储过程名称</param>
            /// <param name="para">SQL参数,如果没有参数,则为null</param>
            /// <returns>受影响的行数</returns>
            public static int ExecuteNonQuery(CommandType commandType, string cmdText, params SqlParameter[] para)
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandType = commandType;
                    cmd.CommandText = cmdText;
                    if (para != null)
                    {
                        foreach (SqlParameter sp in para)
                        {
                            cmd.Parameters.Add(sp);
                        }
                    }
                    conn.Open();
                    return Convert.ToInt32(cmd.ExecuteNonQuery());
                }
            }