Четверг Мая 17 , 2012
TEXT_SIZE
   


Проверка данных средствами объектов DataRelation

Теперь, когда вы умеете с помощью объектов DataRelation перемещаться по данным связанных объектов DataTable, мы рассмотрим еще одну важную функцию объекта DataRelation — проверку данных. При создании отношения между двумя объектами Data-Table обычно требуется гарантировать отсутствие в дочернем объекте DataTable осиротевших данных, т. е. запретить пользователям добавлять в таблицу Orders записи, не соответствующие записям таблицы Customers. Объект DataRelation позволяет обеспечить соблюдение ограничений в связанных объектах DataTable. Создание ограничений По умолчанию при создании объекта DataRelation в родительском объекте DataTable определяется ограничение UntqueKey, а в дочернем объекте DataTable — ограничение ForeignKey Constraint. Следующий фрагмент кода создает на столбце CustomerlD объекта DataTable Customers ограничение UniqueKey, а на столбце CustomerlD объекта DataTable Orders — ограничение ForeignKeyConstraint. Visual Basic. NET Dim strConn, strSQL As String strConn = "Provider=SQLOLEDB;Data Source=(local)\NetSDK; " & "Initial Catalog=Northwind;Trusted_Connection=Yes;Dim en As New OleDbConnection(strConn) cn. Open() StrSQL = "SELECT CustomerlD, CompanyName, ContactName FROM CustomersDim daCustomers As New OleDbDataAdapter(strSQL, en) strSQL = "SELECT OrderlD, CustomerlD, EmployeeID, OrderDate FROM OrdersDim daOrders As New OleDbDataAdapter(strSQL, en) Dim ds As New DataSet() daCustomers. Fill(ds, "Customers") daOrders. Fill(ds, "Orders") en. Close() ds, Relationships. Add("CustomersOrders", ds. Tables("Customers").Columns("GustomerlD"), ds. Tables("Orders").Columns("CustomerlD")) Console. WriteLine("The parent DataTable now contains " & ds. Tables("Customers").Constraints. Count & " constraints") Console. WriteLine("The child DataTable now contains " & ds. Tables("Orders").Constraints. Count 4 " constraints") Visual C#.NET string strConn, strSOL; strConn = "Provider=SQLOLEDB;Data Source=(local)\\NetSDK;" + "Initial Catalog=Northwind;Trusted_Connection=Yes;"; OleDbConnection en = new OleDbConnection(strConn); en. Open(); strSQL = "SELECT CustomerlD, CompanyName, ContactName FROM Customers"; OleDbDataAdapter daCustomers = new OleDbDataAdapter{strSQL, en); strSQL = "SELECT OrderlD, CustomerlD, EmployeeID, OrderDate FROM Orders"; OleDbDataAdapter daOrders = new OleDbDataAdapter(strSQL, en); DataSet ds = new DataSet(); daCustomers. Fill(ds, "Customers"); daOrders. Fill(ds, "Orders"); cn. Close(); ds. Relationships. Add("CustomsrsOrders", ds. Tables["Customers"].Columns["CustomerlD"], ds. Tables["Orders"].Columns["CuEitomerID"]); Console. WriteLine("The parent DataTable now contains " + Объекты DataRelation, ссылающиеся на себя Иногда родительская и дочерняя таблицы, участвующие в отношении, являются одним и тем же объектом. Возьмем таблицу Employees БД Northwind. В ней есть столбец EmpIoyeelD с идентификатором сотрудника, а также столбец ReportsTo с идентификатором руководителя сотрудника. Кроме того, на столбце ReportsTo определено ограничение FOREIGN KEY, гарантирующее, что данный столбец принимает только значения из столбца EmpIoyeelD. Следующий фрагмент кода выбирает из таблицы Employees данные в объект DataSet и создает ссылающийся на себя объект DataRelation: Visual Basic. NET Dim strConn, strSQL As String strConn = "Provider=SQLOLEDB;Data Source=(local)\NetSDK;" & "Initial Catalog=Northwind;Trusted_Connection=Yes;StrSQL = "SELECT EmpIoyeelD, ReportsTo, " & "LastName + ', ' + FirstName AS EmployeeName FROM Employees" Dim da As New OleDbDataAdapter{strSQL, strConn) Dim ds As New DataSet() da. Fill(ds, "Employees") Dim tbl As DataTable = ds. TablesC'Employees") ds. ftelations. Add("SelfReferencing", tbl. Columns("EmployeeID"), tblColumnsC"ReportsTo"), False) Visual C#.NET string strConn, strSQL; strConn = "Provider=SQLOLEDB;Data Source=(local)\\NetSDK; " + "Initial Catalog=Northwind;Trusted_Connection=Yes;"; StrSQL = "SELECT EmployeeID, ReportsTo, " + "LastName + ', ' + FirstName AS EmployeeName FROM Employees"; OleDbDataAdapter da = new OleDbDataAdapter(strSQL, strCcnn); DataSet ds = new DataSet(); da. FilKds, "Employees"); DataTable tbl = ds. Tables["Employees"]; ds. Relations. Add("SelfReferencing", tbl. Columns["EmployeeID"], tbl. Columnst"ReportsTo"], false); Создать DataRelation — только половина дела. Наша настоящая цель — вывести древовидный список всех сотрудников (рис. 7-4). Обход иерархии для вывода сотрудников по их руководителям связан с определенными проблемами, особенно если вы никогда не писали рекурсивный код. В таком случае рекомендую вам изучить документацию языка по вашему выбору и найти там необходимую информацию, поскольку вопросы рекурсии не вошли в эту книгу. Приведенный далее фрагмент кода просматривает содержимое объекта DataTable и выводит данные о руководителе наивысшего ранга. В таблице Employees ему соответствует запись, значение поля ReportsTo которой — NULL. Подробнее о значениях NULL и ограничениях ForeignKey Constraint — во врезке - Ограничения ForeignKey Constraint и значения Null. Обнаружив руководителя наивысшего ранга, код выводит его непосредственных подчиненных, добавляя перед их именами символ табуляции, затем — под - чиненных этих подчиненных и так до тех пор, пока не останется сотрудников, имеющих кого-либо в подчинении. Но достаточно объяснений — подать сюда кодVisual Basic. NET Dim row As Dataflow For Each row In tbl. Rows If row. IsNull("ReportsTo") Then DisplayRow(row, "") End If Next row Public Sub DisplayRow(DataRow row, string strlndent) Console. WriteLine{strIndent i rowC'EmployeeName")) Dim rowChild As DataRow For Each rowChild in row. GetChildRows("SelfReferencing") DisplayRow(rowChild, strlndent & vbTab) Next rowChild End Sub Visual C#.NET foreach (DataRow row in tbl. Rows) if (row. IsNull("ReportsTo")) DisplayRowfrow, ""); static votd DisplayRow(DataRow row, string strlndent) { Console. WriteLine(strIndent + row["EmployeeName"]}; foreach (DataRow rowChild in row. GetChildRows("SelfReferencing")) DisplayRow(rowChild, strlndent + "\t"}; }

Добавить комментарий


Защитный код
Обновить

Рейтинг пользователей: / 0
ХудшийЛучший 

Метео

Войти

Голосование

Идеальный вариант проведения новогодней корпоративной вечеринки - это…

Сейчас на сайте

Сейчас 6 гостей онлайн