2016-04-08 12 views
0

New lesen zu Stackoverflow und sehr viel ein C# AnfängerSqlDataReader keine Zeile abgesehen von erstem

Zeit eine Form zu schaffen, die in einer Datenbank gespeichert, um ein Balkendiagramm aus Daten erzeugt. Der gewählte Datensatz wird durch pID (Patienten-ID) und tdate (Testdatum) identifiziert. Diese Werte werden durch 2 Kombinationsfelder bestimmt, aus denen der Benutzer auswählen kann. Das Problem besteht darin, dass nur die ersten und letzten Datensätze in der Datenbank das Balkendiagramm füllen.

if (radioButtonTestResult.Checked) 
{ 
foreach (var series in TestResultBarChart.Series) 
{ 
series.Points.Clear(); 
} 
string tdate = comboBox2.Text; 
using (SqlConnection connection = new SqlConnection(@"Data Source=    (LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\MMSEDB.mdf;Integrated Security=True")) 
{ 
connection.Open(); 
string sql = "SELECT   T_CLOCK_SCORE,T_LANGUAGE_SCORE,T_RECALL_SCORE,T_REGISTRATION_SCORE,T_ORIENTATION _SCORE,T_TIME FROM TEST_RESULTS WHERE P_ID='" + pID + "' AND T_DATE='"+ tdate +"'"; 
using(SqlCommand command = new SqlCommand(sql, connection)) 
{ 
command.CommandTimeout = 3600;    
using (SqlDataReader reader =  command.ExecuteReader(CommandBehavior.SequentialAccess)) 
    { 
while (reader.Read()) 
     { 
       MessageBox.Show("hello4"); 
       String clockScoreString = reader["T_CLOCK_SCORE"].ToString(); 
       MessageBox.Show(clockScoreString); 
       clockScore = Int32.Parse(clockScoreString); 
       String langScoreString = reader["T_LANGUAGE_SCORE"].ToString(); 
       langScore = Int32.Parse(langScoreString); 
       String recallScoreString = reader["T_RECALL_SCORE"].ToString(); 
       recallScore = Int32.Parse(recallScoreString); 
       String regScoreString = reader["T_REGISTRATION_SCORE"].ToString(); 
       regScore = Int32.Parse(regScoreString); 
       String orientScoreString = reader["T_ORIENTATION_SCORE"].ToString(); 
       orientScore = Int32.Parse(orientScoreString); 
       String timeScoreString = reader["T_TIME"].ToString(); 
       timeScore = Int32.Parse(timeScoreString); 
     } 
     reader.Close(); 
    } 
} 


this.TestResultBarChart.Series["Series1"].Points.AddXY("Clock Score", clockScore); 
this.TestResultBarChart.Series["Series1"].Points.AddXY("Language Score",  langScore); 
this.TestResultBarChart.Series["Series1"].Points.AddXY("Recall Score", recallScore); 
this.TestResultBarChart.Series["Series1"].Points.AddXY("Registration Score", regScore); 
this.TestResultBarChart.Series["Series1"].Points.AddXY("Orientation Score", orientScore); 


} 

     } 

Hier ist ein Bild der Daten: Test_results_table

hier ist ein Bild von der Schnittstelle mit dem ersten Datensatz Arbeits: interface

Ich weiß, das etwas mit dem Leser zu tun hat aber kann nicht herausfinden, wie man richtig funktioniert

Jede Hilfe wird sehr geschätzt

+0

Sie lesen alle zurückgegebenen Werte in einer Schleife, verlassen dann die Schleife und verwenden nur den letzten Wert, um Ihre Punkte festzulegen. Ich denke, Sie sollten die Punkteinstellungen innerhalb der Schleife bewegen – Steve

+0

Alle Daten in Ihrem Datensatz sind einzigartig, so dass Sie nur eine Zeile mit der Abfrage erhalten, die Sie haben. Sie sind auch offen für SQL Injection FYI. – ElGavilan

Antwort

0

Sie lesen alle zurückgegebenen Werte in einer Schleife, verlassen dann die Schleife und verwenden nur den letzten Wert, um Ihre Punkte zu setzen. Sie sollten die Punkteinstellungen innerhalb der Schleife verschieben

.... 
while (reader.Read()) 
{ 
    clockScore = Convert.ToInt32(reader["T_CLOCK_SCORE"]); 
    langScore = Convert.ToInt32(reader["T_LANGUAGE_SCORE"]); 
    recallScore = Convert.ToInt32(reader["T_RECALL_SCORE"]); 
    regScore = Convert.ToInt32(reader["T_REGISTRATION_SCORE"]); 
    orientScore = Convert.ToInt32(reader["T_ORIENTATION_SCORE"]); 
    timeScore = Convert.ToInt32(reader["T_TIME"]); 
    this.TestResultBarChart.Series["Series1"].Points.AddXY("Clock Score", clockScore); 
    this.TestResultBarChart.Series["Series1"].Points.AddXY("Language Score",  langScore); 
    this.TestResultBarChart.Series["Series1"].Points.AddXY("Recall Score", recallScore); 
    this.TestResultBarChart.Series["Series1"].Points.AddXY("Registration Score", regScore); 
    this.TestResultBarChart.Series["Series1"].Points.AddXY("Orientation Score", orientScore);    
} 
reader.Close(); 

Beachten Sie, dass Ihre Abfrage mit String-Verkettung erstellt wird. Dies ist ein bekanntes Problem mit Datenbankcode. Nie es tun, und verwenden Sie einen parameterized query

EDIT
unten an Ihrem Kommentar Sehen, wiederhole ich den Rat eine parametrisierte Abfrage verwenden statt String-Verkettung. Nicht nur der SQL-Injection Hacks vermeiden, sondern auch verlassen Sie den Job nicht die Bedeutung Ihrer Werte in dem Datenbank-Engine zu verstehen

DateTime tDate = Convert.ToDateTime(comboBox2.Text); 
...... 
string sql = @"SELECT 
        T_CLOCK_SCORE,T_LANGUAGE_SCORE,T_RECALL_SCORE, 
        T_REGISTRATION_SCORE,T_ORIENTATION_SCORE,T_TIME 
       FROM TEST_RESULTS 
       WHERE [email protected] AND [email protected]"; 

using(SqlCommand command = new SqlCommand(sql, connection)) 
{ 
    command.Parameters.Add("@id", SqlDbType.Int).Value = pID; 
    command.Parameters.Add("@date", SqlDbType.Date).Value = tdate; 
    command.CommandTimeout = 3600;    
    using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess)) 
    { 
      while (reader.Read()) 
      .... 

In diesem Beispiel nehme ich an, dass die Variable pID vom Typ integer ist und die Variable tDate entspricht vom Typ DateTime dem Typ der Datenbankfelder. Dies lässt keinen Zweifel an der Datenbank-Engine auf Ihren Werten.
Natürlich, wenn die Felder von einem anderen Typ sind, sollten Sie den SqlDbType entsprechend ändern.

+0

Es sollte nur ein eindeutiger Datensatz angezeigt werden, daher sollte das Festlegen der Punkte nicht das Problem sein. Ich habe es auf ein Problem beim Lesen von t_date aus der Datenbank eingegrenzt, als Wenn ich die SELECT-Anweisung in WHERE P_ID = '"+ pID +"' UND T_LANGUAGE = '"3'" ändern, bevölkern die 2 resultierenden Zeilen die Tabelle als erwartet. –

+0

Genau die Art von Problem, das Sie bei der Verwendung von String-Verkettung statt parametrisierten Abfragen auftreten – Steve

+0

Ich habe versucht, mit einer parametrisierten Abfrage und es immer noch nicht funktioniert, entdeckt, dass es ein Problem zwischen dem gespeicherten SQL-Datumsformat und C# Datum Format nicht sein Das selbe, also habe ich das Problem jetzt behoben. Vielen Dank für Ihre Hilfe und Beratung –

Verwandte Themen