2017-02-20 9 views
-1

Я пытаюсь экспортировать все мои столбцы sql (имя) из таблицы1 в txt. проблема в том, что он экспортирует только первое имя из моего sql.Экспорт каждого столбца sql в txt

Вот мой код:

string name; 
SqlCommand command = new SqlCommand("select membername from table1 ", con); 
SqlDataReader read = command.ExecuteReader(); 

while (read.Read()) 
{ 
name = (read["membername"].ToString()); 
} 
read.Close(); 

using (StreamWriter sw = new StreamWriter(@"C:\fiscal.txt")) 
{ 
sw.WriteLine("{0,-0}", name.ToString()); 
sw.Close(); 

Я думаю, что проблема где-то в моем чтении.

+1

Вы перебираете все данные, но сохраняете только последнее значение. * После того, как * цикл завершится, вы сохраните последнее значение в файле –

+0

. Догадаюсь, что вы из Греции? Спасибо за ваш ответ. Как я буду экспортировать все мои столбцы? – Dim

+0

с помощью соответствующего инструмента - SSIS или мастера экспорта. Если вы хотите создавать отчеты, правильным инструментом является SSRS. Почему вы используете для этого код на стороне клиента? –

ответ

0

Значение в имени переписывается каждый раз, когда оно проходит через цикл while. Измените свой код, чтобы можно было записать каждое значение.

string name; 
SqlCommand command = new SqlCommand("select membername from table1 ", con); 
SqlDataReader read = command.ExecuteReader(); 

using (StreamWriter sw = new StreamWriter(@"C:\fiscal.txt")) 
{ 
while (read.Read()) 
{ 
name = (read["membername"].ToString()); 
sw.WriteLine("{0,-0}", name.ToString()); 
} 
read.Close(); 
sw.Close(); 
} 
1

Вы перебираете все данные, но сохраняете последнее значение. По завершении цикла вы сохраняете последнее значение в файле. Чтобы это исправить, необходимо записать значение внутри цикла:

using(var con=new SqlConnection(connString)) 
{ 
    con.Open(); 
    var command = new SqlCommand("select membername from table1 ", con); 
    using(var read = command.ExecuteReader()) 
    using (StreamWriter sw = new StreamWriter(@"C:\fiscal.txt")) 
    { 
     while (read.Read()) 
     { 
      var name = read["membername"]); 
      sw.WriteLine("{0,-0}", name); 
     } 
    } 
} 

Вы должны использовать using блоки вместо ручного вызова Close(), чтобы гарантировать, что соединения, файлы и т.д. расположены даже если исключение.

Также обратите внимание, что вам не нужно нужно лить или конвертировать в строку во всех местах. WriteLine преобразует свое значение в строку в любом случае.

Заключительный комментарий: name объявлен и используется в самом внутреннем блоке. Он больше нигде не нужен, поэтому не должен быть объявлен за пределами этого блока.

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