在 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)。我想这将通过引用包含 personID
的 PersonForm
中的文本框来实现,即当前记录。但我不知道该怎么做。
我在自连接查询结束时尝试了类似 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();
}
}
对于上下文,我正在使用存储在 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)。我想这将通过引用包含 personID
的 PersonForm
中的文本框来实现,即当前记录。但我不知道该怎么做。
我在自连接查询结束时尝试了类似 in access 的操作
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
}
}
这是使用参数化查询的解决方案,以防万一有人遇到这个问题。 上下文:表单中的每条记录都对应一个人,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(); } }