コード例 #1
0
        private void Button_Click(object sender, EventArgs e)
        {
            if (databaseType == 1)
            {
                connectionString = @"Data Source =..\..\..\licences.db; Version = 3; ";
            }
            else if (databaseType == 2)
            {
                connectionString = "server = DELL; uid = data; pwd = !@#qazWSX; database = Data_quality";
            }
            data = LoadData();
            //Grafa izveide
            var graph = LoadGraph();
            // Glabājas virsotnes koka apstaigāšanai
            Stack <Node> nodeStack = new Stack <Node>();
            //Glabājam zarošanos ceļu skaitu, lai zinātu, kurā brīdī skatīties apvienošanas mezglu
            Stack <int> branchCountStack = new Stack <int>();
            //Glabājam zarošanās virsotnes, lai zinātu zarošanās noacījumus
            Stack <ZarosanasNode> branchNode = new Stack <ZarosanasNode>();
            int           branchCounter      = 0;
            StringBuilder code = new StringBuilder();

            // Iegūst sākuma virsotni un ieliek to iekš steka
            Node node = graph.getNodeByType(Type.Sakums);
            // Glabāsim aktuālo zarošanās virsotni
            ZarosanasNode zarosanasNode = null;

            nodeStack.Push(node);



            //Koda sākumā jābūt jau nodefinētām lietām
            // Priekš C#
            if (codeType == 1)
            {
                code.AppendLine(@"using System; using System.Text.RegularExpressions; using System.Diagnostics; using System.Data; using System.Linq;");
                code.AppendLine(@"public  class Valid {
                  public long id;
                 ");

                // Ejam cauri parametriem un pieliekam tos kodam
                if (graphInformation.Tables[3].Rows.Count > 0)
                {
                    foreach (DataRow row in graphInformation.Tables[3].Rows)
                    {
                        code.AppendLine("public " + row.ItemArray[1] + ";");
                    }
                }


                // Pieliekam SendMessages, konstruktoru un validatora sākumu
                code.AppendLine(@" 
                public DataTable data = new DataTable();
                public Valid()
                {        
                    data.Columns.Add(""rowid"", typeof(long));
                    data.Columns.Add(""error"", typeof(string));
                }
                private void SendMessage(long rowid, long errornum)
                {
                    DataRow dr = data.NewRow();
                    dr[""rowid""] = rowid;
                    dr[""error""] = errornum.ToString();
                    data.Rows.Add(dr);
                }
                 public void Validator () 
                 { ");
            }
            // Priekš SQL
            else if (codeType == 2)
            {
                code.AppendLine(@"using System;using System.Data.SqlClient; using System.Data;");
                code.AppendLine(@"public class Valid {
                        private DataTable data = new DataTable(); 
                        public void Validator ()
                        {
                            using (var connection = new SqlConnection(""" + connectionString + @""") )
                             {      connection.Open();
                                     using (var adapter = new SqlDataAdapter())
                                        {
                                             using (var cmd = new SqlCommand())
                                             {        cmd.Connection = connection;");
            }
            //Ejam caur grafu un būvējam validatora kodu
            while (nodeStack.Count != 0)
            {
                node = nodeStack.Pop();


                switch (node.type)
                {
                case Type.Sakums:
                    break;

                case Type.Beigas:
                    break;

                case Type.Zarosanas:

                    zarosanasNode = (ZarosanasNode)node;
                    //Pieglabājam zarošanās virsotni iekš steka
                    branchNode.Push(zarosanasNode);

                    // Vajadzētu kaimiņus likt, lai else zars būtu pēdējais, tas ir iekš steka
                    zarosanasNode.Neighbors.Reverse();
                    //zarosanasNode.Branch.Reverse();

                    //saliekam cik zari ir
                    if (branchCounter != 0)
                    {
                        // Nozīmē, ka ir izveidojusies jauna zarošanās, kā rezultātā, vecā vērtība jāpieglabā
                        branchCountStack.Push(branchCounter);
                    }
                    // Piešķir, lai zinātu, cik zariem jāiet cauri, lai drīkstētu apskatīt apvienošanas virsotnes bērnus/kaimiņus
                    branchCounter = zarosanasNode.Neighbors.Count;

                    //Atkarībā no bērnu skaita var zināt, vai ir vairāki zari, vai tikai divi (attiecīgi true un false)
                    if (zarosanasNode.Neighbors.Count == 2)
                    {
                        code.AppendLine("//" + zarosanasNode.informal);
                        // C# gadījuma (codetype == 1) nosacījums ir uzreiz if'ā
                        // SQL gadījumā (codetype == 2) nosacījums ir jāieliek datu tabulā un jāizpilda
                        if (codeType == 1)
                        {
                            code.AppendLine(@"if(" + zarosanasNode.formal + ")")
                            .AppendLine(@"{");
                        }
                        else if (codeType == 2)
                        {
                            code.AppendLine(@"
                                    cmd.CommandText = @""" + zarosanasNode.formal + @""";
                                    adapter.SelectCommand = cmd;
                                    adapter.Fill(data);
                                    // Pārbaudam vai kat kas atbilst nosacījumiem
                                    if ( data.Rows.Count > 0) 
                                        { 
                                    


                                ");
                        }
                    }
                    else if (zarosanasNode.Neighbors.Count > 2)
                    {
                        code.AppendLine("//" + zarosanasNode.informal);
                        code.AppendLine(@"if(" + zarosanasNode.formal + "" + zarosanasNode.Branch[0] + ")")
                        .AppendLine(@"{");

                        // Nometam izmantoto branch nosacījumu
                        zarosanasNode.Branch.RemoveAt(0);
                    }

                    break;

                case Type.Darbiba:
                    DarbibaNode darbibaNode = (DarbibaNode)node;
                    // Darbības, kas jāizdara
                    // Ja ir SQL (codetype == 2) , tad ir jāveido insert
                    if (codeType == 1)
                    {
                        code.AppendLine(@"" + darbibaNode.name + ";");
                    }
                    else if (codeType == 2)
                    {
                        code.AppendLine(@"
                            cmd.CommandText = """ + darbibaNode.name + @""";
                            cmd.ExecuteNonQuery();
                            ");
                    }

                    break;

                case Type.Apvienosana:
                    // Ja vēl ir nepaskatīti zari jāturpina darbība
                    if (branchCounter != 0)
                    {
                        branchCounter--;
                        code.AppendLine(@"} ");
                        // Nodrošina, ka nekas jauns netiek pievienots, ja apskatīti visi zari
                        if (branchCounter == 0)
                        {
                            // Ja ir SQL (codetype == 2), tad ir pēc visu zaru apskatīšanas jāiztīra dataset
                            if (codeType == 2)
                            {
                                code.AppendLine(@"
                                       data.Clear();     
                                    ");
                            }
                            break;
                        }

                        // apskatām zarošanās node, lai zinātu, kas pa nosacījumu jāģenerē tālāk
                        else if (zarosanasNode.Neighbors.Count == 2)
                        {
                            code.AppendLine(@"else")
                            .AppendLine(@"{");
                        }
                        else if (zarosanasNode.Neighbors.Count > 2)
                        {
                            // Ja nav palicis tikai else zars, tad jāveido else if
                            if (zarosanasNode.Branch.Count > 1)
                            {
                                code.AppendLine(@"else if(" + zarosanasNode.formal + "" + zarosanasNode.Branch[0] + ")")
                                .AppendLine(@"{");
                            }
                            else
                            {
                                code.AppendLine(@"else")
                                .AppendLine(@"{");
                            }


                            // Nometam izmantoto branch nosacījumu
                            zarosanasNode.Branch.RemoveAt(0);
                        }

                        continue;
                    }
                    // Ja visi zari ir apskatīti, bet vēl ir cita zarošanās, kas ir virszarošanās, kas notika, tad jāiet atpakaļ uz to
                    else if (branchCounter == 0 && branchCountStack.Count > 0)
                    {
                        branchCounter = branchCountStack.Pop();
                        branchCountStack.Pop();
                    }


                    break;

                default:
                    break;
                }

                // Saliekam virstotnes, kas būs jāapskata
                foreach (var neighbor in node.Neighbors)
                {
                    nodeStack.Push(neighbor);
                }
            }

            //Pabeidzam funkcijas un klases definīciju
            if (codeType == 1)
            {
                code.AppendLine(@"
                        } 
                }");
            }
            else if (codeType == 2)
            {
                code.AppendLine(@"              }
                                    } 
                            } 
                    }
                }");
            }



            var compileResults = Compile(code.ToString(), "System.dll", "System.Data.dll", "System.Text.RegularExpressions.dll", "System.Linq.dll", "System.Core.dll", "System.Xml.dll");
            var assembly       = compileResults.CompiledAssembly;
            var type           = assembly.GetType("Valid");
            var method         = type.GetMethod("Validator");
            var instance       = Activator.CreateInstance(type);

            // Ja ir SQL, tad nav datu objekta
            if (codeType == 1)
            {
                //validējam katru rindu
                foreach (DataRow row in data.Rows)
                {
                    foreach (FieldInfo field in type.GetFields())
                    {
                        // data lauks nav jāapskata
                        if (field.Name == "data")
                        {
                            continue;
                        }
                        type.GetField(field.Name)
                        .SetValue(instance, row[field.Name] == DBNull.Value ?
                                  default(string) : row[field.Name]);
                    }
                    // zinām ka jābūt ID, kas nav nodefinēts datu objektā
                    //type.GetField("id").SetValue(instance, row["id"]);

                    method.Invoke(instance, null);
                }
                // J kaut kas ir ievietots datu tabulā (ir izmantots SendMessages) ir jāveic ievietošana serverī
                if (((DataTable)type.GetField("data").GetValue(instance)).Rows.Count > 0)
                {
                    // Pārkopējam visas kļūdas uz serveri
                    SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString);
                    //Kartējam datu tabulas kolonnas uz servera kolonnām, zināms, ka vienmēr būs 2 kolonnas
                    // datubazē ir identity kolonna kuras vērtības neievietojam
                    bulkCopy.ColumnMappings.Add(0, 1);
                    bulkCopy.ColumnMappings.Add(1, 2);

                    bulkCopy.DestinationTableName = "registerLV_errors_c#";
                    bulkCopy.WriteToServer((DataTable)type.GetField("data").GetValue(instance));
                }
            }
            else
            {
                method.Invoke(instance, null);
            }
        }
コード例 #2
0
        Graph LoadGraph()
        {
            // Iegūst nepieciešamo informāciju grafa izveidei
            graphInformation = new DataSet();

            using (var connection = new SQLiteConnection(@"Data Source=" + graphDiagram + ";Version=3;"))
            {
                connection.Open();

                using (var adapter = new SQLiteDataAdapter())
                {
                    using (var cmd = new SQLiteCommand())
                    {
                        cmd.Connection        = connection;
                        cmd.CommandText       = @"
                            
                            SELECT Node.ID, Node.Type FROM Node
                            WHERE Node.DiagramId = 14;

                            SELECT Node.ID ,Compartment.Type 'Text', Compartment.Value FROM Node
                            LEFT JOIN Compartment ON Node.ID = Compartment.ElementId
                            WHERE Node.DiagramId = 14;

                            SELECT Edge.ID, Edge.StartNodeId, Edge.EndNodeId, Compartment.Value  FROM Edge
                            Join Compartment ON Edge.ID = Compartment.ElementId
                            WHERE  Edge.DiagramId = 14 AND Edge.Type like 'Pareja' AND Compartment.Type like 'Name' ;

                            --- Savienojam Compartment pašu ar sevi, lau uzreiz iznāktu mainīgais
                            SELECT Node.Id,  c1.Value || "" "" || C2.Value AS 'Variables', C2.Value AS 'Parameter' FROM Node
                            JOIN Compartment c1, Compartment c2 ON Node.ID = c1.ElementId AND Node.ID = c2.ElementId
                            WHERE c1.ElementType = 'Parametrs'  AND c2.Type = 'Name' AND c1.Type = 'Type' AND Node.DiagramId = 
                                    (
                                           SELECT ID FROM Diagram
                                           WHERE Diagram.NodeId =
                                           (SELECT Compartment.ElementId FROM Compartment WHERE Compartment.ElementType <> 'Sakums' AND(SELECT replace(Compartment.Value, "" "", """")) like
                                           (SELECT REPLACE((SELECT Compartment.Value FROM Node JOIN Compartment ON Node.Id = Compartment.ElementId WHERE Node.DiagramId = 14 AND Compartment.ElementType = 'Sakums'), "" "", """")))
		                            )
						

                       
							
                            
                          
                            
                            
                            ";
                        adapter.SelectCommand = cmd;
                        adapter.Fill(graphInformation);
                        graphInformation.Tables[0].TableName = "Node";
                        graphInformation.Tables[1].TableName = "Compartment";
                        graphInformation.Tables[2].TableName = "Edge";
                        graphInformation.Tables[3].TableName = "Parametrs";

                        graphInformation.Tables[0].PrimaryKey = new DataColumn[] { graphInformation.Tables[0].Columns["ID"] };
                        graphInformation.Tables[1].PrimaryKey = new DataColumn[] { graphInformation.Tables[1].Columns["ID"], graphInformation.Tables[1].Columns["Text"] };
                        graphInformation.Tables[2].PrimaryKey = new DataColumn[] { graphInformation.Tables[2].Columns["ID"], graphInformation.Tables[2].Columns["StartNodeId"], graphInformation.Tables[2].Columns["EndNodeId"] };
                        graphInformation.Tables[3].PrimaryKey = new DataColumn[] { graphInformation.Tables[3].Columns["ID"] };
                    }
                }
            }

            var graph = new  Graph();

            //Saliek grafa virsotnes

            foreach (DataRow row in graphInformation.Tables[0].Rows)
            {
                if (row.ItemArray[1].ToString() == "Sakums")
                {
                    graph.AddNode((long)row.ItemArray[0], Type.Sakums);
                }
                else if (row.ItemArray[1].ToString() == "Beigas")
                {
                    graph.AddNode((long)row.ItemArray[0], Type.Beigas);
                }
                else if (row.ItemArray[1].ToString() == "Apvienosana")
                {
                    graph.AddNode((long)row.ItemArray[0], Type.Apvienosana);
                }
                else if (row.ItemArray[1].ToString() == "Darbiba")
                {
                    graph.AddNode((long)row.ItemArray[0], Type.Darbiba, graphInformation.Tables[1].Rows.Find(new object[] { row.ItemArray[0], "Activity" }).ItemArray[2].ToString()
                                  );
                }

                else if (row.ItemArray[1].ToString() == "Zarosanas")
                {
                    graph.AddNode((long)row.ItemArray[0], Type.Zarosanas,
                                  graphInformation.Tables[1].Rows.Find(new object[] { row.ItemArray[0], "Informal" }).ItemArray[2].ToString(),
                                  graphInformation.Tables[1].Rows.Find(new object[] { row.ItemArray[0], "Formal" }).ItemArray[2].ToString());
                }
            }

            /// Saliek saites grafa virsotnēm

            foreach (Node node in graph.Nodes)
            {
                //Iegūst rindas ar pārejām, kas saistītas ar notiekto virsotni
                var edgeRow = (from edge in graphInformation.Tables[2].AsEnumerable()
                               where  edge.Field <long>("StartNodeId") == node.ID
                               select edge).ToList();


                switch (node.type)
                {
                case Type.Sakums:

                    graph.AddDirectedEdge(node, graph.getNodeByID(edgeRow[0].Field <long>("EndNodeId")));

                    break;

                case Type.Beigas:

                    break;

                case Type.Zarosanas:
                    var           elseNode      = node;
                    ZarosanasNode zarosanasNode = (ZarosanasNode)node;
                    foreach (var edge in edgeRow)
                    {
                        // Izdalām kas aiziet uz kuru zaru
                        if (edge.Field <String>("Value") != "" && edge.Field <long>("StartNodeId") == node.ID)
                        {
                            graph.AddDirectedEdge(node, graph.getNodeByID(edge.Field <long>("EndNodeId")));
                            // Vajag zināt kas ir uz zarošanās līnijas rakstīts
                            zarosanasNode.Branch.Add(edge.Field <String>("Value"));
                        }
                        else if (edge.Field <String>("Value") == "" && edge.Field <long>("StartNodeId") == node.ID)
                        {
                            // Nodrošina, ka else zars vienmēr ir sarakstā pēdējais

                            elseNode = graph.getNodeByID(edge.Field <long>("EndNodeId"));
                        }
                    }
                    // Ieliekam else zaru pašās beigās
                    graph.AddDirectedEdge(node, elseNode);
                    //zarosanasNode = (ZarosanasNode)elseNode;
                    zarosanasNode.Branch.Add("Else");

                    break;

                case Type.Darbiba:
                    foreach (var edge in edgeRow)
                    {
                        //if (edge.Field<String>("Value") == "OK" && edge.Field<long>("EndNodeId") == node.ID)
                        //{
                        //   // node.branch = Branch.Ok;
                        //}
                        //else if (edge.Field<String>("value") == "NO" && edge.Field<long>("EndNodeId") == node.ID)
                        //{
                        //    //node.branch = Branch.No;
                        //}
                        //else if (edge.Field<String>("value") == "" && edge.Field<long>("EndNodeId") == node.ID)
                        //{
                        //    continue;
                        //}
                        //else
                        //{
                        //    graph.AddDirectedEdge(node, graph.getNodeByID(edge.Field<long>("EndNodeId")));
                        //}
                        graph.AddDirectedEdge(node, graph.getNodeByID(edge.Field <long>("EndNodeId")));
                    }
                    break;

                case Type.Apvienosana:
                    foreach (var edge in edgeRow)
                    {
                        //if (edge.Field<String>("Value") == "OK" && edge.Field<long>("EndNodeId") == node.ID)
                        //{
                        //    //node.branch = Branch.Ok;
                        //}
                        //else if (edge.Field<String>("value") == "NO" && edge.Field<long>("EndNodeId") == node.ID)
                        //{
                        //    //node.branch = Branch.No;
                        //}
                        //else if (edge.Field<String>("value") == "" && edge.Field<long>("EndNodeId") == node.ID)
                        //{
                        //    continue;
                        //}
                        //else
                        //{
                        //    graph.AddDirectedEdge(node, graph.getNodeByID(edge.Field<long>("EndNodeId")));
                        //}

                        graph.AddDirectedEdge(node, graph.getNodeByID(edge.Field <long>("EndNodeId")));
                    }
                    break;
                }

                Console.Write(node.ID);
            }


            return(graph);
        }