ВЫПОЛНЕНИЕ Проверки вспомогательный класс DataSet JOIN в Visual C#.NET

Переводы статьи Переводы статьи
Код статьи: 326080 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье описывается, как реализовать и использовать как DataSetHelper класс, который включает пример кода для создания Объект DataTable объект из двух или более связанных с Объект DataTable определения и для копирования записей, которые упорядочены и отфильтрованы из источника Объект DataTable объекты в место назначения Объект DataTable.

Чтобы сделать это, используйте следующие открытые методы:
  • CreateJoinTable
  • InsertJoinInto
  • SelectJoinInto
В SelectJoinInto вызовы метода CreateJoinTable и InsertJoinInto методы. Также можно использовать закрытый вспомогательный метод и данные члены для хранения списка анализируемого поля.

В DataSetHelper класс включает Набор данных переменная-член. При необходимости можно назначить существующий Набор данных для Набор данных переменная-член. Если переменная-член указывает на допустимый Набор данных, все Объект DataTable объекты, CreateJoinTable или SelectJoinInto метод создает добавляются Набор данных. В любом случае вызов метода возвращает ссылку на Объект DataTable объект. В InsertJoinInto метод требует существующей цели Объект DataTable и ничего не возвращает.

Для получения дополнительных сведений о Набор данных объекты, щелкните следующий номер статьи базы знаний Майкрософт:
313485 ИНФОРМАЦИЯ: Путеводитель для ADO.NET DataSet и DataViewManager DataView

Требования

В следующем списке представлены Рекомендуемое оборудование, программное обеспечение, сети инфраструктура и пакеты обновлений, которые требуются:
  • Microsoft Windows XP, Windows 2000 или Windows NT 4.0 с пакетом обновления 6a (SP6a)
  • Microsoft Visual Studio.NET
Предполагается, что вы знакомы с следующие темы:
  • Visual C#.NET на этой странице
  • ADO.NET основы и синтаксис

Класс DataSetHelper оболочки

В этом разделе код объявляет класс оболочки, к которому все DataSetHelper статьи добавления методов и переменных-членов.
  1. Запустите Visual Studio.NET.
  2. На Файл Выберите пункт Новый, а затем нажмите кнопку Проект.
  3. В Новый проект диалоговое окно, нажмите кнопку Проекты Visual C# Из списка Типы проектов, а затем нажмите кнопку Библиотека классов Из списка Шаблоны.
  4. В Имя поле типа DataSetHelper.
  5. Замените код класса следующий код:
    public class DataSetHelper
    {
        public DataSet ds;
    
        public DataSetHelper(ref DataSet DataSet)
        {
    	ds = DataSet;
        }
        public DataSetHelper()
        {
    	ds = null;
        }
    }
    					
    Две перегрузки конструктора, можно использовать для создания экземпляра класса с или без ссылки на допустимую Набор данных. Для класса, который содержит ссылку на допустимый Набор данных, Объект DataTable объекты, которые возвращают методы также добавляются автоматически в Набор данных.

Анализатор списка поля

В этом разделе содержится код для средства синтаксического анализа поля списка. Проанализированное структура используется таким образом, CreateJoinTable и InsertJoinInto методы нет необходимости повторной обработки списка полей. Эти методы должны повторной обработки списка полей, если они вызываются из SelectJoinInto метод или из собственного кода. Список полей разбора и список полей неразобранный хранятся в Закрытый переменные-члены DataSetHelper класс.
  1. Добавьте следующие строки Закрытый Определение в класса DataSetHelper класс, созданный в "«раздел:
    private class FieldInfo
    {
        public string RelationName;
        public string FieldName;	//source table field name
        public string FieldAlias;	//destination table field name
        public string Aggregate;
    }
    					
    ПРИМЕЧАНИЕ: Этот класс является общим для других DataSetHelper статьи, посвященные и содержит некоторые поля, которые не используются в данной статье.

  2. Добавьте следующие строки Закрытый переменные-члены для определения класса сразу после Набор данных объявление:
    private System.Collections.ArrayList m_FieldInfo; private string m_FieldList; 
    					
  3. Добавьте следующие строки Закрытый метод определения класса. Этот метод является таким же, как метод, который используется в других DataSetHelper статьи.
    private void ParseFieldList(string FieldList, bool AllowRelation)
    {
        /*
         * This code parses FieldList into FieldInfo objects  and then 
         * adds them to the m_FieldInfo private member
         * 
         * FieldList systax:  [relationname.]fieldname[ alias], ...
        */ 
        if (m_FieldList == FieldList) return;
        m_FieldInfo = new System.Collections.ArrayList();
        m_FieldList = FieldList;
        FieldInfo Field; string[] FieldParts;
        string[] Fields=FieldList.Split(',');
        int i;
        for (i=0; i<=Fields.Length-1; i++)
        {
            Field=new FieldInfo();
            //parse FieldAlias
            FieldParts = Fields[i].Trim().Split(' ');
            switch (FieldParts.Length)
            {
                case 1:
                    //to be set at the end of the loop
                    break;
                case 2:
                    Field.FieldAlias=FieldParts[1];
                    break;
                default:
                    throw new Exception("Too many spaces in field definition: '" + Fields[i] + "'.");	                        
            }
            //parse FieldName and RelationName
            FieldParts = FieldParts[0].Split('.');
            switch (FieldParts.Length)
            {
                case 1: 
                    Field.FieldName=FieldParts[0];
                    break;
                case 2:
                    if (AllowRelation==false)
                        throw new Exception("Relation specifiers not permitted in field list: '" + Fields[i] + "'.");
                    Field.RelationName = FieldParts[0].Trim();
                    Field.FieldName=FieldParts[1].Trim();
                    break;
                default:
                    throw new Exception("Invalid field definition: " + Fields[i] + "'.");
            }
            if (Field.FieldAlias==null) 
                Field.FieldAlias = Field.FieldName;
            m_FieldInfo.Add (Field);
        }
    }
    					

Метод CreateJoinTable

В этом разделе содержится код для CreateJoinTable метод.

Ниже приводится соглашение о вызове CreateJoinTable метод:
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");
				
В этом примере вызов создает новый Объект DataTable с помощью TableName TestTable и трех полей (FName LName и подразделения). Эти три поля имеют тот же тип данных, FirstName и LastName полей в таблице «Сотрудники» и поле отдел в родительской таблице, к которому осуществляется через DepartmentEmployee DataRelation объект.

Для указания поля в списке полей, используйте следующий синтаксис:
[relationname.]fieldname[ alias], ...
				
Обратите внимание на следующие этот синтаксис:
  • В ColumnName и Тип данных свойства являются только свойства, которые копируются в место назначения Объект DataTable.
  • Для полей, содержащих выражение копируется результата оценки.
  • Переименование поля в месте назначения Объект DataTable указав имя псевдонима.
  • Список полей могут содержать набор имен полей, перечисленных в порядке, отличном от порядка в источнике Объект DataTable. Если список полей не заполнено, создается исключение.
  • В DataRelation должны быть связаны с родительской таблицы. Например если вы хотите создать таблицу, которая объединяет поля клиентов, сотрудников и таблицы Orders, необходимо использовать таблицы «Заказы» в качестве исходной таблицы и затем ссылаться на поля в таблицах сотрудников и клиентов с использованием отношений.
Для вызова CreateJoinTable метод, добавьте следующий метод DataSetHelper класс, созданный в "«раздел:
public DataTable CreateJoinTable(string TableName, DataTable SourceTable, string FieldList)
{
    /*
     * Creates a table based on fields of another table and related parent tables
     * 
     * FieldList syntax: [relationname.]fieldname[ alias][,[relationname.]fieldname[ alias]]...
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //return CreateTable(TableName, SourceTable);
    }
    else
    {
        DataTable dt = new DataTable(TableName);
        ParseFieldList(FieldList, true);
        foreach(FieldInfo Field in m_FieldInfo)
        {
            if(Field.RelationName==null)
            {
                DataColumn dc = SourceTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
            else
            {
                DataColumn dc = SourceTable.ParentRelations[Field.RelationName].ParentTable.Columns[Field.FieldName];
                dt.Columns.Add(dc.ColumnName, dc.DataType, dc.Expression);
            }
        }
        if (ds!=null)
            ds.Tables.Add(dt);
        return dt;
    }
}
				

Метод InsertJoinInto

В этом разделе содержится код для InsertJoinInto метод. В InsertJoinInto метод копирует записи, сортировки и фильтрации из исходной таблицы и связанные таблицы в целевую таблицу. При вызове метода ParseFieldList свойство, можно анализировать списки, которые ранее были извлечены, если эти списки доступных. Если список полей не заполнено, создается исключение.

Ниже приводится соглашение о вызове InsertJoinInto метод:
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
    "EmployeeID<5", "BirthDate");
				
Пример вызова копирует записи из сотрудников Объект DataTable (отдел полей и связанных Объект DataTable) на TestTable Объект DataTable, которая фильтруется по "КодСотрудника<5" and="" is="" sorted="" by=""></5">

ПРИМЕЧАНИЕ: Фильтр и сортировка выражения применяются только к исходной таблицы, а не для любых связанных таблиц.

Для вызова InsertJoinInto метод, добавьте следующий метод DataSetHelper класс, созданный в "«раздел:
public void InsertJoinInto(DataTable DestTable, DataTable SourceTable, 
    string FieldList, string RowFilter, string Sort)
{
    /*
    * Copies the selected rows and columns from SourceTable and inserts them into DestTable
    * FieldList has same format as CreatejoinTable
    */ 
    if (FieldList==null)
    {
        throw new ArgumentException("You must specify at least one field in the field list.");
        //InsertInto(DestTable, SourceTable, RowFilter, Sort);
    }
    else
    {
    ParseFieldList(FieldList, true);
    DataRow[] Rows = SourceTable.Select(RowFilter, Sort);
    foreach(DataRow SourceRow in Rows)
    {
            DataRow DestRow = DestTable.NewRow();
            foreach(FieldInfo Field in m_FieldInfo)
            {
                if(Field.RelationName==null)
                {
                    DestRow[Field.FieldName] = SourceRow[Field.FieldName];
                }
                else
                {
                    DataRow ParentRow = SourceRow.GetParentRow(Field.RelationName);
                    DestRow[Field.FieldName] = ParentRow[Field.FieldName];
                }
            }
            DestTable.Rows.Add(DestRow);
        }
    }
}
				

Метод SelectJoinInto

В этом разделе содержится код для SelectJoinInto метод. Этот метод представляет собой комбинацию CreateJoinTable и InsertJoinInto методы. В SelectJoinInto метод создает новый Объект DataTable на основе существующего Объект DataTable объекты и копий записей, сортировки и фильтрации в новый Объект DataTable.

Ниже приводится соглашение о вызове SelectJoinInto метод:
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"], 
    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");
				
Создает вызов этого образца Объект DataTable три поля с именем TestTable. Эти три поля основаны на FirstName и LastName полей сотрудников Объект DataTable и в поле отдел Объект DataTable только через DepartmentEmployee DataRelation. Этот пример копирует записи из сотрудников Объект DataTable для TestTable Объект DataTable, которая фильтруется по "КодСотрудника<5" and="" is="" sorted="" by=""></5">

ПРИМЕЧАНИЕ: Фильтр и сортировка выражения применяются только к исходной таблицы, а не к связанным таблицам.

Для вызова SelectJoinInto метод, добавьте следующий метод DataSetHelper класс, созданный в "«раздел:
public DataTable SelectJoinInto(string TableName, DataTable SourceTable, string FieldList, string RowFilter, string Sort)
{
    /*
     * Selects sorted, filtered values from one DataTable to another.
     * Allows you to specify relationname.fieldname in the FieldList to include fields from
     *  a parent table. The Sort and Filter only apply to the base table and not to related tables.
    */ 
    DataTable dt = CreateJoinTable(TableName, SourceTable, FieldList);
    InsertJoinInto(dt, SourceTable, FieldList, RowFilter, Sort);
    return dt;
}
				

Тестирование приложения

  1. Сохраните и скомпилируйте затем DataSetHelper класс, созданный в предыдущем разделе.
  2. Выполните следующие действия, чтобы создать новое приложение Visual C# Windows.
    1. Запустите Visual Studio.NET.
    2. На Файл Выберите пункт Новый, а затем нажмите кнопку Проект.
    3. В Новый проект диалоговое окно, нажмите кнопку Проекты Visual C# Из списка Типы проектов, а затем нажмите кнопку Приложение Windows Из списка Шаблоны.
  3. В обозревателе решений щелкните решение правой кнопкой мыши и выберите команду Добавление существующего проекта. Добавьте в проект DataSetHelper.
  4. На Проект меню, нажмите кнопку Добавить ссылку.
  5. В Добавить ссылку диалоговое окно, нажмите кнопку Проекты вкладки, а затем добавьте ссылку на проект DataSetHelper в приложении Windows Form.
  6. Перетащите в конструктор формы три Кнопка элементы управления и DataGrid управления из панели элементов на форму. Имя кнопки btnCreateJoin, btnInsertJoinInto, и btnSelectJoinInto. Оставьте имя по умолчанию для DataGrid элемент управления (dataGrid1).
  7. В коде формы добавьте следующие строки С помощью оператор в верхнюю часть окна кода:
    using System.Data;
    					
  8. Добавьте следующие объявления переменных для определения формы:
    DataSet ds; DataSetHelper.DataSetHelper dsHelper;
    					
  9. Добавьте следующий код для Form_Load событие:
    ds = new DataSet();
    dsHelper = new DataSetHelper.DataSetHelper(ref ds);
    //Create source tables
    DataTable dt = new DataTable("Employees");
    dt.Columns.Add("EmployeeID",Type.GetType("System.Int32") );
    dt.Columns.Add("FirstName", Type.GetType("System.String"));
    dt.Columns.Add("LastName", Type.GetType("System.String"));
    dt.Columns.Add("BirthDate", Type.GetType("System.DateTime"));
    dt.Columns.Add("JobTitle", Type.GetType("System.String"));
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Rows.Add(new object[] {1, "Tommy", "Hill", new DateTime(1970, 12, 31),  "Manager", 42});
    dt.Rows.Add(new object[] {2, "Brooke", "Sheals", new DateTime(1977, 12, 31), "Manager", 23});
    dt.Rows.Add(new object[] {3, "Bill", "Blast", new DateTime(1982, 5, 6), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Kevin", "Kline", new DateTime(1978, 5, 13), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Martha", "Seward", new DateTime(1976, 7, 4), "Sales Clerk", 23});
    dt.Rows.Add(new object[] {1, "Dora", "Smith", new DateTime(1985, 10, 22), "Trainee", 42});
    dt.Rows.Add(new object[] {1, "Elvis", "Pressman", new DateTime(1972, 11, 5), "Manager", 15});
    dt.Rows.Add(new object[] {1, "Johnny", "Cache", new DateTime(1984, 1, 23), "Sales Clerk", 15});
    dt.Rows.Add(new object[] {1, "Jean", "Hill", new DateTime(1979, 4, 14), "Sales Clerk", 42});
    dt.Rows.Add(new object[] {1, "Anna", "Smith", new DateTime(1985, 6, 26), "Trainee", 15});
    ds.Tables.Add(dt);
    
    dt = new DataTable("Departments");
    dt.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
    dt.Columns.Add("DepartmentName", Type.GetType("System.String"));
    dt.Rows.Add(new object[] {15, "Men's Clothing"});
    dt.Rows.Add(new object[] {23, "Women's Clothing"});
    dt.Rows.Add(new object[] {42, "Children's Clothing"});
    ds.Tables.Add(dt);
    
    ds.Relations.Add("DepartmentEmployee",     ds.Tables["Departments"].Columns["DepartmentID"], 
        ds.Tables["Employees"].Columns["DepartmentID"]);
    					
  10. Добавьте следующий код для btnCreateJoin_Click событие:
    dsHelper.CreateJoinTable("EmpDept",ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  11. Добавьте следующий код для btnInsertJoinInto_Click событие:
    dsHelper.InsertJoinInto(ds.Tables["EmpDept"], ds.Tables["Employees"], 
        "FirstName FName,LastName LName,BirthDate,DepartmentEmployee.DepartmentName Department",
        "JobTitle='Sales Clerk'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept");
    					
  12. Добавьте следующий код для btnSelectJoinInto_Click событие:
    dsHelper.SelectJoinInto("EmpDept2", ds.Tables["Employees"],
        "FirstName,LastName,BirthDate BDate,DepartmentEmployee.DepartmentName Department", 
        "JobTitle='Manager'", "DepartmentID");
    dataGrid1.SetDataBinding(ds, "EmpDept2");
    					
  13. Запустите приложение и щелкните каждую из кнопок. Обратите внимание, что DataGrid заполняется таблицами и данных из кода.

    ПРИМЕЧАНИЕ: Только щелкните btnCreateJoin и btnSelectJoinInto кнопки один раз. Если щелкнуть любой из этих кнопок более одного раза, появляется сообщение об ошибке, который вы пытаетесь добавить в одной таблице дважды. Кроме того необходимо нажать кнопку btnCreateJoin Прежде чем нажать кнопку btnInsertJoinInto; в противном случае назначения Объект DataTable не создается. Если нажать кнопку btnInsertJoinInto кнопку несколько раз, необходимо заполнить DataGrid с помощью повторяющихся записей.

Улучшение идей

  • В ColumnName и Тип данных свойства являются только свойства, которые копируются в место назначения Объект DataTable. Можно расширить CreateTable метод, чтобы скопировать дополнительные свойства, такие как MaxLength свойство или создавать новые ключевые столбцы.
  • В Выражение свойство не копируются. Вместо этого результата оценки будет скопирована. Таким образом нет необходимости добавлять поля, на которые ссылается выражение в целевую таблицу. Кроме того в столбце назначения может присутствовать в списке результатов, чем любой из столбцов, которые в противном случае зависит этот столбец. Можно изменить CreateTable метод копирования Выражение (столбец InsertInto не обрабатывает столбцы с Выражение), хотя это и действуют ограничения, описанные ранее в этом абзаце.
  • Объединить функциональные возможности CreateJoinTable, InsertJoinIntoи SelectJoinInto методы в CreateTable, InsertIntoи SelectInto методы. Для получения дополнительных сведений о CreateTable, InsertIntoи SelectInto методы, щелкните следующий номер статьи базы знаний Майкрософт:
    326009 Методические УКАЗАНИЯ: Реализация вспомогательный класс набора данных SELECT INTO в Visual C#.NET
    Если слияние этих методов не требуется, но если оба набора методов в один класс, можно включить CreateJoinTable и InsertJoinInto методы для обработки списка пустое поле, удалив Исключение инструкции и, удалив вызовы CreateTable и InsertInto методы в следующих строк кода:
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //return CreateTable(TableName, SourceTable);
        }
    					
    -и-
        if (FieldList==null)
        {
            throw new ArgumentException("You must specify at least one field in the field list.");
            //InsertInto(DestTable, SourceTable, RowFilter, Sort);
        }
    					

Устранение неполадок

  • Fieldname и частей псевдоним из списка полей должны соответствовать DataColumn соглашения об именовании. Анализатор также ограничивает имена, в том, что имя не должно содержать точку (.), запятая (,) или пробелом ().
  • Если щелкнуть кнопку несколько раз, и ту же таблицу добавляется два раза Набор данных, который приводит к возникновению исключения. Чтобы обойти эту проблему, можно добавить код для тестового приложения, чтобы проверить ли Объект DataTable с таким же именем уже существует. Кроме того, можно создать DataSetHelper класс без ссылки Набор данных и затем привязать DataGrid.DataSource Свойство напрямую DT переменной, а не с помощью SetDataBinding вызов метода.
  • Если исходная таблица использует пользовательские типы данных (то есть класс), необходимо добавить код для InsertJoinInto метод, чтобы выполнить глубокое копирование данных. В противном случае копируются только ссылки.

Свойства

Код статьи: 326080 - Последний отзыв: 8 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Ключевые слова: 
kbhowtomaster kbsystemdata kbmt KB326080 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:326080

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com