ADO.NET(四) 引數化sql和簡單的 增刪改查
阿新 • • 發佈:2019-01-29
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上傳,下載地址