Как извлечь данные из DataTable?


у меня есть DataTable это заполняется из SQL-запроса в локальную базу данных, но я не знаю, как извлечь из нее данные. Основной метод (в тестовой программе):

static void Main(string[] args)
{
    const string connectionString = "server=localhost\SQLExpress;database=master;integrated Security=SSPI;";
    DataTable table = new DataTable("allPrograms");

    using (var conn = new SqlConnection(connectionString))
    {
        Console.WriteLine("connection created successfuly");

        string command = "SELECT * FROM Programs";

        using (var cmd = new SqlCommand(command, conn))
        {
            Console.WriteLine("command created successfuly");

            SqlDataAdapter adapt = new SqlDataAdapter(cmd);

            conn.Open(); 
            Console.WriteLine("connection opened successfuly");
            adapt.Fill(table);
            conn.Close();
            Console.WriteLine("connection closed successfuly");
        }
    }

    Console.Read();
}

команду я использовал для создания таблиц в моей базе данных:

create table programs
(
    progid int primary key identity(1,1),
    name nvarchar(255),
    description nvarchar(500),
    iconFile nvarchar(255),
    installScript nvarchar(255)
)

как я могу извлечь данные из DataTable в форму, значимую для использования?

6   51   2009-08-28 14:19:39

6 ответов:

DataTable имеет коллекцию .Rows элементов DataRow.

каждый DataRow соответствует одной строке в базе данных и содержит коллекцию столбцов.

чтобы получить доступ к одному значению, сделайте что-то вроде этого:

 foreach(DataRow row in YourDataTable.Rows)
 { 
     string name = row["name"].ToString();
     string description = row["description"].ToString();
     string icoFileName = row["iconFile"].ToString();
     string installScript = row["installScript"].ToString();
 }

Марк

вы можете установить DataTable в качестве источника данных для многих элементов.

например

gridView

репитер

datalist

и т. д.

Если вам нужно извлечь данные из каждой строки, то вы можете использовать

table.rows[rowindex][columnindex]

или

Если вы знаете имя столбца

table.rows[rowindex][columnname]

Если вам нужно повторить таблицу, то вы можете использовать цикл for или цикл foreach, например

for ( int i = 0; i < table.rows.length; i ++ )
{
    string name = table.rows[i]["columnname"].ToString();
}

foreach ( DataRow dr in table.Rows )
{
    string name = dr["columnname"].ToString();
}

пожалуйста, рассмотрите возможность использования такого кода:

SqlDataReader reader = command.ExecuteReader();
int numRows = 0;
DataTable dt = new DataTable();

dt.Load(reader);
numRows = dt.Rows.Count;

string attended_type = "";

for (int index = 0; index < numRows; index++)
{
    attended_type = dt.Rows[indice2]["columnname"].ToString();
}

reader.Close();

Если у вас нет конкретной причины делать raw ado.net я бы посмотрел на использование ORM (object relational mapper), такого как nhibernate или Linq to Sql. Таким образом, вы можете запрашивать базу данных и восстанавливать объекты, для работы с которыми строго типизированы и легче работать с IMHO.

Колин Г

  var table = Tables[0]; //get first table from Dataset
  foreach (DataRow row in table.Rows)
     {
       foreach (var item in row.ItemArray)
         {
            console.Write("Value:"+item);
         }
     }

обратите внимание, что открывать и закрывать соединение не обязательно при использовании DataAdapter.

поэтому я предлагаю обновить этот код и удалить открытые и закрытые соединения:

        SqlDataAdapter adapt = new SqlDataAdapter(cmd);

conn.Open (); / / эта строка кода не нужна

        Console.WriteLine("connection opened successfuly");
        adapt.Fill(table);

conn.Close (); / / эта строка кода не нужна

        Console.WriteLine("connection closed successfuly");

Документация

код, показанный в этом примере, явно не открывает и не закрывает Соединение. Метод Fill неявно открывает соединение, которое DataAdapter используется, если он обнаруживает, что соединение еще не установлено открыть. Если Fill открыл соединение, оно также закрывает соединение когда заполнение закончено. Это может упростить ваш код, когда вы имеете дело с одна операция, например заполнение или обновление. Однако, если вы выполнение нескольких операций, требующих открытого соединения, вы можно повысить производительность приложения путем явного вызова открытый метод соединения, выполняющий операции против источник данных, а затем вызов метода Close соединения. Вы должны попытаться сохранить соединения с источником данных открытыми как можно короче по возможности освободить ресурсы для использования другими клиентскими приложениями.