2013-10-01 25 views
0

我使用dynamicSQL這段代碼。DynamicSQL with ASP.NET參數未設置

問題是,在@ID_USER和@SEARCH停留在SQL查詢原始當我在運行時檢查cmd.CommandText價值,它讀取

"SELECT Comment FROM Comments WHERE UserId = @ID_USER AND Comment like '% @SEARCH %'" 

所以語法是否正確和cmd.Parameters ResultView .SqlValuein VS2012爲我提供了正確的@USER_ID和@SEARCH 的輸入值謝謝。

{ 
     List<string> searchResults = new List<string>(); 

     //Get current user from default membership provider 
     MembershipUser user = Membership.Provider.GetUser(HttpContext.User.Identity.Name, true); 
     if (user != null) 
     { 
      if (!string.IsNullOrEmpty(searchData)) 
      { 
       // SqlCommand cmd = new SqlCommand("Select Comment from Comments where UserId = '" + user.ProviderUserKey + "' and Comment like '%" + searchData + "%'", _dbConnection); 

       /**********************************************/ 
       _dbConnection.Open(); 

       const string QUERY = 
        @"SELECT Comment" + 
        @" FROM Comments" + 
        @" WHERE UserId = @ID_USER" + 
        @" AND Comment like '% @SEARCH %'"; 


       var cmd = new SqlCommand(QUERY, _dbConnection); 


        cmd.Parameters.AddWithValue("@ID_USER", user.ProviderUserKey.ToString()); 
        cmd.Parameters.AddWithValue("@SEARCH", searchData.ToString()); 

        /**********************************************/ 
       SqlDataReader rd = cmd.ExecuteReader(); 


       while (rd.Read()) 
       { 
        searchResults.Add(rd.GetString(0)); 
       } 

       rd.Close(); 
       _dbConnection.Close(); 
      } 
     } 
     return View(searchResults); 
    } 

回答

1

不,參數保留在命令文本中是正確的。

這是因爲什麼是真正傳遞到服務器是一樣的東西下面:

exec sp_executesql N'SELECT Comment FROM Comments WHERE UserId = @ID_USER AND Comment like ''% + @SEARCH %''', 
        N'@ID_USER int,@SEARCH nvarchar(max)', 
        @ID_USER=1, 
        @SEARCH=N'some search text'; 

所以你的參數保持在原位,即使它傳遞給服務器。這就是爲什麼你仍然可以在命令文本中看到它們的原因。

正如預期的放下你的查詢將無法正常工作,在這一行:

AND Comment like '% @SEARCH %' 

您正在尋找在那裏評論實際上包含「@Search」,而不是分配給該參數的值。你需要的是:

AND Comment like '%' + @SEARCH + '%' 

另外,稍不相關的一點是,沒有必要,也不是重用SqlConnections有用。爲每個連接定義一個新的連接。 .NET足夠聰明,可以通過彙集連接來重用連接,但不要重新發明輪子。還可以使用using塊,以確保您的一次性類設置的:

所以我會用你的整個閱讀器塊如下:

string sql = "SELECT Comment FROM Comments WHERE UserID = @ID_USER AND Comment LIKE '%' + @Search + '%'"; 
using (var connection = new SqlConnection(YourConnectionString)) 
using (var command = new SqlCommand(sql, connection)) 
{ 
    command.Parameters.AddWithValue("@ID_USER", user.ProviderUserKey.ToString()); 
    command.Parameters.AddWithValue("@SEARCH", searchData.ToString()); 
    connection.Open(); 

    using (var reader = command.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      searchResults.Add(rd.GetString(0)); 
     } 
    } 
} 
+0

你確定嗎?我在看那個頁面:http://stackoverflow.com/questions/1124723/how-to-add-quotes-to-a-dynamic-sql-command 現在它說名字'ID_USER'不存在在當前的情況下... –

+0

我肯定有點什麼? – GarethD

+0

它現在正在處理您的代碼,非常感謝,非常感謝 –