这是一个根据图书的书名、作者、译者、以及出版商查询图书的相关信息。代码可以运行,但是达不到查询的目的,无论书名、作者、译者、以及出版商的文本框输入任意值或者都为空时,点击查询按钮时都会显示全部的图书信息。找来找去都找不出什么问题来,麻烦大家了~~
存储过程:
alter procedure SearchBook
@Name VarChar(100),
@Author VarChar(30),
@Translator VarChar(30),
@Publisher VarChar(100)
as
select * from Book where  Name like '%'+@Name+'%' or Author like '%'+@Author+'%' or Translator like '%'+@Translator+'%' or Publisher like '%'+@Publisher+'%'
GO
后台代码:
        //获取连接数据库字符串
        string strconn = ConfigurationManager.ConnectionStrings["connectionStr"].ToString();
        //连接数据库
        SqlConnection conn = new SqlConnection(strconn);
        conn.Open();
         SqlCommand cmd = new SqlCommand("SearchBook", conn);
        //设置sql命令变量类型为存储过程
        cmd.CommandType = CommandType.StoredProcedure;
        //清掉公用类中上次的使用的参数
        cmd.Parameters.Clear();
        SqlParameter[] paras = new SqlParameter[]{
                new SqlParameter("@Author",text_author.Text as object),
                new SqlParameter("@Name",text_name.Text as object),
                new SqlParameter ("@Translator",text_translator.Text as object),
                new SqlParameter ("@Publisher",text_publisher.Text as object)
            };
        cmd.Parameters.AddRange(paras);
        SqlDataReader dr = cmd.ExecuteReader();
        DataTable dt = new DataTable();
        dt.Load(dr);
        Repeater1.DataSource = dt;
        Repeater1.DataBind();

解决方案 »

  1.   

    按照这种方法写declare @sql nvarchar(4000)
    set @sql = 'select * from Book  where Name  like'+'''%'+rtrim(@Name)+'%''' 
      

  2.   

    declare @sql nvarchar(4000)
    set @sql = 'select * from Book  where Name  like '+'''%'+rtrim(@Name)+'%''' 
    EXEC (@sql)
      

  3.   

    alter procedure SearchBook
    @Name VarChar(100),
    @Author VarChar(30),
    @Translator VarChar(30),
    @Publisher VarChar(100)
    as
    declare @sql varchar(500)
    set @sql = 'select * from Book where Name like ''%'+@Name+'%'' or Author like ''%'+
    @Author+'%'' or Translator like ''%'+@Translator+'%'' or Publisher like ''%'+@Publisher+'%'''exec(@sql)
    GO
      

  4.   

    你可以试着调试一下存储过程,把生成的SQL语句拷贝下来,在查询分析器里查看,就会检查出写法想法得当 。
      

  5.   

    “无论书名、作者、译者、以及出版商的文本框输入任意值或者都为空时,点击查询按钮时都会显示全部的图书信息”
    ---------------------------
    原因还是挺简单的,因你的SQL语句:
    select * from Book where Name like '%'+@Name+'%' or Author like '%'+@Author+'%' or Translator like '%'+@Translator+'%' or Publisher like '%'+@Publisher+'%'当有值为空时(如:@Name),结果会是:
    select * from Book where Name like '%%' or Author like '%'+@Author+'%' or Translator like '%'+@Translator+'%' or Publisher like '%'+@Publisher+'%'“Name like '%%'”是永远都为True的,这样就返回所有的记录了。---------------------------
    如果当条件为空时,不想返回所有记录,可以这样做:
    DECLARE @sql NVARCHAR(1000)
    SET @sql = 'select * from Book WHERE 1=1 '
    IF( LEN(@Name) > 0 ) SET @sql = sql + ' AND Name LIKE ''%'+ @name +'%'''
    --其它参数类似
    exec( @sql )
      

  6.   

    我搞错了
    应该是
    alter procedure SearchBook
    @Name VarChar(100),
    @Author VarChar(30),
    @Translator VarChar(30),
    @Publisher VarChar(100)
    as
    select * from Book where Name like '%'+@Name+'%' and  Author like '%'+@Author+'%'
     and Translator like '%'+@Translator+'%' and Publisher like '%'+@Publisher+'%'
    GO你把 or  都改成 and 应该就可以了