【问题标题】:Referring to Winforms objects in SQL query?在 SQL 查询中引用 Winforms 对象?
【发布时间】:2021-11-11 22:22:18
【问题描述】:

对于上下文,我正在使用存储在 SQL Server 中的家谱数据库。为了查看信息,我在 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 对象(称为“childOfCurrent”),该对象将显示所有列为当前查看记录的子项的人(在PersonTable 中使用自联接)。

我已使用自联接 SQL 查询成功列出所有母亲及其子女:

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 

但是,我希望结果取决于正在查看的记录(以便仅显示“当前记录”人员的子项)。我想这可以通过引用PersonForm 中包含personID 的文本框来实现,即当前记录。但我不知道该怎么做。

我在自联接查询结束时尝试了类似访问 WHERE MotherID = Forms!PersonForm!PersonID 失败了,因为您可能无法在 T-SQL 中引用这样的对象。

是否有一些类似于 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
    }
}

【问题讨论】:

  • 您通常创建一个参数化查询,并将表单值复制到参数中。
  • 好的,谢谢@Nick.McDermaid 我会调查的

标签: sql-server winforms tsql


【解决方案1】:

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

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

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

  • 解决方案返回符合条件的字段。 这意味着当母亲的记录打开时,孩子可以显示在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();
    
              }
          }
    

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2021-02-16
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多