在 SQL 查询中引用 Winforms objects?

Referring to Winforms objects in SQL query?

对于上下文,我正在使用存储在 SQL 服务器中的家谱数据库。为了查看信息,我在 Visual Studio 中创建了一个 Winforms 应用程序,它将允许每个人都被视为一个名为 PersonForm.

的记录。

PersonTable如下:

CREATE TABLE PersonTable 
(
    PersonID INT NOT NULL PRIMARY KEY IDENTITY (1,1),
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Gender BINARY,
    MotherID INT,
    FatherID INT,
);

我的最终目标是在表单上有一个 dataGridView object(称为 'childOfCurrent'),它将显示当前查看记录中列为 children 的所有人(使用自己加入 PersonTable).

我已经使用自连接 SQL 查询成功列出了所有母亲和她们的 children:

SELECT
    C.PersonID AS ChildID,
    C.FirstName AS ChildFN,
    C.LastName AS ChildLN,
    M.PersonID AS MotherPersonID,
    M.FirstName AS MotherFN,
    M.LastName AS MotherLN 
FROM 
    PersonT C 
JOIN 
    PersonT M ON C.MotherID = M.PersonID 
ORDER BY 
    MotherPersonID 

但是,我希望结果取决于正在查看的记录(以便仅显示 'current record' 人的 children)。我想这将通过引用包含 personIDPersonForm 中的文本框来实现,即当前记录。但我不知道该怎么做。

我在自连接查询结束时尝试了类似 in access 的操作 WHERE MotherID = Forms!PersonForm!PersonID 未成功,因为您可能无法在 T-SQL.

中引用这样的 object

是否有类似 MS Access 的东西,您可以在查询本身中引用 Forms!FormName!ObjectName 等?我可能以错误的方式思考这个问题。

为了以防万一,这是 C# 代码

private void SearchButton_Click_1(object sender, EventArgs e)
{
    using (SqlConnection sqlCon = new SqlConnection(ConnectionString))
    {
        sqlCon.Open();

        SqlDataAdapter sqlDA = new SqlDataAdapter("THE SQL I PUT IN THE SECOND CODE SNIPPET", sqlCon);
        DataTable dtbl = new DataTable();
        sqlDA.Fill(dtbl);

        childOfCurrent.DataSource = dtbl;   //childOfCurrent is dataGridView object
    }
}

这是使用参数化查询的解决方案,以防万一有人遇到这个问题。 上下文:表单中的每条记录都对应一个人,objective 在 datagridview 中使用 personID 到 motherID 的自连接显示表单上任何母亲的 children。

  • 解决方案从 personID 文本框中获取 PersonID 值(例如 3)来标识当前记录。 (此值根据打开的记录而变化) 此 personID 设置为第 8 行中的 SQL 参数。

  • SQL 查询在数据库中搜索在其 motherID 列中具有该 personID 值的记录(这是自连接)。 (换句话说,所有列出 MotherID = 3 为他们母亲的记录都被选中)

  • 解决方案returns符合条件的字段。 这意味着当一个母亲的记录打开时,children可以显示在datagridview中。

      private void showButton_Click(object sender, EventArgs e)
          {
              using (SqlConnection con = new SqlConnection(ConnectionString))
              {
                  con.Open();
                  SqlDataAdapter cmd = new SqlDataAdapter("SELECT FirstName, LastName FROM Table WHERE MotherID = @currentPerson", con); //currentperson is the parameter
    
                  SCcmd.SelectCommand.Parameters.AddWithValue("@currentPerson", personIDTextBox.Text);  //this retrieves the PersonID value from the textbox
    
                  DataTable dt = new DataTable(); 
                  cmd.Fill(dt); 
                  DataGridViewName.DataSource = dt;
                  cmd.SelectCommand.ExecuteNonQuery();
                  MessageBox.Show("complete");
                  con.Close();
    
              }
          }