You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Winforms项目的T-SQL查询中如何引用当前窗体控件的PersonID值?

问题解答

核心结论

T-SQL 没有 类似Access的Forms!FormName!ObjectName直接引用前端窗体对象的语法,SQL Server作为独立的数据库服务,和你的WinForm应用是完全隔离的运行环境,无法直接访问应用端的控件、变量等资源。

正确实现方案

你需要通过参数化查询的方式,将窗体上的当前PersonID值传入SQL语句,这种方式还能避免SQL注入风险,是.NET操作数据库的标准写法。

步骤1:调整SQL查询语句

首先修正你原SQL中的表名笔误(你建表的表名是PersonTable,原查询写的PersonT会报错),同时增加参数化的过滤条件:
如果仅需要查询当前记录作为母亲的子女:

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 
    PersonTable C 
JOIN 
    PersonTable M ON C.MotherID = M.PersonID 
WHERE M.PersonID = @CurrentPersonID
ORDER BY ChildID

如果需要查询当前记录的所有子女(无论当前记录是父亲还是母亲,一步到位更符合系谱需求),可以用下面的查询:

SELECT
    C.PersonID AS ChildID,
    C.FirstName AS ChildFirstName,
    C.LastName AS ChildLastName,
    CASE WHEN C.MotherID = @CurrentPersonID THEN '母亲' ELSE '父亲' END AS ParentRole
FROM PersonTable C
WHERE C.MotherID = @CurrentPersonID OR C.FatherID = @CurrentPersonID
ORDER BY ChildID

步骤2:修改C#代码,添加参数传递

将你窗体上存储当前PersonID的文本框值(假设你的文本框控件名为txtPersonID,可替换为你实际的控件名)通过参数传入查询,修改后的代码如下:

private void SearchButton_Click_1(object sender, EventArgs e)
{
    // 先校验PersonID输入合法
    if (!int.TryParse(txtPersonID.Text.Trim(), out int currentPersonId))
    {
        MessageBox.Show("当前人员ID格式错误");
        return;
    }

    using (SqlConnection sqlCon = new SqlConnection(ConnectionString))
    {
        sqlCon.Open();
        // 替换为上面你选择的SQL语句
        string querySql = @"
SELECT
    C.PersonID AS ChildID,
    C.FirstName AS ChildFirstName,
    C.LastName AS ChildLastName,
    CASE WHEN C.MotherID = @CurrentPersonID THEN '母亲' ELSE '父亲' END AS ParentRole
FROM PersonTable C
WHERE C.MotherID = @CurrentPersonID OR C.FatherID = @CurrentPersonID
ORDER BY ChildID
";
        SqlDataAdapter sqlDA = new SqlDataAdapter(querySql, sqlCon);
        // 添加参数赋值
        sqlDA.SelectCommand.Parameters.AddWithValue("@CurrentPersonID", currentPersonId);
        
        DataTable dtbl = new DataTable();
        sqlDA.Fill(dtbl);

        childOfCurrent.DataSource = dtbl;
    }
}

额外优化建议

  • 如果你的PersonForm打开时已经加载了当前人员的完整信息,可以直接把当前PersonID存在窗体的全局int变量里,不用再从文本框读取,避免输入篡改的问题
  • 可以把查询绑定到当前记录切换的事件里,不需要用户手动点查询按钮,切换人员时自动加载子女列表

内容的提问来源于stack exchange,提问作者Hobs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:48:01