2017-12-19 1 views
1

누구든지 실수를 저에게 지적 할 수 있습니다. 데이터베이스에서 데이터를 읽고 내 함수에 넣을 새 SQL 쿼리를 넣고 싶습니다. 그리고 결국에는 현재 출구 I에서,데이터베이스 데이터 읽기 및 변수로 전달

using (SqlConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["TestControl.Properties.Settings.DB"].ConnectionString)) 
     { 
      boAPI4.Login login = new boAPI4.Login(); 
      string cS = login.GetConnectionString(); 
      DataAccess dA = new DataAccess(cS); 
      int userID = dA.getLpeID(login.GetBoUserNr()); 
      PRAESENZZEIT q = new PRAESENZZEIT(); 

      q.ZPZ_LPE_ID = userID; 
      if (db.State == ConnectionState.Closed) 
       db.Open(); 
      string query = "SELECT per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum, SUM (zei.ZPZ_Std100) AS ZPZ_Std100" + 
          " FROM DB.dbo.Z_PRAESENZZEIT zei INNER JOIN DB.dbo.A_PERSONAL per ON zei.ZPZ_LPE_ID = per.LPE_ID" + 
          $" WHERE zei.ZPZ_Datum BETWEEN '{dtFromDate.Value}' AND '{dtToDate.Value}' AND zei.ZPZ_LPE_ID='{userID.ToString()}' GROUP BY per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum ORDER BY zei.ZPZ_Datum, per.LPE_Nr;"; 

      pRAESENZZEITBindingSource.DataSource = db.Query<PRAESENZZEIT>(query, commandType: CommandType.Text); 

      List<PRAESENZZEIT> listid = new List<PRAESENZZEIT>(); 
      PRAESENZZEIT pra = new PRAESENZZEIT(); 
      SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestControl.Properties.Settings.DB"].ConnectionString); 
      string sql = "SELECT ZPZ_Von,ZPZ_bis FROM DB.dbo.Z_PRAESENZZEIT WHERE ZPZ_LPE_ID='196'"; 
      con.Open(); 
      SqlCommand cmd = new SqlCommand(sql, con); 
      SqlDataReader dr = cmd.ExecuteReader(); 

      while (dr.Read()) 
      { 
       pra.ZPZ_Von = Convert.ToDateTime(dr["ZPZ_Von"]); 
       pra.ZPZ_Bis = Convert.ToDateTime(dr["ZPZ_bis"]); 
       listid.Add(pra); 
      } 
      dataGridView1.DataSource = listid; 
      con.Close(); 

      DateTime kommen = DateTime.Now; 

      kommen = pra.ZPZ_Von; 
      if (pra.ZPZ_Von.TimeOfDay < new TimeSpan(8, 5, 0)) 
       pra.ZPZ_Von = new DateTime(pra.ZPZ_Von.Year, pra.ZPZ_Von.Month, pra.ZPZ_Von.Day, 8, 0, 0); 

      DateTime gehen = DateTime.Now; 
      gehen = pra.ZPZ_Bis; 
      TimeSpan arbeitszeit = pra.ZPZ_Bis - pra.ZPZ_Von; 

     } 

현재 첫 번째 쿼리이 버튼 내 전체 코드처럼 보이는 SUM (zei.ZPZ_Std100) AS ZPZ_Std100

에 나타나는 콜론 ("stunden")의 출구에 표시됩니다

enter image description here

그래서, 내가

이이 변수를 통해가는 방법이지만이 기본 데이터를 처리하지 않은 것처럼 결과를 반환 변수 날짜를 통과 데이터가 필요, 문제는 무엇인가? 이해하면 시간 [ZPZ_VON 7시 45분] 출구는 ... 8시해야한다는

SQL 쿼리SELECT ZPZ_Von, DB.dbo.Z_PRAESENZZEIT FROM ZPZ_bis ZPZ_LPE_ID = '196'

CODE :

List<PRAESENZZEIT> listid = new List<PRAESENZZEIT>(); 
      SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestControl.Properties.Settings.DB"].ConnectionString); 
      string sql = "SELECT ZPZ_Von, ZPZ_bis FROM DB.dbo.Z_PRAESENZZEIT WHERE ZPZ_LPE_ID='196'"; 
      con.Open(); 
      SqlCommand cmd = new SqlCommand(sql, con); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      SqlDataReader dr = cmd.ExecuteReader(); 

      DataTable dt = new DataTable(); 


      while (dr.Read()) 
      { 
       PRAESENZZEIT pra = new PRAESENZZEIT(); 
       pra.ZPZ_Von = Convert.ToDateTime(dr["ZPZ_Von"]); 
       pra.ZPZ_Bis = Convert.ToDateTime(dr["ZPZ_bis"]); 
       listid.Add(pra); 

       DateTime kommen = DateTime.Now; 

       kommen = pra.ZPZ_Von; 
       if (pra.ZPZ_Von.TimeOfDay < new TimeSpan(8, 5, 0)) 
        pra.ZPZ_Von = new DateTime(pra.ZPZ_Von.Year, pra.ZPZ_Von.Month, pra.ZPZ_Von.Day, 8, 0, 0); 

       DateTime gehen = DateTime.Now; 
       gehen = pra.ZPZ_Bis; 
       TimeSpan arbeitszeit = pra.ZPZ_Bis - pra.ZPZ_Von; 
      } 
      con.Close(); 

데이터베이스 쿼리 결과 :

look at the photo

+4

적 매개 변수를 전달하는 문자열을 연결하지 마십시오. 매개 변수가있는 쿼리를 사용하십시오. 귀하의 접근 방식은 SQL 주입이나 느린/잘못된 쿼리를 일으킬 수 있습니다. –

+0

'PRAESENZZEIT pra = new PRAESENZZEIT();''while' 루프 안에 있어야합니다. –

+0

@BALAgurunathanMarimuthu 어디 있을까요? PRAESENZZEIT pra = new PRAESENZZEIT(); 내부에있을 필요가 – dejanm

답변

1

pra 클래스를 while 루프 외부에서 초기화하려고했습니다. 매번 listid 목록에 새 레코드를 추가하지 않는 경우 DataRowDataReader에서 읽습니다.

이 아래 코드를 사용해보십시오 :

using (SqlConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["TestControl.Properties.Settings.DB"].ConnectionString)) 
{ 
    boAPI4.Login login = new boAPI4.Login(); 
    string cS = login.GetConnectionString(); 
    DataAccess dA = new DataAccess(cS); 
    int userID = dA.getLpeID(login.GetBoUserNr()); 
    PRAESENZZEIT q = new PRAESENZZEIT(); 

    q.ZPZ_LPE_ID = userID; 
    if (db.State == ConnectionState.Closed) 
     db.Open(); 
    string query = "SELECT per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum, SUM (zei.ZPZ_Std100) AS ZPZ_Std100" + 
        " FROM DB.dbo.Z_PRAESENZZEIT zei INNER JOIN DB.dbo.A_PERSONAL per ON zei.ZPZ_LPE_ID = per.LPE_ID" + 
        $" WHERE zei.ZPZ_Datum BETWEEN '{dtFromDate.Value}' AND '{dtToDate.Value}' AND zei.ZPZ_LPE_ID='{userID.ToString()}' GROUP BY per.LPE_Nr, zei.ZPZ_LPE_ID, zei.ZPZ_Datum ORDER BY zei.ZPZ_Datum, per.LPE_Nr;"; 

    pRAESENZZEITBindingSource.DataSource = db.Query<PRAESENZZEIT>(query, commandType: CommandType.Text); 

    List<PRAESENZZEIT> listid = new List<PRAESENZZEIT>(); 
    //PRAESENZZEIT pra = new PRAESENZZEIT(); //Needs to be inside the while loop. 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["TestControl.Properties.Settings.DB"].ConnectionString); 
    string sql = "SELECT ZPZ_Von,ZPZ_bis FROM DB.dbo.Z_PRAESENZZEIT WHERE ZPZ_LPE_ID='196'"; 
    con.Open(); 
    SqlCommand cmd = new SqlCommand(sql, con); 
    SqlDataAdapter da = new SqlDataAdapter(cmd); 
    DataTable dt = new DataTable(); 
    da.Fill(dt); 

    var listid = ConvertDataTable<PRAESENZZEIT>(dt); 

    dataGridView1.DataSource = listid; 
    con.Close(); 
} 

private static List<T> ConvertDataTable<T>(DataTable dt) 
{ 
    List<T> data = newList<T>(); 
    foreach (DataRowrow in dt.Rows) 
    { 
     Titem = GetItem<T>(row); 
     data.Add(item); 
    } 
    return data; 
} 

private static TGetItem<T>(DataRow dr) 
{ 
    Type temp = typeof(T); 
    T obj =Activator.CreateInstance<T>(); 
    foreach (DataColumncolumn in dr.Table.Columns) 
    { 
     foreach (PropertyInfopro in temp.GetProperties()) 
     { 
     if (pro.Name == column.ColumnName) 
     pro.SetValue(obj,dr[column.ColumnName], null); 
     else 
     continue; 
     } 
    } 
    return obj; 
} 
+0

에 대한 질문을 던졌습니다. https://i.stack.imgur.com/MMmmI.png – dejanm

+0

오류로 인해 출구로 빠져 나갑니다. 위의 그림에서 ..하지만 내가 루프를 훑어 보았을 때, 그것은 정상적으로 작동합니다 ..하지만 나는이 시간을 거치고 내가 쓴 것을 다시 돌려주고 싶습니다. – dejanm

+0

'DataReader' 대신'DataTable'에 데이터를 가져 와서 원하는대로'Generic List'로 변환하십시오. –

관련 문제