Типизированные и нетипизированные наборы данных
Типизированный набор данных - это набор данных, который сначала создается из базового класса DataSet, а затем использует информацию из конструктора наборов данных, которая хранится в файле .xsd, для создания нового класса набора данных со строгим типом данных. Информация из схемы (таблицы, столбцы и т. Д.) Генерируется и компилируется в этот новый класс набора данных в виде набора первоклассных объектов и свойств. Поскольку типизированный набор данных наследуется от базового класса DataSet, типизированный класс принимает на себя все функциональные возможности класса DataSet и может использоваться с методами, которые принимают экземпляр класса DataSet в качестве параметра
Нетипизированный набор данных, напротив, не имеет соответствующей встроенной схемы. Как и в типизированном наборе данных, нетипизированный набор данных содержит таблицы, столбцы и т. Д., Но они представляются только как коллекции. (Однако после создания таблиц и других элементов данных вручную в нетипизированном наборе данных вы можете экспортировать структуру набора данных в виде схемы, используя метод WriteXmlSchema набора данных.)
Контрастный доступ к данным в типизированных и нетипизированных наборах данных
Класс для типизированного набора данных имеет объектную модель, в которой его свойства принимают фактические имена таблиц и столбцов. Например, если вы работаете с типизированным набором данных, вы можете ссылаться на столбец, используя следующий код:
C # VBCopy
// This accesses the CustomerID column in the first row of the Customers table.
string customerIDValue = northwindDataSet.Customers[0].CustomerID;
J # Копировать
// This accesses the CustomerID column in the first row of the Customers table.
String customerIDValue =
northwindDataSet.get_Customers().get_Item(0).get_CustomerID();
В отличие от этого, если вы работаете с нетипизированным набором данных, эквивалентный код:
C # VBCopy
string customerIDValue = (string)
dataset1.Tables["Customers"].Rows[0]["CustomerID"];
J # Копировать
String customerIDValue = (String)
dataset1.get_Tables().get_Item("Customers").get_Rows().get_Item(0).get_Item("CustomerID");
Типизированный доступ не только легче читать, но и полностью поддерживается IntelliSense в редакторе кода Visual Studio. Помимо того, что с ним проще работать, синтаксис для типизированного набора данных обеспечивает проверку типов во время компиляции, что значительно снижает вероятность ошибок при назначении значений членам набора данных. Если вы измените имя столбца в вашем DataSet, а затем скомпилируете приложение, вы получите ошибку сборки. Дважды щелкнув ошибку сборки в списке задач, вы можете перейти непосредственно к строке или строкам кода, которые ссылаются на старое имя столбца. Доступ к таблицам и столбцам в наборе типизированных данных также немного быстрее во время выполнения, поскольку доступ определяется во время компиляции, а не через коллекции во время выполнения.
Несмотря на то, что типизированные наборы данных имеют много преимуществ, существует множество обстоятельств, при которых полезен нетипизированный набор данных. Наиболее очевидный сценарий - это когда схема недоступна для набора данных. Это может произойти, например, если ваше приложение взаимодействует с компонентом, который возвращает набор данных, но вы заранее не знаете, какова его структура. Точно так же бывают случаи, когда вы работаете с данными, которые не имеют статичной, предсказуемой структуры; в этом случае нецелесообразно использовать типизированный набор данных, поскольку вам придется регенерировать класс типизированного набора данных при каждом изменении структуры данных.
В целом, во многих случаях вы можете динамически создавать набор данных, не имея доступной схемы. В этом случае набор данных - это просто удобная структура, в которой вы можете хранить информацию, если данные могут быть представлены реляционным способом. В то же время вы можете воспользоваться возможностями набора данных, такими как возможность сериализации информации для передачи другому процессу или записи файла XML.