首先尝试这样的查询
SELECT *
FROM CUSTOMER
WHERE LEFT(NAME, 1) = 'A'
工作正常,但现在我希望它作为存储过程,'A'被这样的搜索词取代
CREATE PROCEDURE [dbo].[procCustomer_SelectByFirstLetter]
@SearchTerm VARCHAR(50)
AS
SELECT [Name]
FROM [dbo].[Customer]
WHERE LEFT(NAME, 1) = '@SearchTerm'
GO
此存储过程由C#方法调用,该方法使用包含所有字母A-Z的下拉列表
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
DataTable customerTable = Customer.SelectByFirstLetter(Request.QueryString[DropDownList1.SelectedValue.ToString()]);
CustomerRepeater.DataSource = customerTable;
CustomerRepeater.DataBind();
CustomerCountLabel.Text = customerTable.Rows.Count.ToString();
}
当我从下拉菜单中选择一封信时,Reapter什么都没显示。有任何想法吗?谢谢!
答案 0 :(得分:3)
您仍在使用引用值,因此它会查找第一个字母等于字符串"@SearchTerm"
的名称,这当然没有。
您需要删除引号:
WHERE LEFT(NAME, 1) = @SearchTerm
此外,您可能会或可能不会意识到您可以使用LIKE
:
WHERE NAME LIKE 'A%'
...或
WHERE NAME LIKE @SearchTerm + '%'
...... %
是通配符。通过这种方式,传递A
将搜索以字母A开头的任何内容,但是传递ABC
将搜索带有字母“ABC”的任何内容,而无需指定长度,如LEFT
中所示。 1}}功能。
<强>更新强>
此外,您似乎错误地将参数传递给过程:
DataTable customerTable = Customer.SelectByFirstLetter(Request.QueryString[DropDownList1.SelectedValue.ToString()]);
在这里,您正在查找QueryString集合中的一个键,匹配您选择的值。因此,如果DropDownList1.SelectedValue.ToString()
产生“A”,它将会寻找?A=...
。您可能希望使用以下内容:
DataTable customerTable = Customer.SelectByFirstLetter(DropDownList1.SelectedValue.ToString());
答案 1 :(得分:0)
试试这个......
LEFT(NAME, 1) = @SearchTerm
而不是
LEFT(NAME, 1) = '@SearchTerm'
答案 2 :(得分:0)
正如我在你的问题评论中提到的那样,不考虑搜索词的长度可能是你遇到的问题,但是其他人也提出了另一个使用like而不是left的好方法。
CREATE PROCEDURE [dbo].[procCustomer_SelectByFirstLetter]
@SearchTerm VARCHAR(50)
AS
SELECT [Name]
FROM [dbo].[Customer]
WHERE LEFT(NAME, LEN(@SearchTerm)) = @SearchTerm
那就是说,经过进一步审查,这条线很可能就是你的问题:
Customer.SelectByFirstLetter(Request.QueryString[DropDownList1.SelectedValue.ToString()]);
Request.QueryString [value]将为您提供Request.QueryString [value]等于的任何内容。我想你真的想要这个吗?
Customer.SelectByFirstLetter(DropDownList1.SelectedValue.ToString());
答案 3 :(得分:0)
如果你只想匹配第一个字符,你的SP应该是这样的
CREATE PROCEDURE [dbo].[procCustomer_SelectByFirstLetter]
@SearchTerm CHAR(1)
AS
SELECT
[Name]
FROM
[dbo].[Customer]
WHERE
LEFT(NAME, 1) = @SearchTerm
GO
一般来说,你可以做到
CREATE PROCEDURE [dbo].[procCustomer_SelectByNameStart]
@SearchTerm VARCHAR(MAX) /*Use your column width here*/
AS
SELECT
[Name]
FROM
[dbo].[Customer] C
WHERE
C.[Name] LIKE @SearchTerm + '%'
GO
您可能希望在结果集中也包含Customer表的主键,但为了简洁起见,我将其省略。
答案 4 :(得分:0)
您是否在Page_Load-Event中填写了DropDownList?
如果是,请在
中验证是否发生了这种情况if (!Page.IsPostback)
{
}
块。
Page_Load在SelectedIndex_Changed事件之前执行,因此如果您没有正确绑定下拉列表,请将下拉列表的值重置为初始值,而不是您的搜索字词。