0

従業員情報を含む従業員テーブルと、従業員の電話番号を含む連絡先詳細テーブルがあります。従業員は2つ以上の電話番号を持っています。

今、従業員情報を表示するために、私はデータグリッドを持っています。私がやりたいのは、データグリッドの従業員情報と一緒に最初の2つの数字を表示することです。

次の方法を使用してデータグリッドを埋めます

    public static void SignUpControllerDay(DateTime Date, System.Windows.Forms.DataGridView PassedGrid)
    {
        string sql_SignUp = String.Format(@"SELECT e.Emp_ID as Emp_ID,
                                      e.First_Name+ ' ' +e.Last_Name as Name,
                                      sum(o.Quantity) as Sum
                                      FROM Employee e,OT_hours o,Position p,Signup_Sheet s
                                      WHERE e.Emp_ID=o.Emp_ID
                                      and e.Emp_ID = s.Employee_ID
                                      and s.Day_Shift = 1
                                      and e.Position_ID = p.Position_ID
                                      and p.Position_Name = 'Controller'
                                      and o.Quantity NOT IN(0.3)
                                            and s.Date = '{0}'
                                      and o.Date <= CONVERT(VARCHAR,'{0}',101) AND o.Date > CONVERT(VARCHAR,DATEADD(YYYY,-1,'{0}'),101)
                                      GROUP BY e.Emp_ID,e.First_Name+' '+e.Last_Name,p.Position_Name
                                      ORDER BY Sum", Date);

        SqlConnection sqlConn = null;
        SqlCommand cmd_SignUp;
        SqlDataReader dr_SignUp;
        try
        {
            sqlConn = new SqlConnection(databaseConnectionString);
            sqlConn.Open();
            cmd_SignUp = new SqlCommand(sql_SignUp, sqlConn);
            dr_SignUp = cmd_SignUp.ExecuteReader();

            while (dr_SignUp.Read())
            {
                PassedGrid.Rows.Add(dr_SignUp["Emp_ID"].ToString(), dr_SignUp["Name"].ToString(), dr_SignUp["Sum"].ToString());
            }

        }
        catch (Exception e)
        {
            MessageBox.Show("Error found in SignUpControllerDay..." + Environment.NewLine + e.ToString());
        }
        finally
        {
            if (sqlConn != null)
            {
                sqlConn.Close();
            }
        }
    }

上記のメソッドは、従業員のempid、name、sumを表示します。私がやりたいのは、contact_detailsテーブルから任意の2つの電話番号を表示することです。データリーダーを使用して従業員IDに基づいて電話番号を取得しようとしましたが、機能しませんでした。

助けてください....

4

2 に答える 2

4

私はレジーが何をしたいのか知っていると思いますが、私があなたを助ける前に、レジーはあなたが見たいかもしれないいくつかのことを見てみましょう:

  1. 前述のように、 String.Format または Dynamic SQLを使用しないでください。SQL Server を使用している場合は、パラメーター化された SQL Command オブジェクトを使用してストアド プロシージャを使用します。
  2. クライアント (Web アプリまたは Windows アプリ) が、実際にデータ集約型 (C# の作業ではなく SQL の作業) のためにあまりにも多くの作業を行っています。
  3. コードを肥大化させるだけで不要なため、ループする必要はまったくなく、データリーダーを使用することさえありません
  4. finally 句で接続を閉じますが、接続または実際の SQL コマンド オブジェクトを null に設定することはありません。私は C# ガベージ コレクションを知っていますが、そうすることは良い練習ポイントです。
  5. SQL Server 2005以降では、 BOLPIVOTで調べてくださいというキーワードが表示されます

SQL Server 2005 以降を使用している場合の質問に関しては、PIVOT を使用できます。2 つの連絡先番号がある可能性があるとおっしゃいましたが、1 つは職場で、もう 1 つは自宅であると仮定します。

あなたはこれを行うことができます:

SELECT 
      FullName, 
      [Work], 
      [Home] 
FROM
(SELECT 
       l.FullName, 
       p.PhoneType, 
       p.PhoneNumber 
 FROM 
       Login l 
 INNER JOIN 
       Phone p 
 ON p.LoginID = l.LoginID) ps
PIVOT
(
 MAX(ps.PhoneNumber)
FOR
 ps.PhoneType IN ([Home], [Work])
) AS pvt

Login は単に Employees テーブルで、Phone は連絡先テーブルと電話番号です。従業員IDは連絡先テーブル(つまり、Login.LoginID = Phone.LoginID)またはあなたの場合はEmployee.EmpID = Contacts.EmpIDで見つかると思います。

したがって、この:

代替テキスト http://img513.imageshack.us/img513/6126/onetime.jpg

ピボットを使用しない標準クエリでは、次のようになります...:

代替テキスト http://img513.imageshack.us/img513/7395/2time.jpg

ピボット使用時。

于 2010-01-07T15:11:16.570 に答える
0

SQL のどこでも contact_details テーブルを参照していません。電話番号を含めるには、Employee テーブルと contact_details テーブルを結合する必要があります。

于 2010-01-07T14:13:48.903 に答える