Fill(DataSet)

Метод загружает данные из источника данных в объект DataSet.

Метод Fill получает данные из источника данных с использованием оператора SELECT. Объект IDbConnection, связанный с командой SELECT, должен быть допустимым, но открывать его не требуется. Если интерфейс IDbConnection был закрыт до вызова метода Fill, он автоматически открывается для извлечения данных, а затем закрывается. Если подключение было открыто до вызова метода Fill, оно остается открытым.

Если во время заполнения таблицы данными происходит ошибка или исключение, то дальнейшее заполнение таблицы прекращается (при этом ранее загруженные данные остаются в таблице).

Если команда не возвращает строк, в объект DataSet никакая таблица не добавляется и исключение не происходит.

Если объект DbDataAdapter обнаруживает дублированные столбцы при заполнении объекта DataTable, он создает имена для последующих столбцов, используя шаблон «имя столбца»1, «имя столбца»2, «имя столбца»3 и т.д. Если входные данные содержат неименованные столбцы, они помещаются в объект DataSet в соответствии с шаблоном «столбец1», «столбец2» и т.д.

Если запрос возвращает несколько результатов, то набор результатов для каждого запроса, возвращающего строку, помещается в отдельную таблицу. Дополнительным наборам результатов присваиваются имена с добавлением целого числа к заданному имени таблицы, например «таблица»1, «таблица»2 и т.д. Так как для запросов, не возвращающих строк, таблица не создается, то в случаях, когда обрабатывается запрос INSERT, а затем запрос SELECT, таблица, созданная для запроса SELECT, будет иметь имя «таблица», поскольку это первая созданная таблица. Приложения, использующие имена столбцов и таблиц, должны обеспечивать отсутствие конфликтов шаблонов именования.

Когда оператор SELECT, используемый для заполнения объекта DataSet, возвращает несколько результатов, например, пакетные операторы SQL, то, если один из результатов содержит ошибку, все последующие результаты пропускаются и не добавляются в объект DataSet.

При использовании последующих вызовов метода Fill для обновления содержимого объекта DataSet должны быть соблюдены два условия:

  1. оператор SQL должен соответствовать инструкции, первоначально использованной для заполнения объекта DataSet;

  2. должны быть представлены сведения о столбце Key.

Если имеются данные первичного ключа, любые дублирующие строки согласовываются и отображаются только один раз в объекте DataTable, который соответствует объекту DataSet. Данные первичного ключа можно задать либо с помощью метода FillSchema, указав свойство PrimaryKey объекта DataTable, либо задав для свойства MissingSchemaAction значение AddWithKey.

Если свойство SelectCommand возвращает результаты соединения таблиц (OUTER JOIN), то объект DataAdapter не устанавливает значение свойства PrimaryKey для результирующего объекта DataTable. Необходимо явно определить первичный ключ, чтобы убедиться в том, что обработка дубликатов строк выполняется правильно.

Примечание

При обработке пакетных SQL-операторов, возвращающих несколько результатов, метод FillSchema ADO.NET-провайдера СУБД ЛИНТЕР получает сведения схемы только для первого результата. Чтобы извлечь информацию схемы для остальных результатов, необходимо использовать метод Fill со значением AddWithKey свойства MissingSchemaAction.

Синтаксис
public override int Fill( DataSet dataSet);

dataSet – объект DataSet, который должен быть заполнен данными и, при необходимости, метаданными (схемой данных).

Возвращаемое значение

Количество строк, реально добавленных или обновленных в объекте DataSet.

Исключения
LinterSqlException Код завершения СУБД ЛИНТЕР не равен 0.
Примеры

1) Код, показанный в данном примере, не открывает и не закрывает Connection явным образом. Если соединение еще не открыто, то метод Fill неявно открывает Connection, которое используется DataAdapter. Если операция Fill открыла соединение, она также закрывает его при завершении Fill. Это позволяет упростить код при использовании отдельной операции, такой, как Fill или Update. Однако при выполнении нескольких операций, требующих открытого соединения, можно повысить производительность приложения путем явного вызова метода Open объекта Connection, выполнения операций с источником данных и последующего вызова метода Close объекта Connection. Необходимо сохранять соединения с источником данных лишь на такое короткое время, насколько это возможно, освобождая ресурсы для использования другими клиентскими приложениями.

// C#
using System;
using System.Data;
using System.Data.Common;

class FillDataSetSample
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    // Создание объекта DbDataAdapter
    DbDataAdapter adapter = factory.CreateDataAdapter();
    adapter.SelectCommand = factory.CreateCommand();
    adapter.SelectCommand.Connection = con;
    adapter.SelectCommand.CommandText =
      "select personid, model from auto";
    // Создание объекта DataSet
    DataSet dataset = new DataSet();
    // Заполнение объекта DataSet данными из таблицы БД
    adapter.Fill(dataset);
    // Отображение полученных данных
    foreach (DataTable table in dataset.Tables)
    {
      Console.WriteLine("Имя таблицы: " + table.TableName);
      Console.WriteLine("Строки таблицы:");
      foreach (DataRow row in table.Rows)
      {
        foreach (DataColumn column in table.Columns)
        {
          Console.Write("{0} | ", row[column.ColumnName]);
        }
        Console.WriteLine();
      }
    }
  }
}

Каждый объект DataSet содержит коллекцию из одного или более объектов DataTable. Каждый объект DataTable соответствует одной таблице. С помощью свойства SelectCommand, в котором содержится операция соединения, можно производить выборку из нескольких таблиц БД в один объект DataTable. При необходимости обновить содержимое множественных таблиц, достаточно определить лишь команду обновления, так как информация о связях между таблицами БД уже известна.

В этом примере DataSet содержит один объект DataTable, представляющий таблицу Motorist («Автовладельцы»).

// C#
using System;
using System.Data;
using System.Data.Common;

class FillDataSetSample
{
  static void Main()
  {
    // Создание фабрики классов провайдера
    DbProviderFactory factory =
      DbProviderFactories.GetFactory("System.Data.LinterClient");
    // Соединение с БД
    DbConnection con = factory.CreateConnection();
    con.ConnectionString =
      "Data Source=LOCAL;User ID=SYSTEM;Password=MANAGER8";
    // Создание объекта DbDataAdapter
    DbDataAdapter adapter = factory.CreateDataAdapter();
    adapter.SelectCommand = factory.CreateCommand();
    adapter.SelectCommand.Connection = con;
    adapter.SelectCommand.CommandText =
      "select auto.personid, auto.model, auto.color, person.city " +
      "from auto, person " +
      "where auto.personid=person.personid and year=70 limit 50,10";
    // Создание объекта DataSet
    DataSet dataset = new DataSet();
    // Заполнение объекта DataSet данными из таблицы БД
    adapter.Fill(dataset, "Motorist");
    // Отображение полученных данных
    foreach (DataTable table in dataset.Tables)
    {
      Console.WriteLine("Имя таблицы: " + table.TableName);
      Console.WriteLine("Строки таблицы:");
      foreach (DataRow row in table.Rows)
      {
        foreach (DataColumn column in table.Columns)
        {
          Console.Write("{0} | ", row[column.ColumnName]);
        }
        Console.WriteLine();
      }
    }
  }
}