2010-05-22 29 views
1

在我的SQL語句中,我使用通配符。但是當我嘗試選擇某些東西時,它從不選擇某種東西。當我在Microsoft SQL Server Management Studio中執行查詢時,它工作正常。 我在做什麼錯?T-SQL LIKE與ASP.net參數中的通配符

Click處理

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; 
    } 
} 

在我的數據訪問層

回答

6

試試這個:

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 + "%"; 
+0

謝謝。這工作。 – Vinzcent 2010-05-22 18:14:20

1

你不能在一個字符串中的查詢參數。代替它:

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

此外,無論何時你有一個前導通配符,你應該看看全文索引。你寫的查詢註定要比它慢得多,因爲當你有一個領先的通配符時你不能使用索引。

+0

感謝您的回答。我改變了你的代碼的子句。但現在我有以下幾點:數據類型varchar和文本在添加運算符中不兼容。 我猜是因爲@title沒有引號。但是當我確實在它周圍加上引號時,它仍然不起作用。 Vincent – Vinzcent 2010-05-22 17:51:24

+0

@Vin啊,你的問題是文本數據類型。文本數據類型專門用於大數據字段,否則會導致sql server的每行限制8192字節的問題。相反,您需要爲該列使用nvarchar字段。 – 2010-05-22 18:19:37

1

從約翰·阿勒斯的答案是正確的。另外,您應該將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"]; 
}