Просмотр исходного кода

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

Евгений Колесников 4 лет назад
Родитель
Сommit
75f05499d2
2 измененных файлов с 260 добавлено и 0 удалено
  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. Практическая работа «Разработка руководства пользователя программного средства по индивидуальному заданию»
 4. Практическая работа «Разработка руководства пользователя программного средства по индивидуальному заданию»
 5. Лабораторная работа «Изучение средств автоматизированного документирования»
 5. Лабораторная работа «Изучение средств автоматизированного документирования»
 
 
+# МДК. 05.02 Разработка кода ИС
+
+## Работа с БД
+
+1. [Знакомство с SQL](https://github.com/kolei/yotc/blob/master/articles/sql_for_beginner.md)
+
+<!--  
+ERD,
+импорт данных 
+дописать про update, delete -->
+
 # МДК. 05.03 Тестирование информационных систем
 # МДК. 05.03 Тестирование информационных систем
 
 
 [46+24]: ФГОС
 [46+24]: ФГОС