多条件搜索问题 -sql拼接与参数化查询

来源:传智播客  免费开发视频。

问题:根据书名或出版社或作者查询书籍信息。

using System;
using System.Collections.Generic问题;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace _01多条件搜索问题
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //假设表名:Books
            //列名:BookName(书名)、Author(作者)、Pub(出版社)

            //多条件查询,要根据用户输入的内容来动态拼接SQL语句。
            //1.假设如果用户没有输入任何条件,那么就查询出所有的记录
            StringBuilder sbSQL = new StringBuilder("select * from Books ");

            //在wheres集合中保存查询的sql条件
            List<string> wheres = new List<string>();
            //把参数也放到一个集合当中
            List<SqlParameter> listParameters = new List<SqlParameter>();

            //2.如果用户输入了条件,则根据用户输入的条件动态拼接SQL语句
            if (txtBookName.Text.Trim().Length > 0)
            {

                //sbSQL.Append("  BookName like @bkName");
                wheres.Add("  BookName like @bkName");
                listParameters.Add(new SqlParameter("@bkName", SqlDbType.NVarChar, 100) { Value = "%" + txtBookName.Text.Trim() + "%" });
            }

            if (txtAuthor.Text.Trim().Length > 0)
            {
                //sbSQL.Append("  Author like @author");
                wheres.Add("   Author like @author  ");
                listParameters.Add(new SqlParameter("@author", SqlDbType.NVarChar, 100) { Value = "%" + txtAuthor.Text.Trim() + "%" });
            }

            if (txtPub.Text.Trim().Length > 0)
            {
                // sbSQL.Append(" Pub like @pub ");
                wheres.Add("   Pub like @pub ");
                listParameters.Add(new SqlParameter("@pub", SqlDbType.NVarChar, 100) { Value = "%" + txtPub.Text.Trim() + "%" });
            }

            //拼接SQL语句
            //如果wheres集合当中的记录条数大于0,证明用户输入了条件
            if (wheres.Count > 0)
            {
                sbSQL.Append(" where ");//只要有查询条件就拼接一个where
                //然后把后面的查询条件拼接起来。
                sbSQL.Append(string.Join(" and ", wheres));

            }
            SqlParameter[] pms = listParameters.ToArray();
            MessageBox.Show(sbSQL.ToString());
            //SqlHelper.ExecuteReader(sbSQL.ToString(),pms);

            //SqlCommand cmd = new SqlCommand();
            //cmd.Parameters.AddRange(
        }

    }

知识点:

1.sql拼接

2.参数化查询

3以下部分看起来简单,但却很难想到。

      //在wheres集合中保存查询的sql条件
         List<string> wheres = new List<string>();
      //把参数也放到一个集合当中
        List<SqlParameter> listParameters = new List<SqlParameter>();
            if (wheres.Count > 0)
            {
                sbSQL.Append(" where ");//只要有查询条件就拼接一个where
                //然后把后面的查询条件拼接起来。
                sbSQL.Append(string.Join(" and ", wheres));

            }
            SqlParameter[] pms = listParameters.ToArray();
时间: 2024-09-29 23:51:45

多条件搜索问题 -sql拼接与参数化查询的相关文章

防SQL注入的参数化查询

在做机房收费系统的时候,曾经利用过传递参数的形式来将值传递给SQL语句或者存储过程,因为这样可以通过参数化的查询来帮助抵御"SQL 注入"式攻击,这种攻击者会将命令插入SQL语句,从而危机服务器的安全. <span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">SqlParameter

【转】Sql Server参数化查询之where in和like实现之xml和DataTable传参

转载至: http://www.cnblogs.com/lzrabbit/archive/2012/04/29/2475427.html 在上一篇Sql Server参数化查询之where in和like实现详解中介绍了在Sql Server使用参数化查询where in的几种实现方案,遗漏了xml和表值参数,这里做一个补充 文章导读 方案5使用xml参数 方案6 使用表值参数TVP,DataTable传参 6种实现方案总结 方案5 使用xml参数 对sql server xml类型参数不熟悉的

为什么参数化查询可以防止SQL注入?(转)

昨天被某大牛问了一个问题,为什么SQL参数化查询可以防止SQL注入,参数化查询的原理是什么? 结果闷逼了,之前只知道参数化查询是可以防止SQL注入,但是没有深究其原理,今天就找一些文章,学习一下,也分享给大家. 以下引用知乎大神们的回答: 原理是采用了预编译的方法,先将SQL语句中可被客户端控制的参数集进行编译,生成对应的临时变量集,再使用对应的设置方法,为临时变量集里面的元素进行赋值,赋值函数setString(),会对传入的参数进行强制类型检查和安全检查,所以就避免了SQL注入的产生. 最近

参数化查询速度慢的原因及分析

测试环境:sql2005 + .NET2.0 同样的SQL语句,参数化查询和SQL语句直接执行的速度对比.数据库中存放的字段类型是varchar 结论: 1.对参数要设置正确的 DbType(varchar = AnsiString, nvarchar=String,char=AnsiStringFixedLength,nchar=StringFixedLength) 2.尽量使用数据库类型对应的DbType的. 3.尽量给参数的size设置大小 Code: class Program { pr

SQL Server通过条件搜索获取相关的存储过程等对象

在SQL Server中,我们经常遇到一些需求,需要去搜索存储过程(Procedure).函数(Function)等对象是否包含某个对象或涉及某个对象,例如,我需要查找那些存储过程.函数是否调用了链接服务器(LINKED SERVER),我们如果从sys.sql_modules去搜索的话,如果有多个用户数据库,需要切换数据库,执行多次SQL语句.这些都是非常麻烦的事情.本着"模块化定制脚本,减少重复工作量"的原则.写了一个脚本find_prc_from_src_txt.sql, 以后在

参数化查询比拼接字符串慢的原因

我们都知道,参数化查询可以处理SQL注入,以及提高查询的效率,因为参数化查询会使MSSQL缓存查询的计划. 但是现在我发现一个奇怪的问题,就是参数化查询比字符串拼接要慢,而且速度相差10倍之多. SQL语句是: select * from T_Message where T_Message.BelongTo=@BelongTo 开始在ADO.NET中用SqlParameter传递参数@BelongTo时是这么写的 SqlParameter param1 = new SqlParameter("@

全字段多条件搜索(api接口)

近期在做项目时遇到了一个全表全字段多条件搜索的需求,在平时搜索最常见的就是 字段+like +‘% 条件%’这种模式,但遇到多条件多字段时,这种就不适用了. 表字段已知,条件未知,条件数量未知,这种情况我们不可能每多一个条件就加一个and. 解决办法: 先将用户输入的条件存入一个数组中,例如以空格隔开的条件: String[] strArr = SearchText.Split(" "); 进行循环遍历数组中的条件进行sql拼接 for(int i =0;i<strArr.Len

Sql Server参数化查询之where in和like实现详解

来自:http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html#wherein 文章导读 拼SQL实现where in查询 使用CHARINDEX或like实现where in 参数化 使用exec动态执行SQl实现where in 参数化 为每一个参数生成一个参数实现where in 参数化 使用临时表实现where in 参数化 like参数化查询 xml和DataTable传参  身为一名小小的程序猿,在日常开发中不可以

参数化查询为什么能够防止SQL注入

很多人都知道SQL注入,也知道SQL参数化查询可以防止SQL注入,可为什么能防止注入却并不是很多人都知道的. 本文主要讲述的是这个问题,也许你在部分文章中看到过这块内容,当然了看看也无妨. 首先:我们要了解SQL收到一个指令后所做的事情: 具体细节可以查看文章:Sql Server 编译.重编译与执行计划重用原理 在这里,我简单的表示为: 收到指令 -> 编译SQL生成执行计划 ->选择执行计划 ->执行执行计划. 具体可能有点不一样,但大致的步骤如上所示. 接着我们来分析为什么拼接SQ