zoukankan      html  css  js  c++  java
  • 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);
    

      

     
     
  • 相关阅读:
    实现只有0,1,2三种元素的乱序数组的排序
    请说明Request和Session的生命周期
    使用Enumeration和Iterator遍历集合类
    hive中分组取前N个值的实现
    世界知名网站的技术实现(转)
    蚂蚁变大象:浅谈常规网站是如何从小变大的(转)
    Hadoop管理员的十个最佳实践(转)
    internet笔记
    Instagram 架构分析笔记(转)
    Apache Pig入门 –介绍/基本架构/与Hive对比(转)
  • 原文地址:https://www.cnblogs.com/baozi789654/p/14396665.html
Copyright © 2011-2022 走看看