Explorar o código

ссылка на лекцию по SQL

Евгений Колесников %!s(int64=4) %!d(string=hai) anos
pai
achega
75f05499d2
Modificáronse 2 ficheiros con 260 adicións e 0 borrados
  1. 249 0
      articles/5_2_0_0_mysql.md
  2. 11 0
      readme.md

+ 249 - 0
articles/5_2_0_0_mysql.md

@@ -0,0 +1,249 @@
+# Наметки интерфейса для MySQL
+
+"Тупой" вариант с выборкой всей таблицы
+
+```cs
+using MySql.Data.MySqlClient;
+using System;
+using System.Collections.Generic;
+
+namespace oap_labs
+{
+    class SomeTable
+    {
+        public int id { get; set; }
+        public string value { get; set; }
+    }
+
+    interface IDataProvider
+    {
+        IEnumerable<SomeTable> GetSomeTables();
+    }
+
+    class MockProvider : IDataProvider
+    {
+        private static IEnumerable<SomeTable> DummyData = new List<SomeTable> {
+            new SomeTable { id = 3, value = "333" },
+            new SomeTable { id = 4, value = "444" },
+        };
+
+        public IEnumerable<SomeTable> GetSomeTables()
+        {
+            return DummyData;
+        }
+    }
+
+    class MySQLProvider : IDataProvider
+    {
+        private MySqlConnection conn;
+
+        public MySQLProvider() 
+        {
+            try
+            {
+                conn = new MySqlConnection("Server=kolei.ru;Database=test;port=3306;User Id=test;password=piris253;");
+                conn.Open();
+            } catch(Exception e)
+            {
+                Console.WriteLine($"Conn open error: {e.Message}");
+            }
+        }
+
+        ~MySQLProvider()
+        {
+            conn?.Close();
+        }
+
+        public IEnumerable<SomeTable> GetSomeTables()
+        {
+            var res = new List<SomeTable>();
+            MySqlCommand command = new MySqlCommand("SELECT id,value FROM test WHERE id=@id", conn);
+            //command.Parameters.Add( new MySqlParameter("@id", MySqlDbType.Int32) { Value = 1 } );
+            command.Parameters.Add("@id", MySqlDbType.Int32).Value = 1;
+            MySqlDataReader reader = command.ExecuteReader();
+
+            //int rowCount = command.ExecuteNonQuery(); - если ответ не нужен (insert, delete, update)
+
+            try
+            {
+                while (reader.Read())
+                    res.Add(new SomeTable { id = reader.GetInt32(0), value = reader.GetString(1) });
+            }
+            finally
+            {
+                reader.Close();
+            }
+            return res;
+        }
+    }
+
+    class Globals
+    {
+        public static IDataProvider DataProvider;
+    }
+
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            Globals.DataProvider = new MySQLProvider();
+            //Globals.DataProvider = new MockProvider();
+
+            var Items = Globals.DataProvider.GetSomeTables();
+            foreach (var Item in Items)
+                Console.WriteLine($"{Item.id}, {Item.value}");
+
+            Console.ReadKey();
+        }
+    }
+}
+```
+
+
+Продвинутый вариант с билдером и универсальным селектом
+
+```cs
+using MySql.Data.MySqlClient;
+using System;
+using System.Collections.Generic;
+
+namespace oap_labs
+{
+    class Test
+    {
+        public int id { get; set; }
+        public string value { get; set; }
+    }
+
+    interface IDataProvider
+    {
+        IDataProvider From(string TableName);
+        IDataProvider Where(Dictionary<string, string> Params);
+        IEnumerable<Object> Select(Type type, params string[] Fields);
+    }
+
+    /*class MockProvider : IDataProvider
+    {
+        private static IEnumerable<SomeTable> DummyData = new List<SomeTable> {
+            new SomeTable { id = 3, value = "333" },
+            new SomeTable { id = 4, value = "444" },
+        };
+
+        public IEnumerable<SomeTable> GetSomeTables()
+        {
+            return DummyData;
+        }
+    }*/
+
+    class MySQLProvider : IDataProvider
+    {
+        private MySqlConnection conn;
+
+        private string WhereString = "";
+        private string TableName = "";
+
+        public MySQLProvider() 
+        {
+            try
+            {
+                conn = new MySqlConnection("Server=kolei.ru;Database=test;port=3306;User Id=test;password=piris253;");
+                conn.Open();
+            } catch(Exception e)
+            {
+                Console.WriteLine($"Conn open error: {e.Message}");
+            }
+        }
+
+        ~MySQLProvider()
+        {
+            conn?.Close();
+        }
+
+        public IDataProvider From(string TableName)
+        {
+            this.TableName = TableName;
+            WhereString = "";
+            return this;
+        }
+
+        public IEnumerable<Object> Select(Type type, params string[] Fields)
+        {
+            var res = new List<Object>();
+
+            string query = "";
+
+            if (Fields.Length == 0)
+                query = "SELECT *";
+            else
+            {
+                foreach (string Field in Fields)
+                    query += (query == "" ? "" : ",") + Field;
+
+                query = $"SELECT {query}";
+            }
+
+            query = $"{query} FROM {TableName}";
+
+            if (WhereString != "")
+                query = $"{query} WHERE {WhereString}";
+
+            MySqlCommand command = new MySqlCommand(query, conn);
+            MySqlDataReader reader = command.ExecuteReader();
+
+            try
+            {
+                while (reader.Read()) {
+                    var newItem = Activator.CreateInstance(type);
+                    for (var i = 0; i < Fields.Length; i++)
+                        newItem.GetType().GetProperty(Fields[i]).SetValue(newItem, reader.GetValue(i));
+                    res.Add(newItem);
+                }
+            }
+            finally
+            {
+                reader.Close();
+            }
+
+            return res;
+        }
+
+        public IDataProvider Where(Dictionary<string, string> Params)
+        {
+            WhereString = "";
+            foreach (KeyValuePair<string, string> keyValue in Params)
+            {
+                WhereString += (WhereString == "" ? "" : " and ") + $"{keyValue.Key}=\"{keyValue.Value}\"";
+            }
+
+            WhereString = $"({WhereString})";
+            return this;
+        }
+    }
+
+    class Globals
+    {
+        public static IDataProvider DataProvider;
+    }
+
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            Globals.DataProvider = new MySQLProvider();
+            //Globals.DataProvider = new MockProvider();
+
+            var Items = Globals.DataProvider
+                .From("test")
+                .Where(new Dictionary<string, string> {
+                    ["value"] = "one"
+                })
+                .Select(typeof(Test), "value", "id");
+
+            foreach (Test Item in Items)
+                Console.WriteLine($"{Item.id}, {Item.value}");
+
+            Console.ReadKey();
+        }
+    }
+}
+```

+ 11 - 0
readme.md

@@ -204,6 +204,17 @@ http://sergeyteplyakov.blogspot.com/2014/01/microsoft-fakes-state-verification.h
 4. Практическая работа «Разработка руководства пользователя программного средства по индивидуальному заданию»
 5. Лабораторная работа «Изучение средств автоматизированного документирования»
 
+# МДК. 05.02 Разработка кода ИС
+
+## Работа с БД
+
+1. [Знакомство с SQL](https://github.com/kolei/yotc/blob/master/articles/sql_for_beginner.md)
+
+<!--  
+ERD,
+импорт данных 
+дописать про update, delete -->
+
 # МДК. 05.03 Тестирование информационных систем
 
 [46+24]: ФГОС