নির্দিষ্ট শর্তে দু'জনের মধ্যে একটি ডেটাটেবল তৈরি করুন


13

প্রথমত আমার ওডিবিসি থেকে সমস্ত ডেটা নেওয়া দরকার (এটি ইতিমধ্যে কাজ করছে)।

তারপরে সবচেয়ে জটিল অংশটি আসে যা আমি এখনও নিশ্চিত না যে এটি কীভাবে করা যায়। ওডিবিসিতে ডাটা দুটি সারণী রয়েছে। আমি তাদের আমার বর্তমান কোডের সাথে মার্জ করছি এবং নির্দিষ্ট পরামিতিগুলি দিয়ে ফিল্টার করছি।

ডাটাবেসে সারণী 1:

NRO   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
123   Fiat   Punto   500     J5        K4      O3      P4        O2         JT        1   1
133   Opel   Meriva  FTG     J5        K4      O3      P4        O2         JO        3   1
153   MB     E200    C25     JN        KI      OP      PY        OR         JD        5   1
183   BMW    E64     SE0     JR        KE      OT      PG        OL         J8        9   1
103   Audi   S6      700     JP        KU      OU      PN        OH         J6        11  1 

ডাটাবেসে সারণী 2:

NRO   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
423   Fiat   Punto   500     J5        K4      O3      P4        O2         JT        1   1
463   BMW    E64     SE0     JR        KE      OT      PG        OL         J8        9   1

মার্জ হওয়া ডেটা টেবিলটি এর মতো দেখতে:

NRO   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
423   Fiat   Punto   500     J5        K4      O3      P4        O2         JT        1   1
463   BMW    E64     SE0     JR        KE      OT      PG        OL         J8        9   1
123   Fiat   Punto   500     J5        K4      O3      P4        O2         JT        1   1
133   Opel   Meriva  FTG     J5        K4      O3      P4        O2         JO        3   1
153   MB     E200    C25     JN        KI      OP      PY        OR         JD        5   1
183   BMW    E64     SE0     JR        KE      OT      PG        OL         J8        9   1
103   Audi   S6      700     JP        KU      OU      PN        OH         J6        11  1 

তবে মার্জ হওয়া আউটপুট ডেটা টেবিলটি দেখতে দেখতে (এটির সাথে আরও কাজ করার সম্ভাবনা রয়েছে):

NRO  NRO1   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
123  423    Fiat   Punto   500     J5        K4      O3      P4        O2         JT        1   1
133         Opel   Meriva  FTG     J5        K4      O3      P4        O2         JO        3   1
153         MB     E200    C25     JN        KI      OP      PY        OR         JD        5   1
183  463    BMW    E64     SE0     JR        KE      OT      PG        OL         J8        9   1
103         Audi   S6      700     JP        KU      OU      PN        OH         J6        11  1 

সদৃশ সন্ধান করুন NAME। তাদের মধ্যে কেবল একটি রেখে দিন, সারণি 1 NROথেকে টেবিল 2 থেকে একটি নম্বর নির্ধারণ করুন NRO1। সারণী 1 নম্বর থাকা উচিত NRO, টেবিল 2 নম্বর থাকা উচিত NRO1

ওডিবিসিতে সংযুক্ত হওয়ার পরে আমি টেবিল 1 থেকে ডেটা দিয়ে একটি টেবিল পূরণ করছি

        DataTable dataTable = new DataTable("COMPANY");

        using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
        {
            dbConnectionSE.Open();
            OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
            dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);

            dadapterSE.Fill(dataTable);

        }

তারপরে আমি অন্য সারণী 2 থেকে ডেটা পাচ্ছি এবং এগুলি সংযুক্ত করে:

         using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
         {
              dbConnectionFI.Open();
              OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
              dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);

              var newTable = new DataTable("COMPANY");
              dadapterFI.Fill(newTable);

              dataTable.Merge(newTable);
          }

এর পরে আমি ফিল্টারিং করছি (আমার কেবল সারি 4 এবং 1 দিয়ে শুরু হওয়া দরকার NRO, অন্যান্য শুরুর সংখ্যার সাথে সারিও রয়েছে):

DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();

তারপরে আমি এর জন্য আরও একটি কলাম যুক্ত করছি NRO1(এটি শূন্যগুলিও যুক্ত করছে (0) আমার কলামে এগুলির দরকার নেই NRO1):

        results.Columns.Add("NRO1", typeof(int)).SetOrdinal(1);

        foreach (DataRow row in results.Rows)
        {
            //need to set value to NewColumn column
            row["NRO1"] = 0;   // or set it to some other value
        }

আমি এই কোড সহ নকল পেতে পারি

var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);

তবে কীভাবে বাকি কাজ সম্পাদন করবেন? এটি একটি নতুন টেবিল তৈরি করে একটি লুপ দ্বারা সঞ্চালিত করা উচিত? আমি কীভাবে এতে যোগদান এবং ডুপ্লিকেট অপসারণ করতে dataTableপারি?


1. পারি dataTableকিছু নামের জন্য আরো দুই অনুরূপ? উদাহরণস্বরূপ, বিএমডাব্লুয়ের জন্য তিনটি নকলের উপস্থিতি কি সম্ভব? ২. কোনটি দ্বৈত রেকর্ড রাখতে হবে এবং কোনটি মুছতে হবে তা আমরা কীভাবে সংজ্ঞায়িত করতে পারি? উদাহরণস্বরূপ, আমরা ন্যূনতম সহ রেকর্ড রাখতে পারি NROএবং অন্যান্য রেকর্ড মুছতে পারি।
ইলিয়র তুরদুশেভ

@ ইলিয়ারটুরডেশেভ ১। ডেট্যাটেবলটিতে দুটিরও বেশি "নকল" থাকতে পারে না NAME। দু'জনের বেশি হলে - ত্রুটি (ত্রুটি হ্যান্ডলার)। ২. আমার উদাহরণে একটি ত্রুটি ছিল, আমি এখনই এটি সংশোধন করেছি। এটি উল্লেখ করার জন্য আপনাকে ধন্যবাদ, এটি গুরুত্বপূর্ণ।
হ্যাটম্যান

আপনি কি জিজ্ঞাসা স্ট্রিংএফআই এবং / অথবা ক্যোয়ারী স্ট্রিংএসইয়ের মানগুলি ভাগ করতে পারেন? আপনি কোন ডিবি ব্যবহার করছেন?
এটিটি

@ এটিটিএ আমি প্রকৃত ডাটাবেসে অ্যাক্সেস সরবরাহ করতে পারি না। আপনার মানে ডিবি টাইপ? এটি যেমন প্রশ্নে পড়েছে - ওডিবিসি
হ্যাটম্যান

আসলে আমি কোয়েরিটি দেখেছি যা দ্বারা ডেটা আনা হচ্ছে তা দেখতে, তবে আমি উত্তর লিখেছি এমন কয়েকটি অনুমানের উপর নির্ভর করে। দয়া করে পর্যালোচনা করুন এবং আপনার প্রতিক্রিয়া জানান। ধন্যবাদ
এটিটিএ

উত্তর:


3

আপনি merge()কলটি একটি কাস্টম পদ্ধতির সাথে প্রতিস্থাপন করতে পারেন , যা একই সাথে মার্জ এবং ফিল্টারিং করে। নীচে উদাহরণ দেখুন। আমি মনে করি এটি প্রথম সংশ্লেষের (ফলাফল সারণীতে সদৃশ সারিগুলি প্রবর্তন করা) এবং তারপরে ফিল্টারিং (অর্থাত্ সদৃশ সারিগুলি সরিয়ে ফেলতে) এর চেয়ে আরও ভাল পদ্ধতির।

এখানে, এটি ধরে নেওয়া হয় যে পরামিতিগুলির সকলেরই একই বিন্যাস রয়েছে। tTempটেবিল টেবিলের সামগ্রীগুলির জন্য একটি অস্থায়ী স্টোরেজ হিসেবে ব্যবহার করা হয় t2কিন্তু অতিরিক্ত কলাম সহ। এটি ফলাফল সারণীতে সারিগুলি আমদানি করতে দেয়।

হতে পারে একটি আরও মার্জিত সমাধান আছে, তবে এটি উদ্দেশ্য হিসাবে কাজ করা উচিত। অনুগ্রহ করে নোট করুন যে আমি অনুমোদিত অতিরিক্ত মানগুলির জন্য আপনার অতিরিক্ত প্রয়োজনীয়তা বাদ NROদিয়েছি, আমি নিশ্চিত যে আপনি সহজেই যুক্ত করতে পারেন।

static void merge_it(DataTable t1, DataTable t2, DataTable tResult, DataTable tTemp)
    {
        tResult.Merge(t1);
        tResult.Columns.Add("NRO1", typeof(int));

        tTemp.Merge(t2);
        tTemp.Columns.Add("NRO1", typeof(int));

        foreach (DataRow row in tTemp.Rows)
        {
            string name1 = row.Field<string>("NAME");
            string name2 = row.Field<string>("NAMEA");
            DataRow[] matches = tResult.Select($"NAME = '{name1}' AND NAMEA = '{name2}'");
            if (matches.Length > 0)
            {
                matches[0].SetField<int>("NRO1", row.Field<int>("NRO"));
            }
            else
            {
                tResult.ImportRow(row);
            }
        }

        foreach (DataRow row in tResult.Rows)
        {
            if (row["NRO1"] == DBNull.Value)
            {
                row["NRO1"] = 0;
            }
        }
    }

এই জন্য আপনাকে ধন্যবাদ! আমি কি ভুল কিছু করেনি হিসাবে আমি গ্রহণ করছি 'DataTable' does not contain a definition for 'Merge_it' and no accessible extension method 'Merge_it' accepting a first argument of type 'DataTable' could be found (are you missing a using directive or an assembly reference?)প্রতিস্থাপন পর dataTable.Merge(newTable);দ্বারাdataTable.Merge_it(newTable);
hatman

আপনি কোডটি একটি নতুন ক্লাসে রাখতে পারেন। শুধু class Merger {...}আমার কোড এবং কল চারপাশে রাখুন Merger.merge_it(...)। যদিও আপনাকে ইনপুট পরামিতি প্রস্তুত করতে হবে।
lzydrmr

... এবং আপনাকে usingঅবশ্যই অনুপস্থিত নির্দেশিকা যুক্ত করতে হবে। এটি কেবল একটি স্নিপেট (একটি কর্মসূচী প্রোগ্রাম থেকে)।
lzydrmr

টিআরসাল্টের উপরে পূর্বাভাসের পারফরম্যান্স সম্পর্কে আমি নিশ্চিত নই e নির্বাচন করুন, যা বড় ডেটাবেবলের জন্য খুব ধীর হয়ে যেতে পারে (ধরে নেওয়া tResult lect নির্বাচনটি হ'ল (এন), তারপরে ভবিষ্যদ্বাণীটির ফলে এটি একটি ও (এন ^ 2) মৃত্যুদন্ড কার্যকর করার সময়)
সাইট্রাসঅ 2

2

এটা চেষ্টা কর:

  1. টেবিল 1 এবং টেবিল 2 উভয় প্রশ্নের মধ্যে এনআরও 1 ক্ষেত্র অন্তর্ভুক্ত করুন
  2. টেবিল 1 এর জন্য এনআরএ 1 এর ডিফল্ট মান 0 নির্ধারণ করুন (ক্যোরিস্ট্রিংএসই সংশোধন করুন)

    উদাহরণস্বরূপ: নির্বাচন করুন এনআরও, 0 যেমন এনআরও 1, নাম, নাম, নামবি, ... ট্যাবলেট 1

  3. টেবিল 2 এর জন্য এনআরও-এর ডিফল্ট মান 0 নির্ধারণ করুন (ক্যোরির স্ট্রিংএফআই সংশোধন করুন)

    উদাহরণস্বরূপ: 0 এনআরও হিসাবে নির্বাচন করুন, এনআরও হিসাবে এনআরও 1, নাম, নাম, নামবি, ...... ট্যাবলেট 2

টেবিল 1 এর মতো দেখতে পাবেন:

NRO  NRO1   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
123   0     Fiat   Punto   500     J5        K4      O3      P4        O2         JT        1   1
133   0     Opel   Meriva  FTG     J5        K4      O3      P4        O2         JO        3   1

টেবিল 2 এর মতো দেখতে পাবেন:

NRO  NRO1   NAME   NAMEA   NAMEB   ADDRESS   POSTA   POSTN   POSTADR   COMPANYN   COUNTRY   ID  ACTIVE
0    423    Fiat   Punto   500     J5        K4      O3      P4        O2         JT        1   1
0    463    BMW    E64     SE0     JR        KE      OT      PG        OL         J8        9   1
  1. আপনি ইতিমধ্যে করছেন সারণীগুলি মার্জ করুন

নিম্নলিখিত কোডের লাইন যুক্ত করুন:

var carGroups = dataTable.AsEnumerable().GroupBy(row => new 
{
   Name = row.Field<string>("Name"),
   NameA = row.Field<string>("NAMEA"),
   NameB = row.Field<string>("NAMEB")
   //Other fields.....
});

DataTable result = dataTable.Clone();

foreach(var grp in carGroups)            
    result.Rows.Add(grp.Sum(r1 => r1.Field<int>("NRO")), grp.Sum(r2 => r2.Field<int>("NRO1")), grp.Key.Name, grp.Key.NameA, grp.Key.NameB);              
  1. পছন্দসই মানগুলির জন্য ডেটা টেবিল "ফলাফল" পরীক্ষা করুন

0

আপনি উভয় টেবিলে একই কলামের নাম রাখতে পারেন যদি তারা একই ধরণের সত্তাকে বোঝায় তবে এই কোডটি দেখুন

 private static void DemonstrateMergeTable()
{
    DataTable table1 = new DataTable("Items");

    // Add columns
    DataColumn idColumn = new DataColumn("id", typeof(System.Int32));
    DataColumn itemColumn = new DataColumn("item", typeof(System.Int32));
    table1.Columns.Add(idColumn);
    table1.Columns.Add(itemColumn);

    // Set the primary key column.
    table1.PrimaryKey = new DataColumn[] { idColumn };

    // Add RowChanged event handler for the table.
    table1.RowChanged += new 
        System.Data.DataRowChangeEventHandler(Row_Changed);

    // Add ten rows.
    DataRow row;
    for (int i = 0; i <= 9; i++)
    {
        row = table1.NewRow();
        row["id"] = i;
        row["item"] = i;
        table1.Rows.Add(row);
    }

    // Accept changes.
    table1.AcceptChanges();
    PrintValues(table1, "Original values");

    // Create a second DataTable identical to the first.
    DataTable table2 = table1.Clone();

    // Add column to the second column, so that the 
    // schemas no longer match.
    table2.Columns.Add("newColumn", typeof(System.String));

    // Add three rows. Note that the id column can't be the 
    // same as existing rows in the original table.
    row = table2.NewRow();
    row["id"] = 14;
    row["item"] = 774;
    row["newColumn"] = "new column 1";
    table2.Rows.Add(row);

    row = table2.NewRow();
    row["id"] = 12;
    row["item"] = 555;
    row["newColumn"] = "new column 2";
    table2.Rows.Add(row);

    row = table2.NewRow();
    row["id"] = 13;
    row["item"] = 665;
    row["newColumn"] = "new column 3";
    table2.Rows.Add(row);

    // Merge table2 into the table1.
    Console.WriteLine("Merging");
    table1.Merge(table2, false, MissingSchemaAction.Add);
    PrintValues(table1, "Merged With table1, schema added");
}

private static void Row_Changed(object sender, 
    DataRowChangeEventArgs e)
{
    Console.WriteLine("Row changed {0}\t{1}", e.Action, 
        e.Row.ItemArray[0]);
}

private static void PrintValues(DataTable table, string label)
{
    // Display the values in the supplied DataTable:
    Console.WriteLine(label);
    foreach (DataRow row in table.Rows)
    {
        foreach (DataColumn col in table.Columns)
        {
            Console.Write("\t " + row[col].ToString());
        }
        Console.WriteLine();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.