以下是學習筆記:
一,常用的sql語句寫法
1,直接寫入的
對於非值類型,兩邊各加一個單引號(')
【例1】
int Id =1;
string Name="lui";
cmd.CommandText="insert into TUserLogin values("+Id+",'"+Name+"')";
因為Id是數值,所以在傳遞的時候只需要在sql字符串中用"+Id+"即可實現,而 Name是字符串,所以在傳遞的時候還需要在"+Name+"兩邊各加一個單引號(')來實現;
2,占位符的字符串拼接
【例2】
//定義SQL語句 string sql = "insert into Students (StudentName,Gender,DateOfBirth,StudentIdNo,Age,PhoneNumber,StudentAddress,ClassId)"; sql += "values( '{0}', '{1}', '{2}','{3}', '{4}','{5}','{6}','{7}')"; sql = string.Format(sql, "包子", "男", "1989-07-11", "123456789012345678", 20, "18668488888", "杭州", 1); //調用通用數據訪問類 int result = SQLHelper.ExecuteNonQuery(sql,null); Console.WriteLine(result);
以上,在實際開發中,直接寫字符串或使用占位符的方式,會有潛在的危險。(注入式攻擊)
以下解決問題:
二,通過帶參數的SQL語句和存儲過程實現(推薦)
【例1】轉載:https://blog.csdn.net/ymtianyu/article/details/8818192
//定義數據庫連接 string strconn = "Data Source=xxx;user id=sa;pwd=;initial catalog=gltest"; SqlConnection Conn = new SqlConnection(strconn); //開啟數據庫 Conn.Open(); //定義操作語句,其中@即為所引用的參數 string sql = "insert into users(name,pwd) values (@name,@pwd)"; //定義參數及相關屬性和要傳入的值 SqlCommand cmd = new SqlCommand(sql, Conn); cmd.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50)); cmd.Parameters.Add(new SqlParameter("@pwd", SqlDbType.NVarChar, 50)); cmd.Parameters["@name"].Value = this.TextBox1.Text; cmd.Parameters["@pwd"].Value = this.TextBox2.Text; //執行sql語句 cmd.ExecuteNonQuery(); //關閉數據庫 Conn.Close();
SqlCommand.Parameters.Add()添加參數到參數集
- 第一個參數是要添加的參數名
- 第二個參數是參數的數據類型
- 第三個是數據長度
Parameters的作用就是把存儲過程執行結束后得到的參數傳到程序里
【例2】
定義SQL語句
string sql = "insert into Products (ProductId,ProductName,UnitPrice,Unit,Discount,categoryId)"; sql += "values(@ProductId,@ProductName,@UnitPrice,@Unit,@Discount,@categoryId)"; //封裝參數 //SqlParameter param1 = new SqlParameter("@ProductId", "1000900002"); //SqlParameter param2 = new SqlParameter("@ProductName", "汽水"); ////。。。。 //SqlParameter[] param = new SqlParameter[] { param1, param2 }; //以上太麻煩,我們可以直接定義參數數組 SqlParameter[] param = new SqlParameter[] { new SqlParameter("@ProductId", "1000900007"), new SqlParameter("@ProductName", "汽水"), new SqlParameter("@UnitPrice", 5), new SqlParameter("@Unit", "箱"), //new SqlParameter("@Discount",0),//參數為0報錯 // new SqlParameter("@Discount","0"), //特別注意這個地方沒有加雙引號的,會出現參數找不到的問題。 //new SqlParameter("@Discount","1"),// 加雙引號的"1"是可以執行的 new SqlParameter("@Discount",(object)0), // 當這個地方是0的時候,要使用objet轉化成引用類型(官方解釋) new SqlParameter("@categoryId", 3), }; //調用通用數據訪問類 int result = SQLHelper.ExecuteNonQuery(sql, param); Console.WriteLine(result);
Helper類:
public static int ExecuteNonQuery(string sql, SqlParameter[] param = null) { //創建鏈接對象 SqlConnection conn = new SqlConnection(connString); //創建一個命令執行對象 SqlCommand cmd = new SqlCommand(sql, conn); //建議直接用構造方法 try { conn.Open(); //添加參數 if (param != null) { cmd.Parameters.AddRange(param); } return cmd.ExecuteNonQuery(); } catch (Exception ex) { //如果有必要可以在這個的記錄日志.... //注意:我們通用的數據訪問類是“底層”地方方法,我們捕獲到異常,必須還得告訴調用者具體的異常。 string errorMsge = "調用ExecuteNonQuery方法發生異常,具體異常信息:" + ex.Message; // throw ex; //可以直接把ex對象跑出去,也可以做二次封裝 throw new Exception(errorMsge); } finally //表示前面不管是否發生異常,都會執行的代碼段 { conn.Close(); } }
三,SqlParameter的兩個方法
1,Add方法
SqlParameter sp = new SqlParameter("@name","Pudding"); cmd.Parameters.Add(sp); sp = new SqlParameter("@ID","1"); cmd.Parameters.Add(sp);
2,AddRange方法
SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@name","Pudding"),new SqlParameter("@ID","1") }; cmd.Parameters.AddRange(paras);