0

現在、jQueryオートコンプリートプラグインのクエリ文字列がありますが、代わりにストアドプロシージャを使用する必要があります。誰かが私が変換するのを手伝ってもらえますか?やってみると動かないようです。

オリジナルASHX

public class Search_CS : IHttpHandler {

public void ProcessRequest (HttpContext context) {
    string prefixText = context.Request.QueryString["q"];
    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = ConfigurationManager
                .ConnectionStrings["Rollup2ConnectionString"].ConnectionString;
        using (SqlCommand cmd = new SqlCommand())
        {
            //cmd.CommandText = "select NUID from T_USER where " +
            //"NUID like @SearchText + '%'";
            cmd.CommandText = "select rtrim(NUID) NUID, rtrim(FNAME) FNAME, rtrim(LNAME) LNAME from T_USER where NUID like @SearchText + '%' OR FNAME like @SearchText + '%' OR LNAME like @SearchText + '%'"; 
            cmd.Parameters.AddWithValue("@SearchText", prefixText);
            cmd.Connection = conn;
            StringBuilder sb = new StringBuilder(); 
            conn.Open();
            using (SqlDataReader sdr = cmd.ExecuteReader())
            {
                while (sdr.Read())
                {
                    sb.Append(sdr["NUID"].ToString() + " ").Append(sdr["FNAME"].ToString() + " ").Append(sdr["LNAME"].ToString() + " ")
                        .Append(Environment.NewLine); 
                }
            }
            conn.Close();
            context.Response.Write(sb.ToString()); 
        }
    }
}

ストアドプロシージャ用の新しいASHX:

public class Search_CS : IHttpHandler {

public void ProcessRequest (HttpContext context) {
    string prefixText = context.Request.QueryString["q"];
    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = ConfigurationManager
                .ConnectionStrings["Rollup2ConnectionString"].ConnectionString;
        using (SqlCommand cmd = new SqlCommand())
        {
            //cmd.CommandText = "select NUID from T_USER where " +
            //"NUID like @SearchText + '%'";
            cmd.CommandText = "SP_AUTOCOMPLETE"; 
            cmd.Parameters.AddWithValue("@SearchText", prefixText);

            cmd.Parameters.Add(new SqlParameter("@SearchText", SqlDbType.VarChar));
            cmd.Parameters["@SearchText"].Value = prefixText;


            cmd.Connection = conn;
            StringBuilder sb = new StringBuilder(); 
            conn.Open();
            using (SqlDataReader sdr = cmd.ExecuteReader())
            {
                while (sdr.Read())
                {
                    sb.Append(sdr["NUID"].ToString() + " ").Append(sdr["FNAME"].ToString() + " ").Append(sdr["LNAME"].ToString() + " ")
                        .Append(Environment.NewLine); 
                }
            }
            conn.Close();
            context.Response.Write(sb.ToString()); 
        }
    }
}

ストアドプロシージャ:

@SearchText VARCHAR(255)
AS
BEGIN

    SET NOCOUNT ON;
    SELECT RTRIM(NUID) NUID, RTRIM(FNAME) FNAME, RTRIM(LNAME) LNAME 
    FROM T_USER 
    WHERE NUID like @SearchText + '%' OR FNAME like @SearchText + '%' OR LNAME like @SearchText + '%'

ありがとう!

4

1 に答える 1

1

SqlCommand'CommandType'を'CommandType.StoredProcedure'に設定する必要があります。

cmd.CommandType = CommandType.StoredProcedure;

'sp_'以外のプレフィックスを使用することもお勧めします。これは、Microsoftがシステム手順に使用したものであり、保持したい手順を誤って上書きしてしまう可能性があります。:)

これが私がパラメータを生成する方法です:

public static SqlParameter GetParameter(string parameterName, object value, SqlDbType type, int size)
{
    if (value == null)
    {
        value = DBNull.Value;
    }

    if (size <= 0 && type == SqlDbType.VarChar)
    {
        switch (type)
        {
            case SqlDbType.VarChar:
                size = 8000;
                break;
            case SqlDbType.NVarChar:
                size = 4000;
                break;
        }
    }

    SqlParameter parameter = new SqlParameter(parameterName, type, size);
    parameter.Value = value;
    parameter.IsNullable = true;

    return parameter;
}

そして、私はこれをします。

cmd.Parameters.Add(GetParameter("@SearchText", searchText, SqlDbType.VarChar));
于 2012-08-03T22:52:47.460 に答える