2016-03-28 5 views
0

Ich habe eine Datenbank, wo ich mehrere Zeilen speichere mit seinen Punkten, Farbe, Breite, usw. Ich weiß, dass die Punkte gespeichert werden, weil ich die SQL-Tabelle überprüft und es ist da drin. Wenn ich jedoch versuche, diese Punkte neu zu laden, wird nur die letzte Zeile geladen, die ich gespeichert habe. Ich kann nicht herausfinden, warum das so ist.kann nicht mehr als ein SQL-Zeilendaten zurückgeben # mit c

private void opendbtestToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      using (SqlConnection conn = new SqlConnection("blahblabhblah; ")) 
      { 
       conn.Open(); 
       using (SqlCommand cmd = new SqlCommand("SELECT * FROM Line", conn)) 
       { 
        using (SqlDataReader reader = cmd.ExecuteReader()) 
        { 
         while (reader.Read()) 
         { 
          Shape Line = new Line();   // New line 
          Line.readSQL(); 
          shapeList.Add(Line); 
          Invalidate(); 

         } 
        } 
       } 
       conn.Close(); 
      } 

     } 
     catch(Exception ex) 

     { 
      MessageBox.Show(ex.Message); 
     } 
     } 

die readSQL Funktion

public override void readSQL() 
    { 
     try 
     { 
      using (SqlConnection conn = new SqlConnection("blahblahblah; ")) 
      { 
       conn.Open(); 
       using (SqlCommand cmd = new SqlCommand("SELECT * FROM Line", conn)) 
       { 
        using (SqlDataReader reader = cmd.ExecuteReader()) 
        { 
         if (reader != null) 
         { 
          while (reader.Read()) 
          { 

           // string s = (reader["ID"].ToString()); 
           int x1 = Convert.ToInt32(reader["x1"]); 
           int x2 = Convert.ToInt32(reader["x2"]); 
           int y1 = Convert.ToInt32(reader["y1"]); 
           int y2 = Convert.ToInt32(reader["y2"]); 
           Pt1 = new Point(x1, y1); 
           Pt2 = new Point(x2, y2); 
           PenWidth = Convert.ToInt32(reader["Width"]); 
           PenColor = Color.FromArgb(Convert.ToInt32(reader["Color"])); 

          } 
         } 
        } 
       } 
       conn.Close(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      // MessageBox.Show(PenColor.ToString()); 
      // MessageBox.Show(PenWidth.ToString()); 
     } 
    } 

, wie ich auf die Datenbank

public override void writeSQL() 
    { 
     using (SqlConnection conn = new SqlConnection("blahblahblah ")) 
     { 
      using (SqlCommand comm = new SqlCommand()) 
      { 
       comm.Connection = conn; 
       comm.CommandType = CommandType.Text; 
       comm.CommandText = "INSERT INTO Line (x1,x2,y1,y2, Width, Color) VALUES (@val1, @val2, @val3, @val4, @val5, @val6)"; 
       comm.Parameters.AddWithValue("@val1", Pt1.X); 
       comm.Parameters.AddWithValue("@val2", Pt2.X); 
       comm.Parameters.AddWithValue("@val3", Pt1.Y); 
       comm.Parameters.AddWithValue("@val4", Pt2.Y); 
       comm.Parameters.AddWithValue("@val5", PenWidth); 
       comm.Parameters.AddWithValue("@val6", PenColor.ToArgb()); 
       try 
       { 
        conn.Open(); 
        comm.ExecuteNonQuery(); 
        MessageBox.Show("Insertion complete"); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message, "fuuuu"); 

       } 
      } 
      conn.Close(); 
     } 

    } 
+0

Erstellen Sie ein Objekt und fügen Sie es einer Sammlung hinzu – Sajeetharan

+1

Wo Pt1, Pt2 zugewiesen? Warum gibt es zwei SqlConnection/Command/Reader? –

+0

Ich habe den ursprünglichen Beitrag aktualisiert, um es ein wenig klarer zu machen. Es gibt zwei sqlconnections/command/reader, weil sie sich in verschiedenen Dateien befinden. – Vince

Antwort

0

Ich denke, schreiben Sie dies versuchen sollte. Führen Sie Ihre Abfrage aus und laden Sie alle Ihre Daten in datatable. Danach können Sie jeden Datensatz Schleife durch

0

Sende SQLDataReader an eine andere Funktion und manipulieren Daten in dieser Funktion, so etwas wie das:

public bool InitializeVariables(SqlDataReader sdr, bool isSingle = true) 
    { 
     try 
     { 
      if (sdr.HasRows) 
      { 
       if (isSingle) 
        sdr.Read(); 

       //initialize and manipulate data here. 

       return true; 
      } 
      else 
       return false; 
     } 
     catch (System.Exception ex) 
     { 
      throw ex; 
     } 
    } 
0

Basierend auf Ihren Code, ein Line ist ein einzigartiges Objekt. Sie rufen ReadSQL als nicht-statische Methode auf einer Linie Objekt, und erwarten, dass es mehr als eine Zeile zurück, aber das ist wirklich nicht sinnvoll - Ihre Methode zwei Eigenschaften auf dem aktuellen Objekt setzt, so per Definition nur Der letzte Artikel in Ihrer Sammlung wird "zurückgegeben".

Ihr Code in ReadSQL mehr Sinn macht, wenn es für eine bestimmte Id wurde die Auswahl, z.B.

using (var cmd = new SqlCommand("SELECT * FROM Line Where id = @id", conn)) 
{ 
    cmd.Parameters.Add(new SqlParameter("Id", SqlDbType.Int) { Value = id }); 
    //.... 
} 

Wenn Sie eine Ansammlung von Linien zurückzukehren, müssen Sie ein Verfahren haben (entweder als statisch auf dem Linienobjekt oder an anderer Stelle), die eine Sammlungsobjekte der Linie zurückgibt.

public static IEnumerable<Line> GetLines(int id) 
{ 
    var returnData = new List<Line>(); 
    try 
    { 
     using (var conn = new SqlConnection("blahblahblah; ")) 
     using (var cmd = new SqlCommand("SELECT * FROM Line", conn)) 
     { 
      conn.Open(); 

      using (var reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        // string s = (reader["ID"].ToString()); 
        int x1 = Convert.ToInt32(reader["x1"]); 
        int x2 = Convert.ToInt32(reader["x2"]); 
        int y1 = Convert.ToInt32(reader["y1"]); 
        int y2 = Convert.ToInt32(reader["y2"]); 

        returnData.Add(new Line() 
        { 
         Pt1 = new Point(x1, y1), 
         Pt2 = new Point(x2, y2), 
         PenWidth = Convert.ToInt32(reader["Width"]), 
         PenColor = Color.FromArgb(Convert.ToInt32(reader["Color"])) 
        }); 
       } 
      } 
      conn.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 


    return returnData; 
} 
Verwandte Themen