2017-12-19 3 views
1

Kann mir jemand zeigen, wo ich einen Fehler mache, ich möchte eine neue SQL-Abfrage setzen, wo ich die Daten aus der Datenbank lesen und sie in meine Funktion einfügen, und am Ende sie wird in dem Doppelpunkt („Stunden“), die derzeit auf der ersten Abfrage der Ausfahrt I das sieht SUM (zei.ZPZ_Std100) AS ZPZ_Std100Lesen von Datenbankdaten und Weiterleiten an Variablen

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; 

     } 

derzeit in der Schaltfläche wie mein gesamte Code erscheint am Ausgang angezeigt, bei 0 erhalten.

enter image description here

Also, ich Daten benötigen, die

Dies ist durch die Datetime-Variable übergeben, wie es durch die Variablen geht aber gibt das Ergebnis als wenn es nicht Basisdaten haben adressieren, was ist das Problem? Ich verstehe, wenn es die Zeit [ZPZ_VON 7.45], dass der Ausgang sollte 08.00 Uhr sein ..

SQL QUERYSELECT ZPZ_Von, ZPZ_bis VON DB.dbo.Z_PRAESENZZEIT WHERE 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(); 

DATABASE QUERY ERGEBNIS:

look at the photo

+4

Nie Strings verketten Parameter zu übergeben. Verwenden Sie parametrisierte Abfragen. Ihr Ansatz kann SQL-Injection oder langsame/falsche Abfragen verursachen. –

+0

'PRAESENZZEIT pra = new PRAESENZZEIT();' muss innerhalb 'while' sein loop –

+0

@BALAgurunathanMarimuthu wo wäre PRAESENZZEIT pra = new PRAESENZZEIT(); muss innen sein – dejanm

Antwort

1

Sie initialisierten die pra Klasse außerhalb der while Schleife. Das fügt keinen neuen Datensatz in der Liste hinzu jedes Mal gelesen DataRow von DataReader.

diesen Code unten Versuchen:

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

jetzt bekomme ich einen Fehler https://i.stack.imgur.com/MMmmI.png – dejanm

+0

wirft es mich wieder am Ausgang, als im Bild oben .. aber wenn ich die Schleife überfliege, funktioniert es normal zu mir .. aber ich will, dass es durch diese Zeit geht und mir zurück gibt, was ich niedergelegt habe. – dejanm

+0

Statt 'DataReader' versuchen Sie, die Daten nach' DataTable' zu ​​konvertieren und sie in 'Generic List' umzuwandeln, wie Sie wollen. –

Verwandte Themen