【问题标题】:Get results from two tables - asp.net/SQL Server 2008R2从两个表中获取结果 - asp.net/SQL Server 2008R2
【发布时间】:2013-11-21 20:35:18
【问题描述】:

我有一个搜索表单,其中包含一个表中的 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

【问题讨论】:

  • 使用 sql 参数代替字符串连接。这是 sql-injection 的邀请。
  • 对不起,你什么意思?

标签: asp.net sql-server table-relationships


【解决方案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

【讨论】:

    【解决方案2】:
    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+'%'
    

    其中@firstname@lastname 是包含来自搜索字段的值的参数

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

    【讨论】:

      【解决方案3】:

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

      感谢您的所有回复。我喜欢这个论坛。

      【讨论】:

      • 在编程中,同一任务总是有多种方法。正如您会发现的那样,我已经看到以 5 种不同的方式编写的查询并且都可以正常工作。只是方法不同。他们告诉你关于 sql 注入的内容在 asp.net 中有一个 parameter.addwithvalue 在你的 SqlCommand 中。这允许您将参数发送到 SQL Server,并且在您的查询中,您可以将它们称为@nameOfVariable,避免在必须在其周围加上撇号时可能会遇到的所有“'”混乱。您的方式可能允许某人将恶意代码放入文本框中并破解您的应用程序。
      • 实施解决方案后,请随意选择复选框以将问题显示为已回答。在您这样做之前,它似乎是一个未解决的问题。
      • 谢谢 我不知道我应该这样做。
      【解决方案4】:

      您需要的是动态 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)
      

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

      【讨论】:

      • 这个答案是在看到您的最新更新之前创建的。我没有看到你的 .net 代码。这是一个存储过程解决方案。
      • 我不知道如何创建和运行存储过程。我将创建一个字符串并尝试。谢谢。
      • @logixologist 你不需要动态 SQL 来描述你所描述的内容,你可以说 WHERE (@lastname IS NOT NULL AND lastname = '%'+@lastname+'%') AND... 并重复名字..
      • @oghaza 我建议使用动态 sql 的原因是因为您不知道他们将在搜索字段中输入哪些参数、名字、姓氏或任何其他字段。如果我输入了票号的最后 4 位数字或事件的部分文本会怎样。你不能那样做。
      • 或者如果他们输入了姓氏和事件的一部分怎么办。有 n 种可能的事物组合可以输入到 WHERE 子句中,因此我建议使用动态 SQL。这是操作的实际问题:The user doesn't have to fill in all the fields. Thats where I am getting lost. The user is trying to find the incident to update it.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2016-08-12
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      相关资源
      最近更新 更多