Ado.Net SQL语句参数化(SqlParameter用法)(多条件模糊查询的实现)

使用SqlParameter将查询条件参数化可以达到以下效果:

  1. 避免SQL注入,提高代码而安全性。
  2. 利用SqlParameter的重载方法、参数数组等可以提高代码的重用率
  3. 可以实现SQl语句参数的动态添加

插入内容:

using的使用,在Ado.Net程序中,用using的方式打开数据库时,当不用数据库连接可以自动关闭释放资源。有利于资源的回收利用

 

 

SQL语句参数化的三种方式:

1.直接参数化(以win32程序为例)

using System.Data.SqlClient;

namespace EasySqlParameter
{
    class Program
    {
        static void Main(string[] args)
        {
            string conText = "server=.;uid=sa;pwd=123456;database=ars";
            using (SqlConnection con = new SqlConnection(conText))
            {
                con.Close();//打开数据库连接
                string sqlText = "select sName from student where sId=@sid";//sql语句带多个参数
                using (SqlCommand cmd = new SqlCommand(sqlText, con))
                {
                    SqlParameter parameter = new SqlParameter("@sid", 20160001);
                    cmd.Parameters.Add(parameter);//将参数添加到SQL执行命令
                    cmd.ExecuteNonQuery();//返回受影响的行数
                }
            }
        }
    }
}

 

2.参数数组参数化(以win32程序为例)

using System.Data.SqlClient;

namespace SQLParameters
{
    class Program
    {
        static void Main(string[] args)
        {
            string conText = "server=.;uid=sa;pwd=123456;database=ars";
            using (SqlConnection con = new SqlConnection(conText))
            {
                using (SqlCommand cmd = con.CreateCommand())
                {
                    con.Open();
                    cmd.CommandText= "select sName from student where sId = @sid and sMajor = @sMajor and sPassword = @sPassword";
                    //构造参数数组parameters
                    SqlParameter[] parameters = {new SqlParameter("@sid",20160001),
                                                new SqlParameter("@smajor",1101),
                                                new SqlParameter("@spassword",123456) };
                    cmd.Parameters.AddRange(parameters);
                    cmd.ExecuteNonQuery();
                }
            }
        }
    }
}

 

3.参数集合参数化(适合多条件查询或者模糊查询使用),以两个条件的winform多条件模糊查询为例:

(1)查询界面构建如下:

(2)搜索按钮中的代码如下:

        private void btnSearch_Click(object sender, EventArgs e)
        {
            //************查询条件集合的获取***************//
            List<SqlParameter> parameters = new List<SqlParameter>();//构建参数数组
            List<string> wherelist = new List<string>();//构建查询条件字符串数组
            if (!string.IsNullOrEmpty(this.txtsId.Text.Trim()))//判断输入条件是否为空,否则添加查询的参数和条件
            {
                wherelist.Add("sId like @sId");
                SqlParameter parameter = new SqlParameter();
                parameter.ParameterName = "@sId";
                parameter.Value = "%" + textsId.Text.ToString() + "%";
                parameters.Add(parameter);
            }
            if (!string.IsNullOrEmpty(this.txtsName.Text.Trim()))
            {
                wherelist.Add("sName like @sName");
                SqlParameter parameter = new SqlParameter();
                parameter.ParameterName = "@sName";
                parameter.Value = "%" + textsName.Text.ToString() + "%";
                parameters.Add(parameter);
            }


            //************将查询条件集合转换为数组***************//
            SqlParameter[] sqlParameters = parameters.ToArray();


            //************查询所需SQL语句的拼接***************//
            string sqlText = "select sId, sName, sPassword, sMajor from student";//没有拼接的SQL语句,没有查询条件
            if (wherelist.Count > 0)//查询条件字符串的拼接
            {
                sqlText += " where " + string.Join(" and ", wherelist);
            }

            //************按条件查询数据***************//
            string conText = "server=.;uid=sa;pwd=123456;database=ars";
            using (SqlDataAdapter adapter = new SqlDataAdapter(sqlText, conText))
            {
                DataTable dt = new DataTable();//接收查询数据
                adapter.SelectCommand.Parameters.AddRange(sqlParameters);//将参数值赋给查询条件
                adapter.Fill(dt);
                this.dataGridView1.DataSource = dt;
            }
        }

 

(3)模糊查询结果

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值