අමුතු වෙසක් දන්සැල

HAneo

Well-known member
  • Jan 30, 2007
    10,865
    23,413
    113
    Homagama
    එහෙනම් අද පොඩි පින් අතේ වැඩක් කරන්න කියලා හිතුවා. මෙච්චරකල් මම වැඩ ගත්ත බට්ටෙක් ගැන කියලා දෙන්න යන්නේ. ගන්න පුළුවන් දෙයක් අරගෙන තමනේ වැඩේ කරගන්න . බට්ටා තමා කෝඩ් ජෙනරෙටරේ. අපි සරලව ජෙනිය කියලා කියන්නේ.අපි බලමු ඇයි මේ වගේ එකක් ඕනේ සහ කරන පිළිවෙල. මේ වගේ එකක් හදන්න ටිකක් ඉන්දස්ට්‍රි එකේ එකපිසියන්ස් තියෙන්න ඕනේ. එත් තමන් දන්න ටිකෙන් මට්ටු කරලා එකක් ගහගන්න පුළුවන්.

    මේකේ ඉන්නවා සැහෙන්න ඇඩ්වාන්ස් නොලේජ් එකක් තියන අය . ඒ අය ඉවසන්න ඕනේ මොකද මේක ටිකක් අඩුම ලෙවල් එකේ ඉදන් බලන අයටත් තේරෙන්න ඕනේ නිසා ඉතාමත් සරලව දාන්නේ.

    1-png.127221



    ඇයි මෙහෙම එකක්
    ==============
    දැන් හිතන්න හෙන තඩි සිස්ටම් එකක් ගහන්න තියනවා. එකම විදිහේ ස්ක්‍රීන් ටොන් ගානක් හදන්න වෙනවා. ඒ වගේම එකම විදිහේ ක්ලාස් එහෙම හෙන තොගයක් ලියන්න තියනවා. මට මේ එකම දේ කරන එක පෙන්න බැරි නිසා ගහපු ටුල් එකක් මේක.


    මුලික දේ
    =======

    අපි මේකේ කරන්නේ එක සාම්පල් එකක් දුන්නාම එකේ වෙනස් වෙන්න ඕනේ දේවල් පිටින් අරන් ඒ හා සමාන තව දේවල් හදාගන්න එක නේ

    උදා: මගේ ඩේටා බේස් එකේ තියනවා ටේබල් 5 ක්

    1. Customer
    2. Products
    3. Countries
    4. Cities
    5. Currency

    දැන් මම මේ එකකට SQL Insert එකක් හදාගන්නවා
    උදා :


    Code:
    INSERT INTO Customers(column1, column2, column3, ...)
    VALUES (value1, value2, value3, ...);

    දැන් ඉතුරු 4 මේ වගේමනේ. ඉතින් අපි ගෙනරේටර් එක හදාගන්න ඕනේ මොකක්ද වෙනස් වෙන්න ඕනේ
    ටේබල් නේම් එක සහ කොලම් ටික. ඉතින් මේ වගේ ඩේටාබේස් එකේ තියන ටේබල් හරහා ගිහින් Insert එකක් හදාගන්න පුළුවන් ඔක්කොම ටේබල් වලට.

    දැන් බලනවා කොහොමද මේක වැඩි දියුණු කරන්නේ කියල. අපි මේ ඉන්සර්ට් එක Stroed Procedure එකක් ඇතුලට දාගන්නවා.

    Code:
    CREATE PROCEDURE InsertCustomer
           @XX            NVARCHAR(50)  = NULL   ,
           @XXX          DATETIME      = NULL   ,
           @XXXX        NVARCHAR(50)  = NULL   
    AS
    BEGIN
         SET NOCOUNT ON
    
    
         INSERT INTO dbo.Customer
              (                   
                XX                    ,
                XXX                   ,
                XXXX                     
              )
         VALUES
              (
                @XX                    ,
                @XXX                   ,
                @XXXX           
              )
    END
    GO

    දැන් මේකෙත් වෙනස් වෙන්න ඕනේ ටික බලලා අපිට පුළුවන් ඒ තැන වලට වෙන වෙන එකක් දාල ඔක්කොම ටික හදාගන්න .
    දැන් මේ උඩින් වෙන විදිහටම තමා ඔය Data Access Class සහ අනෙක් ක්ලාස් ඕනේ විදිහට හදාගන්නෙත්


    මේ වැඩේ කරන්න වින්ඩොව්ස් වල ෆයිල් සිස්ටම් එක ගැන දැනගෙන ඉන්න ඕනේ. ඒ වගේම ඒ ෆයිල් සිස්ටම් එකේ functions තමන් මේ ජෙනරේටර් එක හදන ලන්වේජ් එකෙන් හොදට මාස්ටර් කරලා ඉන්න ඕනේ . ස්ට්‍රීම් එකකට ඩේටා ලියලා පස්සේ ඒ ටික ඔක්කොම කොහොමදා පෙලගස්ස්වලා ෆයිල් එකක ලියන්නේ කියලා දැනුම හදාගන්න ඕනේ

    https://www.tutorialspoint.com/csharp/csharp_file_io.htm




    පටන් ගන්නේ කොහොමද?
    =======================
    මුලින්ම ඔයාට ඕනේ වෙනවා සිස්ටම් එකක් මුල ඉදන් ගහගන්න විදිහ ගැන පොඩි අදහසක්. ඉතා සරල උදාහරණයක් විදිහට මම service oriented architecture එක ගන්නම්. මේකේ සරල ස්ටෙප් ටික මේ වගේ. (SOA architecture එක මිට වඩා හුගක් ගැබුරු එකක්. එත් අපි මේ ගානට ගමු ).

    1. මුලින්ම ඩේටා බේස් එකේ ටේබල් ටික හදාගන්න වෙනවා (ඒ වගේම ස්ට්‍රෝඩ් ප්රෝසිදියර් වගේ දේවලුත් ඕනේ නම් පුළුවන් )
    2. ඒ ඩේටා Access කරන්න ක්ලාස් ටිකක් හදාගන්න වෙනවා
    3. ඒ ඩේටා වලින් අපේ බිස්නස් ලොජික් එක හැඩල් කරන්න රිපොසිටරි ගහගන්න වෙනවා (repository pattern එක දන්නේ නැත්නම් අහන්න කියල දෙන්නම් )
    4. දැන් ඒ රිපොසිටරි පාවිච්චි කරලා සර්විස් එන්ඩ් පොඉන්ට් හදාගන්න ඕනේ
    5. ඒ එන්ඩ් පොඉන්ට් පාවිච්චි කරලා Front End එකකුත් හදාගන්න ඕනේ (මේ පාට් එක මේකේ කියන්න යන්නේ නැ. ඕනේ නම් අහන්න )

    මුලින්ම කරන්න ඕනේ මේ විස්තර වලට අනුව තමන් දන්නා විදිහට සරල ප්‍රොජෙක්ට් එකක් හදාගන්න. ඕනේ නම් මේ පිළිවෙල නැතුව ඊට වඩා සරල කරලා හදාගන්න. ඕනේ නම් තව ඇඩ්වාන්ස් කරලා හදාගන්න. එකේ එක CRUD එකක් සම්පුර්නෙන් තිබා නම් ඇති.
    EX: Customer CRUD


    Gen.PNG


    1. මේ රුපයේ C# Repository generator එකෙන් තමා අපි අර උඩින් හදාගත්ත සාම්පල් ප්‍රොජෙක්ට් එකේ Repository ටික හදාගන්නේ. අපිට දෙනවා ඩේටාබේස් එක හෝ ටේබල් ලිස්ට් එකක් . එක හරහා ලුප් කරලා තමා මේ ටික හදාගන්නේ.
    2. DBMS Generator කියන්නේ ඩේටාබේස් එක පැත්තේ තියන ඔක්කොම ගෙනරේට් කරගන පුළුවන් පාට් එක.
    3. C# web Api Endpoint Generator මේකෙන් කරන්නේ front End එකේ පාවිච්චි කරන Endpoint ටික හදලා දෙන එක
    4. Main Code Generator මේකෙන් කරන්නේ අර උඩින් තියන ඔක්කොම ගෙනරටේ කරපු ටික පිළිවෙලට හදලා අවසාන එක දෙන එක. මොකද ඩේටාබේස් සහ Repository හදනකන් Endpoint හදන්න බැනේ. ඒවා හරියට බලන්නේ මේකෙන් තමා.
    මේ ස්ටෙප් 4 ම තියන දේවල් ඔයාලගේ ප්‍රොජෙට් එකේ ක්ලාස් එකක් විදිහට ලියාගන්න

    මේ ටික හදාගත්තාම අපිට පුළුවන් නේ backEnd එකේ පාට් එක ඉවර කරන්න. ඉතින් මේ ටික හදාගත්තට පස්සේ තමන් හදපු ලන්වේජ් එකෙන් මේක ඇරලා අඩු පාඩු බලන්න ඕනේ. මුලින් ලුප් එකේ යන්නේ නැතුව එකකට විතරක් කරලා එන Output එක බලන්න ඊට පස්සේ ජෙනරේට් වෙන කෝඩ් එක වැරදි අඩුපාඩු තියේ නම් ජෙනියේ අදාළ තැන් වනස් කරලා හදාගන්න. ෆයිනල් රිසල්ට් එක අවාම මුළු ඩේටා බේස් එක හරහාම යන්න. ගිහින් ඔක්කොම එක පාර හදලා අඩු පාඩු බලලා එජස් කරගන්න. එකෙන් ෆයිනල් ප්‍රොඩක්ට් එකක් එයි.


    ඔය විදිහේ සරලම එකෙන් පටන් ගත්තාම ඔයාල අලුතෙන් හොයාගන්න ටෙක්නොලොජි වගේම දේවල් වලට හරියන්න මේ ජෙනිය සදා අප්ඩේට් වෙන්න ඕනේ. ඒ වගේම මේ විදිහටම FrontEnd එකත් (Angular , PHP , JS ) ජෙනරේට් කරන ජෙනියක් හදාගන්න ඕනේ. එකට ඕනේ වෙන්නේ backend එකේ Endpoint ටික විතරයි.


    මේක තේරෙන්නේ නැත්නම් නැති තැන් කමෙන්ට් කරන්න උත්තර දෙන්නම්. ඒ වගේම යටින් යන කෝඩ් සාම්පල් ටික බලන්න එකෙන් සැහෙන උදව්වක් වෙයි. ඔයාල හොදටම දන්නා ලන්වේජ් එකක් අරන් පොඩියට පටන් ගන්න. තමන්ගේ එකක් හදාගන්න එක තමා වටින්නේ. එන ප්‍රශ්න කෙලින්ම දාන්න උත්තර දෙන්නම්

    මම පෙන්නලා තියන ජෙනිය ටිකක් ඇඩ්වාන්ස් එකක්. ඒක මම සැහෙන කාලෙක ඉදල දේවල් එකතු කරලා හදපු එකක්. ඒ වගේ තව ඒවා තියනවා ඉතින්. එකේ සෝස් එක දෙන්න බැරි තාම මම පාවිච්චි කරන නිසා සහ තව දෙන්නෙක් මගේ එක්ක ඉන්න නිසා. එත් උබලාට මේ වගේ එකකට යන්න මහා අමාරුවක් නැ .
     

    Attachments

    • 1.PNG
      1.PNG
      43.4 KB · Views: 1,061

    HAneo

    Well-known member
  • Jan 30, 2007
    10,865
    23,413
    113
    Homagama
    මේ වැඩේ තේරෙන්න මම සාම්පල කෝඩ් ටිකක් දෙන්නම්. මේක SQL සහ C# වලින් කරපු වැඩක්

    කොහොමද ඩේටා ටේබල් එකක් හරහා ගිහින් ඕනේ ටික ඔබ්ජෙක්ට් වලට පුරවා ගන්නේ
    -----------------------------------------------------------------------------------------------------------------------------------------------

    Code:
        private static void QueryTable(SqlConnection connection, Table table)
    
            {
    
                // Get a list of the entities in the database
    
                DataTable dataTable = new DataTable();
    
                SqlDataAdapter dataAdapter = new SqlDataAdapter(Utility.GetColumnQuery(table.Name), connection);
    
                dataAdapter.Fill(dataTable);
    
    
    
                foreach (DataRow columnRow in dataTable.Rows)
    
                {
    
                    Column column = new Column();
    
                    column.Name = columnRow["COLUMN_NAME"].ToString();
    
                    column.Type = columnRow["DATA_TYPE"].ToString();
    
                    column.Precision = columnRow["NUMERIC_PRECISION"].ToString();
    
                    column.Scale = columnRow["NUMERIC_SCALE"].ToString();
    
    
    
                    // Determine the column's length
    
                    if (columnRow["CHARACTER_MAXIMUM_LENGTH"] != DBNull.Value)
    
                    {
    
                        column.Length = columnRow["CHARACTER_MAXIMUM_LENGTH"].ToString();
    
                    }
    
                    else
    
                    {
    
                        column.Length = columnRow["COLUMN_LENGTH"].ToString();
    
                    }
    
    
    
                    // Is the column a RowGuidCol column?
    
                    if (columnRow["IS_ROWGUIDCOL"].ToString() == "1")
    
                    {
    
                        column.IsRowGuidCol = true;
    
                    }
    
    
    
                    // Is the column an Identity column?
    
                    if (columnRow["IS_IDENTITY"].ToString() == "1")
    
                    {
    
                        column.IsIdentity = true;
    
                    }
    
    
    
                    // Is columnRow column a computed column?
    
                    if (columnRow["IS_COMPUTED"].ToString() == "1")
    
                    {
    
                        column.IsComputed = true;
    
                    }
    
    
    
                    table.Columns.Add(column);
    
                }






    මේ තියෙන්නේ ටේබල් ඔක්කොම හරහා ගිහින් StoredProcedure සහ DataAccess ක්ලාස් හදාගන්න විදිහ.
    -------------------------------------------------------------------------------------------------------------------------------------
    Code:
                    foreach (Table table in tableList)
                    {
    
                        SqlGenerator.CreateSaveStoredProcedure(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
                        SqlGenerator.CreateInsertStoredProcedure(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
                        SqlGenerator.CreateUpdateStoredProcedure(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
                        SqlGenerator.CreateDeleteStoredProcedure(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
                        SqlGenerator.CreateDeleteAllByStoredProcedures(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
                        SqlGenerator.CreateSelectStoredProcedure(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
                        SqlGenerator.CreateSelectAllStoredProcedure(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
                        SqlGenerator.CreateSelectAllByStoredProcedures(databaseName, table, grantLoginName, storedProcedurePrefix, sqlPath, createMultipleFiles);
    
                        CsGenerator.CreateDataTransferClass(table, targetNamespace, dtoSuffix, csPath);
                        CsGenerator.CreateDataAccessClass(databaseName, table, targetNamespace, storedProcedurePrefix, daoSuffix, dtoSuffix, csPath);
                        CsGenerator.CreateFORMClasses(databaseName, table, targetNamespace, storedProcedurePrefix, daoSuffix, dtoSuffix, csPath);
                        table2 = table;
                        count++;
                        TableCounted(null, new CountEventArgs(count));
                    }


    මේ තියෙන්නේ උඩ ලුප් එකේ තිබ්බ CreateSaveStoredProcedure එකේ අතුල


    Code:
    public static void CreateSaveStoredProcedure(string databaseName, Table table, string grantLoginName,
    
                string storedProcedurePrefix, string path, bool createMultipleFiles)
    
            {
    
                // Create the stored procedure name
    
                string procedureName = Utility.FormatPascal(table.Name).Trim() + "Save";  //storedProcedurePrefix + table.Name + "Insert";
    
                string fileName;
    
                // Determine the file name to be used
    
                if (createMultipleFiles)
    
                {
    
                    path = Path.Combine(path, "SaveSPs");
    
                    fileName = Path.Combine(path, procedureName + ".sql");
    
                }
    
                else
    
                {
    
                    fileName = Path.Combine(path, "StoredProcedures.sql");
    
                }
    
                using (StreamWriter streamWriter = new StreamWriter(fileName, true))
    
                {
    
                    streamWriter.WriteLine("USE [" + databaseName + "]");
    
                    streamWriter.WriteLine("GO");
    
                    streamWriter.WriteLine("SET ANSI_NULLS ON");
    
                    streamWriter.WriteLine("GO");
    
                    streamWriter.WriteLine("SET QUOTED_IDENTIFIER ON");
    
                    streamWriter.WriteLine("GO");
    
                    streamWriter.WriteLine("CREATE PROCEDURE [dbo].[" + Utility.FormatPascal(table.Name) + "Save]");
    
    
    
                    streamWriter.WriteLine("/*** ***************************************************************************************************** ****/");
    
                    streamWriter.WriteLine("-- This procedure was Auto Genarated By A tool created by S.G. Asanga Chandrakumara");
    
                    streamWriter.WriteLine("-- On 11:30 AM 7/14/2015");
    
                    streamWriter.WriteLine("/*** ***************************************************************************************************** ****/");
    
                    streamWriter.WriteLine("");
    
    
    
                    // Create the parameter list
    
                    for (int i = 0; i < table.Columns.Count; i++)
    
                    {
    
                        Column column = table.Columns[i];
    
                        if (column.IsIdentity == false && column.IsRowGuidCol == false)
    
                        {
    
                            streamWriter.Write("\t" + Utility.CreateParameterString(column, true));
    
                            streamWriter.Write(",");
    
                            if (i < (table.Columns.Count - 1))
    
                            {
    
                                
    
                            }
    
                            streamWriter.WriteLine();
    
                        }
    
                    }
    
                    streamWriter.WriteLine("\[email protected]    int,");
    
                    streamWriter.WriteLine("\[email protected] int Output");
    
                    streamWriter.WriteLine("");
                    streamWriter.WriteLine("");
                }
            }


    මේ තියෙන්නේ උඩ ලුප් එකේ තිබ්බ DataTransferClass එකේ අතුල

    Code:
    public static void CreateDataTransferClass(Table table, string targetNamespace, string dtoSuffix, string path)
    
            {
    
                string className = Utility.FormatClassName(table.Name) + dtoSuffix;
    
    
    
                using (StreamWriter streamWriter = new StreamWriter(Path.Combine(path, className + ".cs")))
    
                {
    
                    // Create the header for the class
    
                    streamWriter.WriteLine("using System;");
    
                    streamWriter.WriteLine();
    
                    streamWriter.WriteLine("namespace " + targetNamespace);
    
                    streamWriter.WriteLine("{");
    
    
    
                    streamWriter.WriteLine("\tpublic class " + className);
    
                    streamWriter.WriteLine("\t{");
    
    
    
                    // Create an explicit public constructor
    
                    streamWriter.WriteLine("\t\t#region Constructors");
    
                    streamWriter.WriteLine();
    
                    streamWriter.WriteLine("\t\t/// <summary>");
    
                    streamWriter.WriteLine("\t\t/// Initializes a new instance of the " + className + " class.");
    
                    streamWriter.WriteLine("\t\t/// </summary>");
    
                    streamWriter.WriteLine("\t\tpublic " + className + "()");
    
                    streamWriter.WriteLine("\t\t{");
    
                    streamWriter.WriteLine("\t\t}");
    
                    streamWriter.WriteLine();
    
    
    
                    // Create the "partial" constructor
    
                    int parameterCount = 0;
    
                    streamWriter.WriteLine("\t\t/// <summary>");
    
                    streamWriter.WriteLine("\t\t/// Initializes a new instance of the " + className + " class.");
    
                    streamWriter.WriteLine("\t\t/// </summary>");
    
                    streamWriter.Write("\t\tpublic " + className + "(");
    
                    for (int i = 0; i < table.Columns.Count; i++)
    
                    {
    
                        Column column = table.Columns[i];
    
                        if (column.IsIdentity == false && column.IsRowGuidCol == false)
    
                        {
    
                            streamWriter.Write(Utility.CreateMethodParameter(column));
    
                            if (i < (table.Columns.Count - 1))
    
                            {
    
                                streamWriter.Write(", ");
    
                            }
    
                            parameterCount++;
    
                        }
    
                    }
    
                                    // Close out the class and namespace
    
                    streamWriter.WriteLine("\t}");
    
                    streamWriter.WriteLine("}");
    
                }
    
            }