jquery - 自动完成jquery和SQL,ASP.NET

标签 jquery asp.net sql vb.net

我正在尝试使用 jquery 创建一个自动完成文本框,它将绑定(bind)到 SQL 数据库。我还想在页面上放置一个下拉列表,以便根据初始选择自动完成文本框将从不同的表中检索数据。这是一个 ASP.NET 2.0 页面,背后的代码是 VB.NET。我有 AJAX 自动完成功能,但它只匹配第一个字符,而且不像 jquery 那样强大。谁能分享一个示例代码,该代码将从 SQL 检索搜索数据,并指导我如何使表名动态化?

非常感谢任何帮助

集市

最佳答案

您可以编写一个处理程序 (.ashx) 以从数据库返回文本搜索和表名称的查询结果。对于表名,请查看 SQL Server 中的 INFORMATION_SCHEMA.TABLES...

看看这个 .NET AJAX Calls to ASMX or ASPX or ASHX?对于使用 ScriptService 的稍微现代的方法 - 基本思想是相同的。

如果需要的话,我明天会发布代码(v.late),

第一个。

编辑:

最简单的(您会意识到做一些更复杂的事情所涉及的问题)让我们假设您有三个表:用户部门>产品

表:用户
ID整数
名字 varchar(50)
姓氏 varchar(50)
出生日期日期时间

表:部门
整数ID
名称 varchar

表:产品
整数ID
名称 varchar

并且您需要 3 个存储过程来通过名称的一部分进行选择:

产品和部门的存储过程的形式相同:

CREATE PROCEDURE dbo.ProductSelect (dbo.DepartmentSelect)
    @qry VARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT *
FROM dbo.Product  (dbo.Department)
WHERE [Name] LIKE '%' + @qry + '%'
END

对于用户来说略有不同:

CREATE PROCEDURE [dbo].[UserSelect]
    @qryTerm VARCHAR(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

SELECT U.Id, U.Forename + ' ' + U.Surname AS [Name], U.DateOfBirth
FROM 
    dbo.[User] U
WHERE
    (
        forename LIKE '%' + @qryTerm + '%'
        OR
        surname LIKE '%' + @qryTerm + '%'
    )
ORDER BY 
    surname, Forename
END

基本页面/控件标记:

<div>
    Tables:
    <asp:DropDownList runat="server" ID="ddlTables" />

</div>

<div>
    <asp:TextBox runat="server" ID="txtUser" />
</div>
....

要将下拉列表绑定(bind)到表列表,您需要一个存储过程/查询,如下所示:

从 INFORMATION_SCHEMA.TABLES 中选择 *,其中 TABLE_SCHEMA = 'dbo' ORDER BY TABLE_NAME [将架构名称更改为您的架构名称]

//Bind your dropdown to the list of tables
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["dbConnString"]))
    {
        using (SqlCommand cmnd = conn.CreateCommand())
        {
            cmnd.CommandType = CommandType.StoredProcedure;
            cmnd.CommandText = "dbo.TableSelect";

            conn.Open();

            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            using (SqlDataReader rdr = cmnd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                string _fullName;
                while (rdr.Read())
                {
                    _fullName = string.Format("{0}.{1}",rdr["Table_Schema"].ToString(), rdr["Table_Name"].ToString());
                    ddlTables.Items.Add(new ListItem(_fullName,_fullName));
                }
                ddlTables.Items.Insert(0, new ListItem("Select Table ..."));
            }
        }
    }

然后您需要将文本框连接到响应 keyup 事件的 JavaScript 函数:

//Wire up the textbox
        txtUser.Attributes.Add("onkeyup", "doLookup();");

function doLookup(){

}

执行此操作的现代方法是使用 JQuery 的 AJaX 功能。基本上,您调用处理程序的 URL,该处理程序将返回查询结果,然后将其绑定(bind)或输出到文本框下方的 GUI 元素,因此它看起来有点像下拉列表。然后,用户单击返回的条目之一将其复制到文本框。

一些处理程序代码:

    public void ProcessRequest(HttpContext context)
    {
        HttpRequest req = context.Request;
        if (string.IsNullOrEmpty(req.QueryString["qry"]) || string.IsNullOrEmpty(req.QueryString["tableName"])){
            return;//  You could return something meaningful if no sql query is passed
        }


        String sqlstr = req.QueryString["qry"];
        String tableName = req.QueryString["tableName"];

        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["dbConnStr"])){
            using (SqlCommand cmnd = conn.CreateCommand())
            {
                cmnd.CommandText = tableName + "Select";
                cmnd.CommandType = CommandType.StoredProcedure;
                SqlParameter pram = new SqlParameter("@qry", sqlstr);
                pram.Direction = ParameterDirection.Input;
                cmnd.Parameters.Add(pram);

                pram = new SqlParameter("@tableName", tableName);
                pram.Direction = ParameterDirection.Input;
                cmnd.Parameters.Add(pram);

                conn.Open();

                using (SqlDataReader rdr = cmnd.ExecuteReader(CommandBehavior.CloseConnection)){
                    while (rdr.Read()){
                        sb.Append(rdr["Name"].ToString() + "<br/>"); //Modern object-oriented thing to do is build up a JSON string and return that.
                    }
                }

            }
        }

        context.Response.ContentType = "text/plain";//or "text/JSON"
        context.Response.Write(sb.ToString());
    }

祝你好运。如果您需要更多详细信息,请告诉我...

关于jquery - 自动完成jquery和SQL,ASP.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5084637/

相关文章:

mysql - 如何使用 GROUP BY 显示多个对象,而不是每个分组仅显示一个对象?

javascript - 取消绑定(bind) jQuery 事件处理程序

jquery - 我需要 .slideToggle 来处理悬停(jQuery)

javascript - 使拖放的元素可放置,同时仍可拖动

c# - 为什么 MailDefinition 类需要 System.Web.UI.Control?

php - 从特定的 .csv 文件插入表 - PHP 脚本

java - 是否可以使用 "WHERE"子句来选择 SQL 语句中的所有记录?

javascript - 使用按钮删除 DIV

javascript - iFrame 自动调整大小

asp.net - 如何使 Identity.GetUserId() 返回 Guid 而不是字符串?