您可以编写一个处理程序 (.ashx) 以从数据库返回文本搜索和表名称的查询结果。对于表名,请查看 SQL Server 中的 INFORMATION_SCHEMA.TABLES ...
看看这个.NET AJAX 调用 ASMX、ASPX 或 ASSX? https://stackoverflow.com/questions/673075/net-ajax-calls-to-asmx-or-aspx-or-ashx对于使用 ScriptService 的稍微现代的方法 - 基本思想是相同的。
如果需要的话,我明天会发布代码(其 v.late),
Hth.
EDIT:
最简单的(您会意识到做一些更复杂的事情所涉及的问题)让我们假设您有三个表:User, 部门 and Product.
表:用户
ID 整数
名字 varchar(50)
姓氏 varchar(50)
出生日期日期时间
表:部门
Id int
名称 varchar
表:产品
Id int
名称 varchar
并且你需要3个Sprocs来按部分进行选择Name:
产品和部门的存储过程的形式相同:
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>
....
要将下拉列表绑定到表列表,您需要一个存储过程/查询,如下所示:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo'
ORDER BY TABLE_NAME
[Change the schema name to that of your schema]
//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 ..."));
}
}
}
然后你需要将你的文本框连接到一个 JavaScript 函数来响应keyup
event:
//Wire up the textbox
txtUser.Attributes.Add("onkeyup", "doLookup();");
function doLookup(){
}
执行此操作的现代方法是使用 JQuery 的 AJaX 功能。基本上,您调用处理程序的 URL,该处理程序将返回查询结果,然后将其绑定或输出到 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());
}
祝你好运。如果您需要更多详细信息,请告诉我...