C#--SqlServer--sql語句拼接和帶參數的SQL語句


以下是學習筆記:

一,常用的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);

  

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM