كيفية: تطبيق فئة مساعد "الانضمام إلى مجموعة البيانات" في Visual C#.NET

للحصول على إصدار Microsoft Visual Basic.NET من هذه المقالة، راجع

325688 HOWTO: تطبيق فئة مساعد "الانضمام إلى مجموعة البيانات" في Visual Basic.NET
ملاحظة: هذه الوثيقة واحدة من سلسلة من المقالات DataSetHelper . يمكنك دمج التعليمات البرمجية في الفئة DataSetHelper المسردة في هذه المقالة باستخدام التعليمات البرمجية التي يتم توفيرها في مقالات أخرى DataSetHelper لجعل فئة واحدة مع ميزة أكثر شمولية.


تشير هذه المقالة إلى مكتبة فئات Microsoft.NET Framework مساحات الأسماء التالية:
  • System.Data

في هذه المهمة

ملخص

توضح هذه المقالة خطوة بخطوة كيفية تنفيذ وكيفية استخدام فئة DataSetHelper على نموذج التعليمات البرمجية لإنشاء كائن DataTable من اثنين أو أكثر من تعريفات DataTable ذات الصلة ونسخ السجلات التي يتم فرز وتصفية من الكائنات DataTable المصدر إلى الوجهة DataTable.

للقيام بذلك، يمكنك استخدام الأساليب العامة التالية:

  • كريتيجوينتابل
  • إينسيرتجوينينتو
  • سيليكتجوينينتو
استدعاء الأسلوب سيليكتجوينينتو كريتيجوينتابل وأساليب إينسيرتجوينينتو . يمكنك أيضا استخدام أعضاء البيانات وأسلوب مساعد خاص لتخزين قائمة الحقول التي تم تحليلها.

تتضمن الفئة DataSetHelper متغير عضو مجموعة البيانات . بشكل اختياري، يمكنك تعيين مجموعة البيانات موجودة لمتغير العضو DataSet . إذا كان متغير عضو يشير ل صالح مجموعة البيانات، أي كائنات DataTable يقوم الأسلوب سيليكتجوينينتو أو كريتيجوينتابل تضاف إلى DataSet. وفي كلتا الحالتين، استدعاء الأسلوب بإرجاع مرجع إلى كائن DataTable . أسلوب إينسيرتجوينينتو يتطلب هدفا DataTable موجود ولا يرجع أي شيء.

لمزيد من المعلومات حول كائنات مجموعة البيانات ، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

معلومات 313485 : خريطة طريق داتافيوماناجير وعرض البيانات ADO.NET DataSet

متطلبات

توضح القائمة التالية الأجهزة الموصى بها برامج البنية الأساسية للشبكة وحزم الخدمات المطلوبة:

  • نظام التشغيل Microsoft Windows XP أو Windows 2000 أو Windows NT 4.0 Service Pack 6a
  • Microsoft Visual Studio.NET
تفترض هذه المقالة أنك معتاد على المواضيع التالية:

  • بناء visual C#.NET
  • أساسيات ADO.NET وبناء الجملة

الفئة DataSetHelper Shell

التعليمات البرمجية في هذا القسم بالتصريح بفئة shell إضافة كافة المقالات 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 التي تقوم بإرجاع الأساليب أيضا تضاف تلقائياً إلى DataSet.

محلل قائمة الحقول

يحتوي هذا القسم على التعليمات البرمجية لمحلل قائمة حقل. يستخدم بنية تم تحليلها بحيث كريتيجوينتابل وأساليب إينسيرتجوينينتو ليس بإعادة توزيع قائمة الحقول. يجب على هذه الطرق إعادة التوزيع قائمة الحقول إذا تم استدعائها من أسلوب SelectJoinInto أو من التعليمات البرمجية الخاصة بك. قائمة الحقول التي تم تحليلها وقائمة الحقول التي لم يتم تحليلها مخزنة في المتغيرات الخاصة عضو الفئة DataSetHelper .

  1. إضافة تعريف الفئة الخاصة التالية في الفئة DataSetHelper الذي قمت بإنشائه في قسم "الفئة Shell 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);
    }
    }

طريقة كريتيجوينتابل

يحتوي هذا القسم على التعليمات البرمجية لأسلوب كريتيجوينتابل .

المثال التالي هو اصطلاح استدعاء للأسلوب كريتيجوينتابل :
dt = dsHelper.CreateJoinTable("TestTable", ds.Tables["Employees"],    "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department");

إنشاء نموذج استدعاء هذا DataTable جديد ب اسم جدول TestTable وثلاثة حقول (FName واسم العائلة والإدارة). هذه الحقول الثلاثة تحتوي نفس نوع بيانات الاسم الأول وحقل ديبارتمينتنامي في الجدول الأصل الذي يتم الوصول إليه من خلال كائن ديبارتمينتيمبلويي DataRelation والحقول "اسم العائلة" في جدول "الموظفين".


استخدم بناء الجملة التالي لتحديد الحقول في قائمة الحقول:
[relationname.]fieldname[ alias], ...
لاحظ ما يلي بناء الجملة التالي:

  • ColumnName وخصائص نوع بيانات هي فقط الخصائص التي يتم نسخها إلى DataTableالوجهة.
  • يتم نسخ النتيجة تقييمه للحقول التي تحتوي على تعبير.
  • يمكنك إعادة تسمية حقل في DataTable الوجهة عن طريق تحديد اسم مستعار.
  • يمكن أن تحتوي قائمة الحقول على مجموعة فرعية أسماء الحقول المسرودة في ترتيب مختلف عن ترتيب مصدر DataTable. إذا كانت قائمة الحقول فارغة، يتم طرح استثناء.
  • يجب أن تتصل DataRelation جداول الأصل. على سبيل المثال، إذا أردت إنشاء جدول يضم حقول العملاء والموظفين وجداول أوامر، يجب استخدام جدول "الطلبات" كالجدول المصدر وثم الرجوع إلى حقول في جداول الموظفين والعملاء عن طريق العلاقات.
استدعاء الأسلوب كريتيجوينتابل ، أضف الأسلوب التالي إلى الفئة DataSetHelper الذي قمت بإنشائه في قسم "الفئة Shell 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 نسخ السجلات التي يتم فرز وتصفيه من الجدول المصدر والجداول ذات الصلة للجدول الوجهة. عند استدعاء خاصية ParseFieldList ، يمكن تحليل القوائم التي تم تحليلها سابقا، إذا توفرت هذه القوائم. إذا كانت قائمة الحقول فارغة، يتم طرح استثناء.


المثال التالي هو اصطلاح استدعاء للأسلوب إينسيرتجوينينتو :
dsHelper.InsertJoinInto(ds.Tables["TestTable"], ds.Tables["Employees"],     "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", 
"EmployeeID<5", "BirthDate");

نموذج استدعاء نسخ السجلات من الموظفين DataTable (وميدان ديبارتمينتنامي ذات الصلة DataTable) إلى TestTable DataTableعلى تصفيتها "EmployeeID < 5" ويتم فرزه حسب "تاريخ الميلاد".

ملاحظة: تطبيق عامل التصفية وتعبيرات الفرز فقط للجدول المصدر ولا أي جداول مرتبطة.

استدعاء الأسلوب إينسيرتجوينينتو ، أضف الأسلوب التالي إلى الفئة DataSetHelper الذي قمت بإنشائه في قسم "الفئة Shell 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);
}
}
}

طريقة سيليكتجوينينتو

يحتوي هذا القسم على التعليمات البرمجية لأسلوب سيليكتجوينينتو . هذا الأسلوب مزيج من كريتيجوينتابل وأساليب إينسيرتجوينينتو . إنشاء أسلوب سيليكتجوينينتو جديد DataTable استناداً إلى DataTable الكائنات ونسخ السجلات الموجودة التي يتم فرز وتصفية إلى DataTableجديد.


المثال التالي هو اصطلاح استدعاء للأسلوب سيليكتجوينينتو :
dt = dsHelper.SelectInto("TestTable", ds.Tables["Employees"],     "FirstName FName,LastName LName,DepartmentEmployee.DepartmentName Department", "EmployeeID<5", "BirthDate");

ينشئ هذا الاستدعاء نموذج DataTable المسمى TestTable مع الحقول الثلاثة. تستند هذه الحقول الثلاثة في "الاسم الأول" والحقول "اسم العائلة" ل الموظفين DataTable وميدان DataTable المشار إليها من خلال ديبارتمينتيمبلويي DataRelationديبارتمينتنامي. فهذه العينة بنسخ السجلات من الموظفين DataTable إلى DataTableTestTable الذي تم تصفيته على "EmployeeID < 5" ويتم فرزه حسب "تاريخ الميلاد".

ملاحظة: تطبيق عامل التصفية وتعبيرات الفرز فقط إلى الجدول المصدر وليس إلى الجداول المرتبطة.

استدعاء الأسلوب سيليكتجوينينتو ، أضف الأسلوب التالي إلى الفئة DataSetHelper الذي قمت بإنشائه في قسم "الفئة Shell 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.
  6. في مصمم النموذج، سحب عنصر تحكم DataGrid وثلاثة أزرار عناصر تحكم من مربع الأدوات إلى النموذج. تسمية أزرار بتنكريتيجوين وبتنينسيرتجوينينتو وبتنسيليكتجوينينتو. احتفظ بالاسم الافتراضي لعنصر التحكم DataGrid (dataGrid1).
  7. في التعليمة البرمجية للنموذج، أضف عبارة Using التالية إلى الجزء العلوي من إطار التعليمات البرمجية:
    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 مع الجداول والبيانات من التعليمات البرمجية.

    ملاحظة: يمكنك فقط النقر فوق الأزرار بتنسيليكتجوينينتو و بتنكريتيجوين مرة واحدة. عند النقر فوق أي من هذه الأزرار أكثر من مرة واحدة، تتلقى رسالة خطأ التي تحاول إضافة نفس الجدول مرتين. بالإضافة إلى ذلك، يجب عليك النقر فوق بتنكريتيجوين قبل النقر فوق بتنينسيرتجوينينتو؛ وإلا، الوجهة DataTable لا يتم إنشاء. إذا نقرت فوق الزر بتنينسيرتجوينينتو عدة مرات، يمكنك ملء DataGrid مع سجلات مكررة.

أفكار التحسين

  • ColumnName وخصائص نوع بيانات هي فقط الخصائص التي يتم نسخها إلى DataTableالوجهة. يمكنك توسيع الأسلوب CreateTable لنسخ خصائص إضافية، مثل الخاصية MaxLength ، أو يمكنك إنشاء أعمدة المفاتيح الجديدة.
  • لا يتم نسخ خاصية التعبير ؛ بدلاً من ذلك، يتم نسخ النتيجة تقييمه. لذلك، لم تكن لإضافة الحقول التي يتم الرجوع إليها بواسطة التعبير إلى الجدول الوجهة. بالإضافة إلى ذلك، يمكن أن يظهر العمود الوجهة في قائمة النتائج من أي من الأعمدة التي تعتمد هذا العمود على خلاف ذلك. يمكنك تعديل أسلوب CreateTable لنسخ التعبير (العمود InsertInto تجاهل الأعمدة باستخدام تعبير)، على الرغم من أن هذا يخضع للقيود المذكورة في هذه الفقرة.
  • يمكنك دمج وظيفة كريتيجوينتابلو إينسيرتجوينينتووأساليب سيليكتجوينينتو CreateTable InsertIntoوأساليب SelectInto . للحصول على معلومات إضافية حول CreateTable InsertIntoوأساليب SelectInto ، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

    326009 HOWTO: تطبيق فئة مساعد "تحديد في مجموعة البيانات" في Visual C#.NET
    إذا لم ترغب بدمج هذه الأساليب، ولكن إذا كان لديك كلتا المجموعتين من أساليب في فئة واحدة، يمكنك تمكين كريتيجوينتابل وأساليب إينسيرتجوينينتو لمعالجة قائمة حقل فارغ بإزالة العبارات طرح و بواسطة uncommenting 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 . المحلل اللغوي أيضا تقييد الأسماء، حيث يجب أن لا يحتوي الاسم على نقطة (.) أو فاصلة (,) أو على مساحة ('').
  • عند النقر فوق زر أكثر من مرة واحدة، تتم إضافة نفس الجدول مرتين إلى DataSet، الذي ينتج استثناء. للتغلب على هذه المشكلة، يمكنك إضافة التعليمات البرمجية لاختبار التطبيق للتحقق من ما إذا كان DataTable بنفس الاسم بالفعل. بدلاً من ذلك، يمكنك إنشاء فئة DataSetHelper دون الرجوع إلى مجموعة البيانات ثم قم بربط الخاصية DataGrid.DataSource مباشرة إلى متغير dt بدلاً من باستخدام استدعاء الأسلوب سيتداتابيندينج .
  • إذا كان يستخدم الجدول المصدر أنواع البيانات المخصصة (أي، فئة)، يجب إضافة تعليمات برمجية إلى الأسلوب إينسيرتجوينينتو لإجراء نسخة عميق من البيانات. وإلا، يتم نسخ مرجع فقط.
خصائص

رقم الموضوع: 326080 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 2

تعليقات