ADO.NET(四) 参数化sql和简单的 增删改查

 ExecuteScalar()方法通过SELECT语句返回查询结果中的第一行第一列的值,该方法常用于执行返回单个字段的

查询,如count(),max()等。

ExecuteNonQuery()方法执行返回结果集的命令,如insert delete update。这个方法返回一个信息--受影响的

行数,如果不是insert delete update 则返回-1。

为了防止sql注入漏洞我们一般在写sql的时候不会使用字符串拼接。而是参数化的形式

如 select * from dept=:dept 在这里:dept就是要替换的参数。在oracle中用:但是在SQL Server中使用@dept

也可以用数字替代。

这里一个简单的实例演示oracle中的参数化查询,SQL Server中类似

首先还是配置链接字符串,这些就不多做说明,代码有详细的注释

其中得到链接在后台方法有,这个后台上一节有。

 DbTest o_Dt = null;
            OracleCommand o_Comm = null;
            OracleConnection o_Conn = null;
            StringBuilder sb = new StringBuilder();
            try
            {
                o_Dt = new DbTest();
                //得到链接
                o_Conn = o_Dt.GetConn;
                //打开链接
                o_Conn.Open();
                OracleDataReader _reader = null;
                //抓页面抓取数据
                string _deptNo = txtDeptNo.Text.Trim();
                string _deptName = txtDeptNM.Text.Trim();
                //创建Command对象
                o_Comm = new OracleCommand();
                //拼接sql(使用参数化)
                sb.Append(@" select * from dept where 1=1 ");
                if (!string.IsNullOrEmpty(_deptNo))
                {
                    sb.Append(" and deptno=:deptno");
                    o_Comm.Parameters.Add("deptno", OracleDbType.Varchar2);
                    o_Comm.Parameters["deptno"].Value = _deptNo;
                }
                if (!string.IsNullOrEmpty(_deptName))
                {
                    sb.Append(" and dname like :dname");
                    o_Comm.Parameters.Add("dname", OracleDbType.Varchar2);
                    o_Comm.Parameters["dname"].Value = "%" + _deptName + "%";
                } 
                //指定执行的sql语句
                o_Comm.CommandText = sb.ToString();
                //指定链接
                o_Comm.Connection = o_Conn;
                //获得DataReader对象
                _reader = o_Comm.ExecuteReader();
                //绑定数据
                grdDept.DataSource = _reader;
                grdDept.DataBind();
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
            finally
            {
                //关闭资源
                o_Conn.Close();
            }

这个是条件查询的写法,结果如图:



这个是查询,下面简单介绍下新增:

后台代码:

  /// <summary>
        /// 简单新增
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public int DoExecute(string sql) 
        {
            try
            {                                
                o_Conn.Open();
                o_Comm.CommandText = sql;
                o_Comm.Connection = o_Conn;
                i = o_Comm.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                o_Reader = null;
            }
            return i;
        }

        /// <summary>
        /// 简单设定参数
        /// </summary>
        /// <param name="paraName"></param>
        /// <param name="dbType"></param>
        /// <param name="activeValue"></param>
        public void AddParams(string paraName, OracleDbType dbType, string activeValue)
        {
            o_Comm.Parameters.Add(paraName, dbType);
            o_Comm.Parameters[paraName].Value = activeValue;
        }
前台调用的代码:

 //抓取页面数据
            string _no = txtNo.Text.Trim();
            string _name = txtNM.Text.Trim();
            string _loc = txtLoc.Text.Trim();
            DbTest o_Db = new DbTest();
            StringBuilder sb = new StringBuilder();
            sb.Append(@" insert into dept values(:no,:nm,:loc)");
            //调用方法设定参数
            o_Db.AddParams("no", OracleDbType.Varchar2, _no);
            o_Db.AddParams("nm", OracleDbType.Varchar2, _name);
            o_Db.AddParams("loc", OracleDbType.Varchar2, _loc);
            int i = o_Db.DoExecute(sb.ToString());
            if (i > 0) 
            {
                //重新绑定
                Bind(); 
            }
效果如下:


我已经把这个简单Demo上传,下载地址

资源 



展开阅读全文

没有更多推荐了,返回首页