1

条件が渡されてデータをクエリし、そのクエリから返された結果を取得してデータグリッドに追加するデータグリッドに行を追加しようとしています。以下はコードです:

private void FetchAllJobStatus(int regionID)
    {
        OleDbConnection con = new OleDbConnection(Constring);
        String strQu1;
        strQu1 = "SELECT LOGPATH, TWSID FROM JOB_DETAILS_TEST WHERE REGIONID = " + regionID + " ORDER BY TWSID";
        OleDbDataAdapter dapt1 = new OleDbDataAdapter(strQu1, con);
        DataTable dt1 = new DataTable();
        dapt1.Fill(dt1);

        foreach (DataRow row in dt1.Rows)
        {
            string twsIDName = row.ItemArray[1].ToString();
            string startTime = GetStartTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
            string endTime = GetEndTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
            DateTime dat1 = DateTime.Parse(startTime);
            DateTime dat2 = DateTime.Parse(endTime);
            string endingTime;

            if (endTime == string.Empty || endTime == null || dat2 < dat1)
            {
                endingTime = "";
            }
            else
            {
                endingTime = endTime.Remove(0, 3).ToString();
            }
            string startingTime = startTime.Remove(0, 3).ToString();
            String strQu2;
            strQu2 = "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID + " ORDER BY JOBNAME";
            OleDbDataAdapter dapt2 = new OleDbDataAdapter(strQu2, con);
            DataSet ds = new DataSet();
            dapt2.Fill(ds, "dt2");
            dgJobStatusAll.AutoGenerateColumns = true;
            dgJobStatusAll.DataSource = ds;
            dgJobStatusAll.DataMember = "dt2";
        }

    }

ここでは、最後のデータのみがグリッドに追加されます。前もって感謝します

4

3 に答える 3

0

でできますDataTable.Merge()。ループの前とDataTable代わりにa を取り、ループの後にグリッドをバインドします。DataSet dsfor

 ............................................
 ................................................
        DataTable dt1 = new DataTable();
        dapt1.Fill(dt1);
   DataTable dtMain=new DataTable();

 foreach (DataRow row in dt1.Rows)
    {
        string twsIDName = row.ItemArray[1].ToString();
        string startTime = GetStartTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        string endTime = GetEndTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        DateTime dat1 = DateTime.Parse(startTime);
        DateTime dat2 = DateTime.Parse(endTime);
        string endingTime;

        if (endTime == string.Empty || endTime == null || dat2 < dat1)
        {
            endingTime = "";
        }
        else
        {
            endingTime = endTime.Remove(0, 3).ToString();
        }
        string startingTime = startTime.Remove(0, 3).ToString();
        String strQu2;
        strQu2 = "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID + " ORDER BY JOBNAME";
        OleDbDataAdapter dapt2 = new OleDbDataAdapter(strQu2, con);
        DataTable dtTemp=new 
        dapt2.Fill(dtTemp);

       if(dtTemp.Rows.Count>0)
       {
          dtMain.Merge(dtTemp);
       }
    }
        dgJobStatusAll.AutoGenerateColumns = true;
        dgJobStatusAll.DataSource = dtTemp;
        //dgJobStatusAll.DataMember = "dt2";

}

または、この場合に最適な内部結合を使用して単一のクエリを作成できます。

于 2013-12-06T06:23:06.683 に答える
0

foreach 内で毎回グリッドをバインドするため、結果は明らかです。したがって、毎回上書きされます。このようにしてみてください。これは完全ではありませんが、軌道に乗るはずです。

private void FetchAllJobStatus(int regionID)
{
    OleDbConnection con = new OleDbConnection(Constring);
    String strQu1;
    strQu1 = "SELECT LOGPATH, TWSID FROM JOB_DETAILS_TEST WHERE REGIONID = " + regionID + " ORDER BY TWSID";
    OleDbDataAdapter dapt1 = new OleDbDataAdapter(strQu1, con);
    DataTable dt1 = new DataTable();
    dapt1.Fill(dt1);

    DataSet ds = new DataSet(); // Move this out
    DataTable dt = new DataTable("MyTable"); 
    dt.Columns.Add(new DataColumn("yourColumnName",typeof(int))); // Create columns as you want (your structure)
    dt.Columns.Add(new DataColumn("yourColumnName2", typeof(string)));
    foreach (DataRow row in dt1.Rows)  // Now inside foreach create row and add it to  the table
    {
        string twsIDName = row.ItemArray[1].ToString();
        string startTime = GetStartTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        string endTime = GetEndTime(row.ItemArray[0].ToString(), int.Parse(twsIDName));
        DateTime dat1 = DateTime.Parse(startTime);
        DateTime dat2 = DateTime.Parse(endTime);
        string endingTime;

        if (endTime == string.Empty || endTime == null || dat2 < dat1)
        {
            endingTime = "";
        }
        else
        {
            endingTime = endTime.Remove(0, 3).ToString();
        }
        string startingTime = startTime.Remove(0, 3).ToString();
        String strQu2;
        strQu2 = "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID + " ORDER BY JOBNAME";
        OleDbDataAdapter dapt2 = new OleDbDataAdapter(strQu2, con);
        // dapt2.Fill(ds, "dt2");
        DataRow dr = dt.NewRow(); // create row
        dr["yourColumnName"] = // fill these
        dr["yourColumnName2"] = // fill these
        dt.Rows.Add(dr); // add row to dt
    }
    ds.Tables.Add(dt); // add table to your dataset
    dgJobStatusAll.AutoGenerateColumns = true;
    dgJobStatusAll.DataSource = ds;
    dgJobStatusAll.DataMember = "dt2";

}
于 2013-12-06T06:20:09.203 に答える
0

ユニオンを使用して単一のクエリを作成し、ループの外側でデータテーブルを埋めます。取った

String strQu2; 

ループ外。ループ内での使用

if(string.IsNullOrEmpty(strQu2 ))
{
strQu2 ="SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID ;
}
else
{
strQu2 =strQu2 +" Union All "+ "SELECT JOBNAME, TWSID, HIGHPRIORITY, DAY, TIME, '"+ startingTime + "' as StartTime, '"+ endingTime + "' as EndTime FROM JOB_DETAILS_TEST WHERE TWSID = " + int.Parse(twsIDName) + " AND REGIONID = " + regionID ;
}

そして今ループ書き込みの後

strQu2 =strQu2 + " Order by REGIONID,JOBNAME "

そして、データテーブルを埋めてグリッドにバインドします

于 2013-12-06T06:17:15.557 に答える