【问题标题】:Wildcards in T-SQL LIKE vs. ASP.net parametersT-SQL LIKE 与 ASP.net 参数中的通配符
【发布时间】:2010-05-22 17:40:45
【问题描述】:

在我的 SQL 语句中,我使用通配符。但是当我尝试选择某些东西时,它永远不会选择某些东西。当我在 Microsoft SQL Server Management Studio 中执行查询时,它工作正常。 我做错了什么?

点击处理程序

protected void btnTitelAuteur_Click(object sender, EventArgs e)
{
    cvalTitelAuteur.Enabled = true;
    cvalTitelAuteur.Validate();

    if (Page.IsValid)
    {
        objdsSelectedBooks.SelectMethod = "getBooksByTitleAuthor";
        objdsSelectedBooks.SelectParameters.Clear();
        objdsSelectedBooks.SelectParameters.Add(new Parameter("title", DbType.String));
        objdsSelectedBooks.SelectParameters.Add(new Parameter("author", DbType.String));
        objdsSelectedBooks.Select();
        gvSelectedBooks.DataBind();

        pnlZoeken.Visible = false;
        pnlKiezen.Visible = true;
    }
}

在我的数据访问层中

public static DataTable getBooksByTitleAuthor(string title, string author)
{

    string sql = "SELECT 'AUTHOR' = tblAuthors.FIRSTNAME + ' ' + tblAuthors.LASTNAME, tblBooks.*, tblGenres.GENRE "
                + "FROM tblAuthors INNER JOIN tblBooks ON tblAuthors.AUTHOR_ID = tblBooks.AUTHOR_ID INNER JOIN tblGenres ON tblBooks.GENRE_ID = tblGenres.GENRE_ID "
                +"WHERE (tblBooks.TITLE LIKE '%@title%');";

    SqlDataAdapter da = new SqlDataAdapter(sql, GetConnectionString());
    da.SelectCommand.Parameters.Add("@title", SqlDbType.Text);
    da.SelectCommand.Parameters["@title"].Value = title;

    DataSet ds = new DataSet();
    da.Fill(ds, "Books");

    return ds.Tables["Books"];
}

【问题讨论】:

    标签: c# asp.net sql sql-server


    【解决方案1】:

    试试这个:

    string sql = "SELECT 'AUTHOR' = tblAuthors.FIRSTNAME + ' ' + tblAuthors.LASTNAME, tblBooks.*, tblGenres.GENRE "
               + "FROM tblAuthors INNER JOIN tblBooks ON tblAuthors.AUTHOR_ID = tblBooks.AUTHOR_ID INNER JOIN tblGenres ON tblBooks.GENRE_ID = tblGenres.GENRE_ID "
               +"WHERE (tblBooks.TITLE LIKE @title);";
    
    SqlDataAdapter da = new SqlDataAdapter(sql, GetConnectionString());
    da.SelectCommand.Parameters.Add("@title", SqlDbType.Text);
    da.SelectCommand.Parameters["@title"].Value = "%" + title + "%";
    

    【讨论】:

      【解决方案2】:

      您不能在字符串文字中包含查询参数。改为这样做:

      WHERE (tblBooks.TITLE LIKE '%' + @title + '%');

      此外,只要您有一个前导通配符,您就应该查看全文索引。您编写的查询注定要慢得多,因为当您有一个前导通配符时,您不能使用索引。

      【讨论】:

      • 感谢您的回答。我将 were 子句更改为您的代码。但现在我有以下几点:数据类型 varchar 和 text 在 add 运算符中不兼容。我猜是因为@title 周围没有引号。但是当我在它周围加上引号时,它仍然不起作用。文森特
      • @Vin 啊,你的问题是文本数据类型。 text 数据类型专门用于大型数据字段,否则会导致 sql server 的每行 8192 字节限制出现问题。您需要为该列使用 nvarchar 字段。
      【解决方案3】:

      John Allers 的回答是正确的。顺便说一句,您应该将 SqlDataAdapter 包装在 using 块中:

      using (SqlDataAdapter da = new SqlDataAdapter(sql, GetConnectionString()))
      {
          da.SelectCommand.Parameters.Add("@title", SqlDbType.Text);
          da.SelectCommand.Parameters["@title"].Value = title;
      
          DataSet ds = new DataSet();
          da.Fill(ds, "Books");
      
          return ds.Tables["Books"];
      }
      

      【讨论】:

        猜你喜欢
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 2013-11-02
        • 2012-02-22
        • 2019-11-26
        相关资源
        最近更新 更多