我经常在  删除或更新数据时 是直接在CS文件里写完整的SQL语句(称之为方法一),方法二是采用传递参数的方式,
本人对传递参数方式不熟悉,请大家说说这两种方法的利弊。另请完整跟我说说传递参数的完整写法,谢谢!
比如:
要实现更新department表
方法一:
在cs文件里写下以下语句
update department set deppartnameid='"+did+"',departmentname='"+dname+"' ";那么方法二呢?
在数据库那里需要如何写,在CS文件里又应该如何写??

解决方案 »

  1.   

    1.方法一的不好的地方就是很容易被sql注入
    2.方法二的实例如下:  SqlConnection conn = new SqlConnection("Data Source=192.168.101.239;Initial Catalog=simpleDb;User ID=sa;Password=;Min Pool Size=1;Max Pool Size=10000;Asynchronous Processing=True;Load Balance Timeout=60;User Instance=False");
                SqlCommand comm = new SqlCommand();
                comm.Connection = conn;
                comm.CommandType = CommandType.Text;
                comm.CommandText = "update Book set title=@title where ISBN=@isbn";
                conn.Open();
                comm.Parameters.Add(new SqlParameter("@title","ss"));
                comm.Parameters.Add(new SqlParameter("@isbn", "10"));
                Int32 i = comm.ExecuteNonQuery();
                conn.Close();
                comm.Dispose();
      

  2.   

    这是SQLSERVER的写法:            System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection("填写链接字符串");
                System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
                cmd.Connection = con;
                cmd.CommandText = "update table1 set column1 = @value1 where column2 = @value2";
                cmd.Parameters.Add("@value1", SqlDbType.VarChar).Value = "1";
                cmd.Parameters.Add("@value2", SqlDbType.Int).Value = 2;
                cmd.ExecuteNonQuery();
      

  3.   


     public ProUnits AddProUnit(ProUnits pub_proUnit)
            {
                string sql = "Insert into pub_proUnit(proUnitNum,proUnit)  values
                             (@proUnitNum,@proUnit)";
                sql += " ; select @@identity";
                SqlParameter[] para = new SqlParameter[]
    {
                                 new SqlParameter("@proUnitNum",pub_proUnit.ProUnitNum),
                 new SqlParameter("@proUnit",pub_proUnit.ProUnit) 
    };
                int newId = Convert.ToInt32(SqlHelper.GetScalarBySql(sql, para));
                return GetProUnitById(newId);        }
    我一般这样写
      

  4.   

    这是ORACLE的写法:            System.Data.OracleClient.OracleConnection con = new System.Data.OracleClient.OracleConnection("填写链接字符串");
                System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand();
                cmd.Connection = con;
                cmd.CommandText = "update table1 set column1 = :value1 where column2 = :value2";
                cmd.Parameters.Add("value1", System.Data.OracleClient.OracleType.VarChar).Value = "1";
                cmd.Parameters.Add("value2", System.Data.OracleClient.OracleType.Number).Value = 2;
                cmd.ExecuteNonQuery();
      

  5.   


    什么叫 容易被sql注入  啊,不明白,呵呵
      

  6.   

    con记得Open()下,我漏写了。一般都是在using下Open()的,所以无需自己Close()
      

  7.   


    用存储过程的方法好还是用以下这种方式好??
    System.Data.OracleClient.OracleConnection con = new System.Data.OracleClient.OracleConnection("填写链接字符串");
                System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand();
                cmd.Connection = con;
                cmd.CommandText = "update table1 set column1 = :value1 where column2 = :value2";
                cmd.Parameters.Add("value1", System.Data.OracleClient.OracleType.VarChar).Value = "1";
                cmd.Parameters.Add("value2", System.Data.OracleClient.OracleType.Number).Value = 2;
                cmd.ExecuteNonQuery();
      

  8.   

    第一种容易导致sql注入,维护性差,效率不高,不利扩展。
    一般通过传递值到数据库操作类实现数据操作
    可看看petshop
      

  9.   

    你每个方法都用用,自然而然就知道好坏了。存储过程严谨点,不过要给每个存储过程命名也实在麻烦,简单的SQL语句一般就直接写在里面了。而字符串拼接是对于那些无用户输入的场合,方便些,但是如果接收一个文本框作为输入参数,一般用参数法,如果一定要字符串拼接,需要自己写一个方法过滤文本框中的敏感字符,比如"a';update member set password = '' where userid=1;--"。到封号为止的部分可以把前面的SQL语句给完结,之后自己写个重置密码的查询,最后注释掉后面的语句。
      

  10.   

    System.Data.OracleClient.OracleConnection conn = new System.Data.OracleClient.OracleConnection("Data Source=aaa;Persist Security Info=True;User ID=asfa;Password=sdfdshsfs;Unicode=True"); 
      System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = "update xmenu set menuname=:value1,pagename=:value2 where menuid=:value3"; 
    cmd.Parameters.Add("value1", System.Data.OracleClient.OracleType.VarChar).Value = "aaaa"; 
    cmd.Parameters.Add("value2", System.Data.OracleClient.OracleType.VarChar).Value = "bbbb"; 
    cmd.Parameters.Add("value3", System.Data.OracleClient.OracleType.VarChar).Value = "001"; 
    cmd.ExecuteNonQuery; 执行到cmd.ExecuteNonQuery;这句时出错,提示为:  编译器错误消息: CS0201: 只有 assignment、call、increment、decrement 和 new 对象表达式可用作语句 问题出在哪啦??