2016-10-17 2 views
1

Что-то не хватает кода (я думаю). Я хочу показать идентификатор и имя студента в списке. Но я вижу это:Как распечатать 2 столбца из базы данных SQL Server

enter image description here

Я не могу понять проблемы, особенно с внутренним соединением.

private void button1_Click(object sender, EventArgs e) 
{ 
    string strName = ""; 

    connect.Open(); 
    SqlCommand command = new SqlCommand(" Select Student_tbl.StudentName, Student_tbl.StudentID, Module_tbl.ModuleID FROM[Course-Student] INNER JOIN Student_tbl ON [Course-Student].SID = Student_tbl.StudentID INNER JOIN Module_tbl ON[Course-Student].CID = Module_tbl.ModuleID WHERE(Module_tbl.ModuleID = '" + tbCourse.Text+"')",connect); 

    command.ExecuteNonQuery(); 

    SqlDataReader reader = command.ExecuteReader(); 

    while (reader.Read()) 
    { 
     strName = reader[1].ToString(); 
     listBox1.Items.Add(strName); 
    } 

    connect.Close(); 
} 
+2

Не выполняйте свой запрос дважды - сначала с помощью команды 'command.ExecuteNonQuery()' (здесь это абсолютно бесполезно *, поскольку вы не вставляете и не удаляете что-либо), а затем второй раз с '.ExecuteReader()'. Вызовите ** только **, что действительно необходимо - здесь: 'ExecuteReader()', поскольку вы возвращаете набор результатов, который хотите перебрать. –

+0

спасибо .. очень полезно :) –

ответ

2

Вы печатаете из считывателя только поле StudentID. Измените while петлю следующим образом, чтобы получить оба поля и сцепить значения:

while (reader.Read()) 
{ 
    var name = reader[0].ToString(); 
    var id = reader[1].ToString(); 
    listBox1.Items.Add(id + " " + name); 
} 

Вы можете также использовать String Interpolation (который является C# 6 синтаксический сахар для string.Format), как это:

while (reader.Read()) 
{ 
    listBox1.Items.Add($"{reader[1].ToString()} {reader[0].ToString()}"); 
} 

Кроме того, как для оператора sql: не используйте конкатенацию строк для создания инструкции. Это восприимчиво для SQL-инъекций. Вместо этого используйте Parameterized Queries

+0

приятный .. очень полезный. Сэр, как удалить данные повторения? например MOD3 - он отображает все списки, которые я хочу, но если я попытался выполнить поиск MOD2, список из MOD3 не был очищен или удален. Я сделал некоторые исследования, но я действительно не понимаю код. Я создаю также кнопку очистки. private void button2_Click (отправитель объекта, EventArgs e) // CLear BUtton { listBox1.Items.Clear(); } –

+0

@madhiahmahmod - это следующий вопрос, и его следует задать в отдельном вопросе. Если вы работаете с коллекциями, то 'Distinct()' linq - это хорошая вещь для использования. –

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