Подтвердить что ты не робот

Как извлечь данные из 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 в форму, значимую для использования?

4b9b3361

Ответ 1

В 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();
 }

Марк

Ответ 2

Вы можете установить 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();
}

Ответ 3

Пожалуйста, подумайте о том, как использовать следующий код:

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

Ответ 4

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

Colin G

Ответ 5

Самый простой способ извлечь данные из DataTable, когда у вас есть несколько типов данных (не только строк), это использовать метод расширения Field<T>, доступный в сборке System.Data.DataSetExtensions.

var id = row.Field<int>("ID");         // extract and parse int
var name = row.Field<string>("Name");  // extract string

Из MSDN, метод Field<T>:

Предоставляет строго типизированный доступ к каждому из значений столбца в DataRow.

Это означает, что при указании типа он будет проверять и распаковывать объект.

Например:

// iterate over the rows of the datatable
foreach (var row in table.AsEnumerable())  // AsEnumerable() returns IEnumerable<DataRow>
{
    var id = row.Field<int>("ID");                           // int
    var name = row.Field<string>("Name");                    // string
    var orderValue = row.Field<decimal>("OrderValue");       // decimal
    var interestRate = row.Field<double>("InterestRate");    // double
    var isActive = row.Field<bool>("Active");                // bool
    var orderDate = row.Field<DateTime>("OrderDate");        // DateTime
}

Он также поддерживает обнуляемые типы:

DateTime? date = row.Field<DateTime?>("DateColumn");

Это может упростить извлечение данных из DataTable, поскольку устраняет необходимость явного преобразования или анализа объекта в правильные типы.

Ответ 6

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

Ответ 7

Обратите внимание, что при использовании 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 открыл соединение, он также закрывает соединение когда Fill закончен. Это может упростить ваш код, когда вы имеете дело с одну операцию, такую ​​как заполнение или обновление. Однако, если вы выполняя несколько операций, требующих открытого подключения, вы может улучшить производительность вашего приложения, явно вызвав Открытый метод соединения, выполняющий операции против источника данных, а затем вызов метода Close для соединения. Вы должны попытаться сохранить связь с источником данных открытым как кратко чтобы освободить ресурсы для использования другими клиентскими приложениями.