2015-06-03 2 views
1

Я застрял в подключении SQL и запустить простой запрос на выборку, мне нужно выводить select * from ServerInfo where ServerID = 1991638835" либо консольной линии или текстовый файл:C# SQL Select Query только дамп один столбец

Это мой код:

using System; 
using System.Collections.Generic; 
using System.Data.SqlClient; 
using System.Diagnostics; 
using System.Text; 

namespace ConnectingToSQLC 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SqlConnection conn = new SqlConnection("server= XXXXX; database = ES1Archive; Integrated Security=false; User ID = sa; Password=XXXXXX"); 
      conn.Open(); 
      SqlCommand cmd = new SqlCommand("select * from ServerInfo where ServerID = 1991638835", conn); 

      SqlDataReader reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
      //Console.WriteLine ("{1}", "{0}", reader.GetString (0), reader.GetString (1)); 
       Console.WriteLine(reader.GetString(3)); 
      } 
      reader.Close(); 
      conn.Close(); 

      if (Debugger.IsAttached) 
      { 
       Console.ReadLine(); 
      } 

     } 
    } 
} 

Работает нормально. Но если я изменился на Console.WriteLine ("{1}", "{3}", reader.GetString (1), reader.GetString (3)); У меня всегда есть столбец 2. В общей сложности есть 7 столбцов, а столбец 3 пуст, а столбец 4 - XML.

Как я могу изменить свой код, чтобы свалить все?

+0

Какой формат таблицы? – Liam

+0

Строка и XML. – user2655495

ответ

3

У вас слишком много строк форматирования - объединить их в один, например:

Console.WriteLine ("{0} - {1}", reader.GetString(1), reader.GetString(3)) 

Индексы в строку форматирования в Console.WriteLineoverload you are using, как string.Format - это не зависит от которые указатели, которые вы используете в читателе, заполнители форматов должны просто соответствовать порядку других параметров params args.

также:

  • Это плохая практика, чтобы использовать SELECT * в целом, и даже более опасные, когда вы обращаетесь к читателю данные столбцов по порядковому индексу, как изменение в таблице сломается ваш код читателя. Предложите вместо этого, что вы явно указываете используемые столбцы и/или используете аксессуар имени столбца для reader
  • Если единственное использование для чтения - для вывода строки на Console.WriteLine, вам не нужно использовать перегрузку Get<Type>() - вы можете просто использовать порядковый аксессуар (после того, как вы гарантировали порядок столбцов с явным именем столбца SELECT :-)

например, для чтения колонн 1, 3 и 6 (Ноль на основе конечно):

Console.WriteLine ("{0} - {1} - {2}", reader[1], reader[3], reader[6]); 

Но все-таки лучше:

Console.WriteLine ("{0} - {1} - {2}", reader["RealNameOfCol1"], 
             reader["RealNameOfCol3"], reader["RealNameOfCol6"]); 
0

Вы можете сделать это в цикле с интерфейсом IDataRecord:

class Program 
{ 
    static void Main(string[] args) 
    { 
     SqlConnection conn = new SqlConnection("server= XXXXX; database = ES1Archive; Integrated Security=false; User ID = sa; Password=XXXXXX"); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand("select * from ServerInfo where ServerID = 1991638835", conn); 

     SqlDataReader reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
      for(int i = 0; i<reader.FieldCount;i++) 
      { 
       Console.WriteLine(reader[i]); 
      } 
     } 
     reader.Close(); 
     conn.Close(); 

     if (Debugger.IsAttached) 
     { 
      Console.ReadLine(); 
     } 

} 
} 
+0

Вам не нужно указывать 'IDataRecord', чтобы использовать' FieldCount' и индексатор. – juharr

+0

Да, пропустил это. – fsacer

+0

Да, сейчас он работает. Благодарю. – user2655495