2016-04-08 2 views
0

Впервые на StackOverflow и очень много с # начинающимSqlDataReader не читает все строки, кроме первой

В настоящее время создания формы, которая производит гистограмму из данных, хранящихся в базе данных. Выбранная запись идентифицируется идентификатором PID (идентификатор пациента) и tdate (дата тестирования). Эти значения определяются двумя комбинированными полями, которые пользователь может выбрать из них. Проблема, с которой я столкнулась, заключается в том, что только первая и последняя записи, хранящиеся в базе данных, заполняют барьер.

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); 


} 

     } 

Вот рис данных: Test_results_table

здесь ПИК интерфейс с первой записи работы: interface

Я знаю, это что-то делать с читателем но не может решить, как правильно функционировать

Любая помощь очень ценится

+0

Вы читаете в цикле все возвращаемые значения, затем выходите из цикла и используете только последнее значение для установки своих очков. Я думаю, что вы должны переместить настройки точки внутри цикла – Steve

+0

Все даты в вашем наборе данных уникальны, поэтому вы получите только одну строку с запросом, который у вас есть. Вы также открыты для SQL-инъекции FYI. – ElGavilan

ответ

0

Вы читаете в цикле все возвращаемые значения, затем выходите из цикла и используете только последнее значение для установки ваших очков. Вы должны переместить настройки точки в петлю

.... 
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(); 

Обратите внимание, что ваш запрос построен с использованием конкатенации строк. Это хорошо известная проблема с кодом базы данных. Никогда не делать и использовать parameterized query

EDIT
Глядя на ваш комментарий ниже, я повторяю совет использовать параметризованный запрос вместо конкатенации. Не только это избежать Sql Injection взломы, но и не оставить работу, чтобы понять смысл ваших значений в базе данных двигателя

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()) 
      .... 

В этом примере я предполагаю, что переменная pID имеет целочисленный тип и переменной tDate имеет тип DateTime, соответствующий типу полей базы данных. Это не оставляет никаких сомнений в отношении движка базы данных по вашим значениям.
Конечно, если поля имеют различный тип, вам следует соответствующим образом изменить SqlDbType.

+0

Должна быть создана только одна уникальная запись, поэтому установка точек не должна быть проблемой. Я сузил его до некоторой проблемы с чтением t_date из базы данных, так как If меняю оператор select на WHERE P_ID = '"+ pID +"' AND T_LANGUAGE = '"3'" 2 результирующие строки заполняют таблицу как ожидается. –

+0

Точно такая проблема, с которой вы столкнулись при использовании конкатенации строк, а не с параметризованными запросами – Steve

+0

Я попытался использовать параметризованный запрос и все еще не работал, обнаружил, что это проблема между сохраненным форматом даты sql и C# date format, который не является то же самое, поэтому я исправил проблему сейчас. Спасибо за помощь и советы –

Смежные вопросы