0

これがシナリオです。データベースに 2 つのテーブルがあります。1 つは名前付きプロジェクト、もう 1 つは名前付き割り当てです。プロジェクト テーブルには、プロジェクト ID とプロジェクト名を含む 2 つの列があります。assigns テーブルには、従業員 ID とプロジェクト ID の 2 つの列があります。私がやろうとしているのは、従業員が割り当てられているプロジェクトを誰かが検索するときに、コードではなく名前を表示したいということです。したがって、この 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(); 

このコードを試すと、エラーが発生します。この従業員に割り当てられたすべてのプロジェクトをグリッドビューに取得したいのですが、誰か助けてもらえますか?!


テーブルの割り当て

従業員 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 が欠けています。あなたのシナリオでは、従業員に関する情報とその名前およびその他のアナグラフィック情報を含む3番目のテーブルを持つのが一般的です。

したがって、Employee という名前の 3 番目のテーブルがあるとします。

 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 は、2 つ以上のテーブル間の関係を表すために使用されます。

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 インジェクションや解析の問題にさらされている文字列連結から、より安全なパラメーター化されたクエリへとクエリを作成する方法も変更しました。ここでは、empID の値がプレースホルダー (疑問符) で表され、empID 値がパラメーター コレクションに追加されます。ここで、Framework コードが基になるデータベースに値を渡す処理を行います。

補足:データリーダーと接続を閉じても、コードからは明らかではありません。そうすることを忘れないでください(おそらくusing ステートメントを使用します)

編集あなたの編集により、関係がprojectIDではなくprojNameを使用して作成されたことが明らかになったので、上記のクエリを更新します

于 2013-08-03T12:37:52.917 に答える