0

この動的SQLコードを使用します。

問題は、実行時に cmd.CommandText 値をチェックすると、@ID_USER と @SEARCH が SQL クエリで未加工のままになることです。

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

そのため、構文は正しく、VS2012 の cmd.Parameters ResultView .SqlValue は、@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);
    }
4

1 に答える 1

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));
        }
    }
}
于 2013-10-01T15:16:51.657 に答える