0

我有一个搜索表单,其中包含一个表中的 2 个字段(名字和姓氏)(仅包含人员信息)和另一个表中的 4 个(事件编号、日期、地点、创建者)(该人员有一个或多个事件)第一个表)通过外键(nameID)链接。我认为问题在于使用什么样的连接以及如何使用 WHERE 子句。

谢谢。

更多信息:@Tim - 用户输入一个或多个字段不是过滤器还是 WHERE 子句?用户不必填写所有字段。那就是我迷路的地方。用户正在尝试查找事件以对其进行更新。这有帮助吗?

此外,如果没有输入完整名称,我必须在 Where 子句中使用“Like%LName%”来获取所有名称。

我的查询如下所示:

Protected Sub BtnSearch_Click(sender As Object, e As EventArgs) Handles BtnSearch.Click
    Dim strSearch As String
    strSearch = "SELECT tblPatron.LName, tblPatron.FName, tblIncident.CreatedBy, "
    strSearch = strSearch + "tblIncident.Inci_ID, tblIncident.Inci_date, tblIncident.Inci_type, tblIncident.Library, "
    strSearch = strSearch + "tblIncident.PatronName, tblIncident.Location "
    strSearch = strSearch + "FROM tblPatron INNER JOIN tblIncident ON tblPatron.PatronID = tblIncident.PatronID "
    strSearch = strSearch + "WHERE "
    strSearch = strSearch + "(tblPatron.LName Like '%" + txtLName.Text.ToString() + "%') "
    strSearch = strSearch + "AND (tblPatron.FNAME Like '%" + txtFName.Text.ToString() + "%')"
    strSearch = strSearch + "AND (tblIncident.Inci_ID ='" + strInciNum.Text.ToString() + "')"
    strSearch = strSearch + "AND (tblIncident.Inci_date = '" + txtInciDate.Text.ToString() + "')"
    strSearch = strSearch + "AND (tblIncident.Inci_type = '" + ddInciCat.SelectedValue.Trim + "')"
    strSearch = strSearch + "AND (tblIncident.Library = '" + ddLib.SelectedValue.Trim + "')"
    SearchPDS.SelectCommand = strSearch
    SearchPDS.DataBind()
    GridSearchResults.DataBind()
    GridSearchResults.Visible = True
End Sub
4

4 回答 4

1
SELECT firstname, lastname, incidentnumber, date, place, createdby
FROM name n
INNER JOIN incident i ON n.nameID = i.nameID
WHERE firstname LIKE '%'+@firstname+'%' 
  AND lastname  LIKE '%'+@lastname+'%'

where@firstname@lastnameare 包含搜索字段值的参数

在您的字符串连接样式中,只需将txtFName.Text.ToString()和添加txtLName.Text.ToString()到字符串中来代替这些参数。

于 2013-11-21T21:10:01.860 回答
1

做这个:

SELECT A.FirstName, A.LastName, B.IncidentNumber, B.Date, B.Place, B.CreatedBy
FROM Name A  INNER JOIN Incident B
ON A.NameID = B.NameID
于 2013-11-21T20:53:43.723 回答
1

我接受了逻辑学家的建议。在单击事件上,我添加了多个 if 语句来检查空值,然后添加构建查询字符串。同时,我将下拉列表之一设为默认值,而不是“选择”,这将是我的起始 Where 参数。这现在对我有用。编写查询可能有更好的方法,我只是 asp.net 的初学者

感谢你的回复。我喜欢这个论坛。

于 2013-11-22T17:21:02.873 回答
0

你需要的是动态sql。基本上你首先声明一个 varchar(max)

DECLARE @Sql as varchar(max)

然后将其设置为基本 SQL 语句:

SET @SQL = 'SELECT A.FirstName, A.LastName, B.IncidentNumber, B.Date, B.Place, B.CreatedBy
FROM Name A  INNER JOIN Incident B
ON A.NameID = B.NameID  where lastname IS NOT null '  -- PUT IN A WHERE CLAUSE THAT WILL ALWAYS BE TRUE

---这是伪代码中的概念

IF @lastname is not null
BEGIN
SET @SQL = @SQL + 'and lastname = '%' + @lastname + '%'
END

IF @FIRSTNAMEis not null
BEGIN
SET @SQL = @SQL + 'and FIRSTNAME = '%' + @FIRSTNAME+ '%'
END

在最后

EXEC (@SQL)

这将为您提供他们提供的任何选项。

于 2013-11-21T21:16:26.007 回答