Поделиться через


Запрос наборов данных в приложениях .NET Framework

Замечание

Классы DataSet и связанные классы являются устаревшими технологиями .NET Framework с начала 2000-х годов, которые позволяют приложениям работать с данными в памяти, пока приложения отключены от базы данных. Технологии особенно полезны для приложений, которые позволяют пользователям изменять данные и сохранять изменения обратно в базу данных. Хотя наборы данных являются проверенными успешными технологиями, рекомендуемый подход для новых приложений .NET заключается в использовании Entity Framework Core. Entity Framework предоставляет более естественный способ работы с табличными данными в виде объектных моделей и имеет более простой интерфейс программирования.

Чтобы найти определенные записи в наборе данных, используйте FindBy метод в DataTable, напишите собственную инструкцию foreach, чтобы выполнить цикл по коллекции строк таблицы или использовать LINQ to DataSet.

Конфиденциальность регистра набора данных

В наборе данных имена таблиц и столбцов по умолчанию не чувствительны к регистру, то есть таблица в наборе данных под именем "Клиенты" также может обозначаться как "Клиенты". Это соответствует соглашениям об именовании во многих базах данных, включая SQL Server. В SQL Server поведение по умолчанию заключается в том, что имена элементов данных нельзя различать только по регистру.

Замечание

В отличие от наборов данных, XML-документы чувствительны к регистру, поэтому имена элементов данных, определенных в схемах, чувствительны к регистру. Например, протокол схемы позволяет определить таблицу с именем Customers и другую таблицу с именем customers. Это может привести к столкновениям имен, когда схема, содержащая элементы, отличающиеся только по регистру, используется для создания класса набора данных.

Однако чувствительность к регистру может влиять на интерпретацию данных в наборе данных. Например, если в таблице набора данных вы фильтруете данные, результаты поиска могут отличаться в зависимости от того, является ли сравнение регистрозависимым. Вы можете контролировать чувствительность к регистру при фильтрации, поиске и сортировке, установив свойство CaseSensitive набора данных. Все таблицы в наборе данных наследуют значение этого свойства по умолчанию. (Это свойство можно переопределить для каждой отдельной таблицы, задав свойство таблицы CaseSensitive .)

Поиск определенной строки в таблице данных

Поиск строки в типизированном наборе данных со значением первичного ключа

  • Чтобы найти строку, вызовите строго типизированный FindBy метод, использующий первичный ключ таблицы.

    В следующем примере CustomerID столбец является первичным ключом Customers таблицы. Это означает, что созданный FindBy метод имеет значение FindByCustomerID. В примере показано, как назначить определенную DataRow переменную с помощью созданного FindBy метода.

    NorthwindDataSet.CustomersRow customersRow = 
        northwindDataSet1.Customers.FindByCustomerID("ALFKI");
    

Поиск строки в нетипизированном наборе данных со значением первичного ключа

  • Вызовите метод Find коллекции DataRowCollection, передав первичный ключ в качестве параметра.

    В следующем примере показано, как объявить новую строку с именем foundRow и назначить ее возвращаемое значение Find метода. Если первичный ключ найден, содержимое индекса столбца 1 отображается в окне сообщения.

    string s = "primaryKeyValue";
    DataRow foundRow = dataSet1.Tables["AnyTable"].Rows.Find(s);
    
    if (foundRow != null) 
    {
        MessageBox.Show(foundRow[0].ToString());
    }
    else
    {
        MessageBox.Show("A row with the primary key of " + s + " could not be found");
    }
    

Поиск строк по значениям столбцов

Поиск строк на основе значений в любом столбце

  • Таблицы данных создаются методом Select, который возвращает массив DataRow, основанный на выражении, переданном методу Select. Дополнительные сведения о создании допустимых выражений см. в разделе "Синтаксис выражений" страницы о свойстве Expression .

    В следующем примере показано, как использовать метод SelectDataTable, чтобы найти определенные строки.

    DataRow[] foundRows;
    foundRows = dataSet1.Tables["Customers"].Select("CompanyName Like 'A%'");
    

Если таблицы в наборе данных связаны, DataRelation объект может сделать связанные записи доступными в другой таблице. Например, набор данных, Customers содержащий и Orders таблицы, можно сделать доступным.

Вы можете использовать объект DataRelation для поиска связанных записей, вызывая метод GetChildRows в родительской таблице DataRow. Этот метод возвращает массив связанных дочерних записей. Или можно вызвать метод GetParentRow объекта DataRow дочерней таблицы. Этот метод возвращает один DataRow из родительской таблицы.

На этой странице приведены примеры использования типизированных наборов данных. Сведения о навигации по связям в нетипизированных наборах данных см. в разделе Навигация по даннымRelations.

Замечание

Если вы работаете в приложении Windows Forms и используете функции привязки данных для отображения данных, созданная конструктором форма может обеспечить достаточно возможностей для приложения. Дополнительные сведения см. в разделе "Привязка элементов управления к данным" в Visual Studio. В частности, см. статью "Связи" в наборах данных.

В следующих примерах кода показано, как перемещаться по связям вверх и вниз в типизированных наборах данных. В примерах кода используются типизированные DataRow(NorthwindDataSet.OrdersRow) и созданные методы FindByPrimaryKey (FindByCustomerID) для поиска требуемой строки и возврата связанных записей. Примеры компилируются и выполняются правильно, только если у вас есть:

  • Экземпляр набора данных с именем NorthwindDataSet, содержащий таблицу Customers.

  • Таблица Orders .

  • Связь под названием FK_Orders_Customers, связывающая две таблицы.

Для того чтобы какие-либо записи были возвращены, обе таблицы должны быть заполнены данными.

Для возврата дочерних записей выбранной родительской записи

  • GetChildRows Вызовите метод определенной Customers строки данных и верните массив строк из Orders таблицы:

    string custID = "ALFKI";
    NorthwindDataSet.OrdersRow[] orders;
    
    orders = (NorthwindDataSet.OrdersRow[])northwindDataSet.Customers.
        FindByCustomerID(custID).GetChildRows("FK_Orders_Customers");
    
    MessageBox.Show(orders.Length.ToString());
    

Чтобы вернуть родительскую запись для выбранной дочерней записи

  • GetParentRow Вызовите метод определенной Orders строки данных и верните одну строку из Customers таблицы:

    int orderID = 10707;
    NorthwindDataSet.CustomersRow customer;
    
    customer = (NorthwindDataSet.CustomersRow)northwindDataSet.Orders.
        FindByOrderID(orderID).GetParentRow("FK_Orders_Customers");
    
    MessageBox.Show(customer.CompanyName);
    
  • инструменты работы с наборами данных в Visual Studio