1. 程式人生 > >ADO.NET(四) 引數化sql和簡單的 增刪改查

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上傳,下載地址

資源