2012-08-03 107 views
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 + '%' 

谢谢!

回答

1

您需要将SqlCommand'CommandType'设置为'CommandType.StoredProcedure'。

cmd.CommandType = CommandType.StoredProcedure; 

我还建议使用“sp_”以外的前缀。这就是微软用于他们的系统程序,你可能会意外覆盖你想要保留的一个。 :)

我这是怎么生成的参数:

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)); 
+0

很高兴知道SP_我是如何受教的。我只是在我调用存储过程之前添加您提供的代码?另外,它似乎并不喜欢cmd.executeReader()行 – user1512593 2012-08-03 23:01:43

+1

是的,把它放在你指定'CommandText'的位置,如果你给我错误从cmd.ExecuteReader我可以帮忙。它看起来像你两次添加你的'@SearchText'参数。 – jtimperley 2012-08-03 23:10:50

+0

你是对的! “ ”过程或函数SP_AUTOCOMPLETE指定的参数太多。“ – user1512593 2012-08-03 23:12:12