0

这是场景,我的数据库中有两个表。一个命名项目,另一个命名分配。在项目表中,我有 2 列,第一列具有项目 ID 和项目名称。在分配表中,我有两列,一个是员工 ID,另一个是项目 ID。我想做的是,当有人搜索分配给员工的项目时,我想显示名称而不是代码。因此,我想从 gridview 中的项目表中检索项目名称,其中该 ID 与分配表中的 ID 匹配。

这是我的试用代码:

        OdbcCommand assignslist = new OdbcCommand("SELECT projName FROM projects WHERE projID=(SELECT projname FROM assigns where employeeID='" + empid + "')", _connection);
        OdbcDataReader readassigns = assignslist.ExecuteReader();
        GridView1.DataSource = readassigns;
        GridView1.DataBind(); 

尝试此代码时收到错误消息。我想将分配给该员工的所有项目检索到 gridview 有人可以帮忙吗?


表分配

员工 ID 项目名称

EJ201 MD101

表项目

projID projName startDate endDate MD101 testa
MD301 testb
MD930 testc


表工作

ID fName midName lName EJ201 jack joe joey
EMP201 abc

4

1 回答 1

0

您需要一个JOIN查询。但是您的设计(或至少您的描述)缺少一条基本信息,即 EmployeeName。在您的场景中,通常会有第三个表,其中包含有关员工的信息及其姓名和其他类比信息。

因此,假设您有第三个名为 Employee 的表

 EmployeeID  INT
 Name NVARCHAR(50)
 .....

现在您可以使用这样的查询检索有关项目的所有信息

SELECT p.projID, p.projName , e.ID, e.fName, .........
FROM projects p INNER JOIN assigns a ON p.projID= a.projID
                INNER JOIN empos e ON a.employeeID= e.ID
WHERE a.employeeID = @empID

JOIN 查询的确切语法可能有点不同,但概念是相同的。JOIN 用于表示两个或多个表之间的关系。

string cmdText = "SELECT p.projID, p.projName, e.ID, e.fName, e.midName, e.lName " +
                 "FROM ((projects p INNER JOIN assigns a ON p.projName = a.projname) " +
                 "INNER JOIN empos e ON a.employeeID= e.ID) " +
                 "WHERE a.employeeID = ?";
OdbcCommand assignslist = new OdbcCommand(cmdText, _connection);
assignslist.Parameters.AddWithValue("@empID", empID);
OdbcDataReader readassigns = assignslist.ExecuteReader();
GridView1.DataSource = readassigns;
GridView1.DataBind(); 

我还改变了构建查询的方式,从暴露给 Sql Injections 的字符串连接和解析问题到更安全的参数化查询。此处 empID 的值由占位符(问号)表示,然后将 empID 值添加到参数集合中,框架代码将处理传递给底层数据库的值

附注:如果您关闭数据读取器和连接,您的代码并不明显。记得这样做(可能使用using 语句

编辑通过您的编辑,现在很明显关系是使用 projName 建立的,而不是 projectID,所以我更新了上面的查询

于 2013-08-03T12:37:52.917 回答