У цій статті ви дізнаєтеся, що таке LINQ і як за допомогою нього робити запити до списків.

Що таке LINQ? Language Integrated Query (LINQ) - мова інтегрованих запитів, точніше неоднозначний проект Microsoft з додавання синтаксису мови запитів схожий на SQL. Специфічне визначення за допомогою цього інструменту можна відносно просто створювати запити до таблиць і списків даних, не обов'язково до бази даних.

У прикладах Microsoft упускається одна маленька, але важлива деталь. Для роботи з набором даних потрібно використовувати структуру DataContext, визначення якої можна отримати за допомогою SPMetal.exe для списку або бібліотеки присутньої на сервері Sharepoint. Іншими словами, нам спочатку необхідно визначити цей тип даних, а потім вже створювати запит. Взагалі рекомендую скористатися спеціальною утилітоюдля роботи в MVS: Imtech Get SPMetal Definition Extension.

Для роботи нам знадобиться якийсь список. Скористаємося простим списком- "список, що налаштовується"; назва - "Просте звернення"; За замовчуванням: Номер, Назва.

І так, давайте створимо просту (дивіться відповідну сторінку), за допомогою якої спостерігатимемо результат наших маніпуляцій. При створенні проекту виберемо ізольовану модель довіри, якщо є необхідність працювати зі списками або даними інших вузлів, тоді потрібно створювати проект для ферми.

Далі створимо файл клас "ПростеЗвернення.cs" за допомогою SPMetal.exe або плагіна для студії. Додамо посилання на бібліотеку Microsoft. Sharepoint. Linq. Більше детальну інформаціюможна отримати на сайті MSDN.

Створимо функцію Render та my_mess. У останньої функціїформуватимемо дані для відображення.

// перевантажуємо функцію
protected override void Render(HtmlTextWriter writer)
{
base .Render(writer);
my_mess(writer);
}

// Наша функція для роботи зі списком
public void my_mess(HtmlTextWriter writer)
{
// Створимо контекст
DataContext data = new DataContext("http://localhost");
// Зв'яжемо його з відповідним списком на сайті докорінно
EntityList<Элемент>Simple_Message = data.GetList<Элемент>("Просте звернення");
// Виконаємо запит - виберемо всі рядки зі списку "Просте звернення"
var query = від mess в Simple_Message
select mess;
// Відобразимо всі дані з результату запиту
foreach (var elem in query)
{
writer.WriteLine( "Елемент списку:"+ elem.Назва.ToString());
writer.WriteBreak();
}

}

Компілюємо проект і додаємо на сторінку. В результаті з'являться всі рядки, що знаходяться у списку.

Продовження пізніше (стаття не закінчена).

Приклад створення локальної бази даних Microsoft SQL Server вMS Visual Studio

У цій темі показано рішення задачі створення бази даних типу SQL Server за допомогою MS Visual Studio. Розглядаються такі питання:

  • робота з вікном Server Explorer у MS Visual Studio;
  • створення локальної бази даних типу SQL Server Database;
  • створення таблиць у базі даних;
  • редагування структур таблиць;
  • зв'язування таблиць бази даних між собою;
  • внесення даних у таблиці засобами MS Visual Studio.

Умова завдання

Використовуючи засоби MS Visual Studio, створити базу даних типу MS SQL Server з ім'ям Education. База даних містить дві таблиці Student та Session. Таблиці між собою пов'язані деяким полем.

Структура першої таблиці "Student".

Структура другої таблиці "Session".

Виконання

1. Завантажити MS Visual Studio.

2. АктивувативікноServer Explorer.

Для роботи з базами даних корпорація Microsoft пропонує полегшений сервер баз даних Microsoft SQL Server. Існують різні версії Microsoft SQL Server, наприклад: Microsoft SQL Server 2005, Microsoft SQL Server 2008, Microsoft SQL Server 2014 та інші версії.

Завантажити ці версії можна з сайту Microsoft www.msdn.com.

Цей сервер добре підходить для роботи з базами даних. Він безкоштовний і має графічний інтерфейс для створення та адміністрування баз даних за допомогою SQL Server Management Tool.

Перш за все, перед створенням бази даних потрібно активувати утиліту Server Explorer . Для цього в MS Visual Studio потрібно викликати (рис. 1)

View -> Server Explorer

Мал. 1. Виклик Server Explorer

Після виклику вікно Server Explorer матиме приблизний вигляд, як показано на малюнку 2.

Мал. 2. Вікно Server Explorer

3. Створення бази даних “Education”.

Щоб створити нову базу даних, що базується на постачальнику даних Microsoft SQL Server, потрібно клацнути на вузлі Data Connections, а потім вибрати “ Create New SQL Server Database …” (рис. 3).

Мал. 3. Виклик команди створення бази даних SQL Server

В результаті відкриється вікно. Create New SQL Server Database»(рис. 4).

У вікні (у полі "Server Name") вказується ім'я локального серверана комп'ютері. У нашому випадку це ім'я “SQLEXPRESS”.

У полі «New database name: » вказується ім'я бази даних, що створюється. У нашому випадку, це ім'я Education.

Опцію Use Windows Autentification потрібно залишити без змін та натиснути кнопку OK.

Мал. 4. Створення нової базиданих SQL Server 2008 Express за допомогою MS Visual Studio 2010

Після виконаних дій, вікно Server Explorer набуде вигляду, як показано на малюнку 5. Як видно з малюнка 5, до списку наявних баз даних додано базу даних Education з ім'ям

sasha-pc\sqlexpress.Education.dbo

Мал. 5. Вікно Server Explorer після додавання бази даних Education

4. Об'єкти бази даних Education.

Якщо розгорнути базу даних Education (знак «+»), можна побачити список з наступних основних об'єктів:

  • Database Diagrams – діаграми бази даних. Діаграми показують зв'язки між таблицями бази даних, відносини між полями різних таблиць тощо;
  • Tables - таблиці, в яких містяться дані бази даних;
  • Views – уявлення. Відмінність між уявленнями та таблицями полягає в тому, що таблиці баз даних містять дані, а уявлення даних не містять їх, а вміст вибирається з інших таблиць або уявлень;
  • Stored procedures – процедури, що зберігаються. Вони є групою зв'язаних операторів мовою SQL, що забезпечує додаткову гнучкість під час роботи з базою даних.

5. Створення таблиці Student.

на даний моментбаза даних Education абсолютно порожня і не містить жодних об'єктів (таблиць, збережених процедур, уявлень тощо).

Щоб створити таблицю, потрібно викликати контекстне меню (клік правою кнопкоюмишки) і вибрати команду "Add New Table" (рисунок 6).

Мал. 6. Команда додавання нової таблиці

Існує й інший варіант додавання таблиці бази даних за допомогою команд меню Data:

Data -> Add New -> Table

Мал. 7. Альтернативний варіантдодавання нової таблиці

В результаті відкриється вікно додавання таблиці, яке містить три стовпці (рисунок 8). У першому стовпці Column Name потрібно ввести назву відповідного поля таблиці бази даних. У другому стовпці "Data Type" необхідно ввести тип даних цього поля. У третьому стовпці Allow Nulls вказується опція про можливість відсутності даних у полі.

Мал. 8. Вікно створення нової таблиці

За допомогою редактора таблиць потрібно сформувати таблицю Student як зображено малюнку 9. Ім'я таблиці потрібно задати під час її закриття.

У редакторі таблиць можна задавати властивості полів у вікні Column Properties. Щоб задати довжину рядка (nvchar) у символах, у вікні Column Properties є властивість Length. За промовчанням значення цієї властивості дорівнює 10.

Мал. 9. Таблиця Student

Наступним кроком слід задати ключове поле. Це здійснюється викликом команди “Set Primary Key” з контекстного менюполя Num_book. За допомогою ключового поля буде встановлено зв'язок між таблицями. У нашому випадку ключовим полем є номер залікової книжки.

Мал. 10. Завдання ключового поля

Після встановлення первинного ключа вікно таблиці матиме вигляд як зображено малюнку 11.

Мал. 11. Таблиця Student після остаточного формування

Тепер можна закрити таблицю. У вікні збереження таблиці необхідно задати її ім'я – Student (рис. 12).

Мал. 12. Введення імені таблиці Student

6. Створення таблиці Session.

На зразок створення таблиці Student створюється таблиця Session.

На малюнку 13 зображено вигляд таблиці Session після остаточного формування. Первинний ключ (Primary Key) встановлюється в полі Num_book. Ім'я таблиці задається Session.

Мал. 13. Таблиця Session

Після виконання дій у вікні Server Explorer будуть відображатися дві таблиці Student і Session.

Таким чином, до бази даних можна додавати будь-яку кількість таблиць.

7. Редагування структури таблиць.

Трапляються випадки, коли потрібно змінити структуру таблиці бази даних.

Для того, щоб вносити зміни до таблиць бази даних у MS Visual Studio, спочатку потрібно зняти опцію “Prevent Saving changes що require table re-creation” як показано на малюнку 14. Інакше, MS Visual Studio блокуватиме внесення змін до раніше створеної таблиці. Вікно Options, показане на малюнку 14, викликається з меню Tools у такій послідовності:

Tools -> Options -> Database Tools -> Table and Database Designers

Мал. 14. Опція “ Prevent Saving changes that require table re-creation

Після налаштування можна змінювати структуру таблиці. Для цього використовується команда Open Table Definition (рисунок 15) з контекстного меню, яка викликається для обраної таблиці (правий клік мишкою).

Мал. 15. Виклик команди “Open Table Definition”

Також ця команда розміщується у меню Data:

Data -> Open Table Definition

Попередньо таблицю необхідно виділити.

8. Встановлення зв'язків між таблицями.

Відповідно до умови завдання, таблиці пов'язані між собою по полю Num_book.

Щоб створити зв'язок між таблицями спочатку потрібно (рисунок 16):

  • виділити об'єкт Database Diagram;
  • вибрати команду Add New Diagram із контекстного меню (або з меню Data).

Мал. 16. Виклик команди додавання нової діаграми

Внаслідок цього відкриється вікно додавання нової діаграми Add Table (рисунок 17). У цьому вікні потрібно вибрати послідовно дві таблиці Session та Student та натиснути кнопку Add.

Мал. 17. Вікно додавання таблиць до діаграми

Мал. 18. Таблиці Student та Session після додавання їх до діаграми

Щоб почати встановлювати відношення між таблицями, треба зробити клік на полі Num_book таблиці Student, а потім (не відпускаючи кнопку мишки) перетягнути його на Num_book таблиці Session.

В результаті послідовно відкриються два вікна: Tables and Columns (рис. 19) та Foreign Key Relationship (рис. 20), в яких потрібно залишити все як є та підтвердити свій вибір на OK.

У вікні Tables and Columns задається назва відносини (FK_Session_Student ) та назви батьківської (Student) та дочірньої таблиць.

Мал. 19. Вікно Tables and Columns

Мал. 20. Вікно налаштування властивостей відношення

Після виконання дій буде встановлено відношення між таблицями (рисунок 21).

Мал. 21. Відношення між таблицями Student та Session

Збереження діаграми здійснюється так само як і збереження таблиці. Ім'я діаграми потрібно вибрати на власний розсуд (наприклад Diagram1).

Після встановлення імені діаграми відкриється вікно Save, в якому потрібно підтвердити свій вибір (рисунок 22).

Мал. 22. Підтвердження збереження змін у таблицях

9. Введення даних у таблиці.

Система Microsoft Visual Studio дозволяє безпосередньо вносити дані таблиці бази даних.

У нашому випадку, при встановленні зв'язку (рис. 19) первинної (Primary Key Table) обрано таблицю Student. Тому спочатку потрібно вносити дані в комірки саме цієї таблиці. Якщо спробувати спочатку внести дані до таблиці Session, система заблокує таке введення з виведенням відповідного повідомлення.

Щоб викликати режим введення даних у таблицю Student, потрібно викликати команду Show Table Data з контекстного меню (клік правою кнопкою мишки) або меню Data (рис. 23).

Мал. 23. Команда Show Table Data

Відкриється вікно, у якому необхідно ввести вхідні дані (мал. 24).

Мал. 24. Введення даних у таблиці Student

Після внесення даних до таблиці Student потрібно внести дані до таблиці Session.

При внесенні даних у поле Num_book таблиці Session потрібно вводити такі самі значення, які введені в поле Num_book таблиці Student (оскільки ці поля пов'язані між собою).

Наприклад, якщо в полі Num_book таблиці Student введено значення “101”, “102”, “103” (див. рис. 24), слід вводити саме ці значення в поле Num_book таблиці Session. Якщо спробувати ввести інше значення, система видасть приблизно таке вікно (мал. 25).

Мал. 25. Повідомлення про помилку введення даних пов'язаних таблиць Student та Session

Таблиця Session із введеними даними зображена на малюнку 26.

У вікні Server Explorer, де представлені таблиці бази даних на Microsoft SQL Server у вигляді дерева (див. рис. 4.1), для кожної таблиці можна відкрити вікно, натиснувши кнопку Show Table Data. Саме у цьому вікні надається можливість редагування даних таблиці. Виглядає це вікно редагування так, як представлено на рис. 4.2. Приблизно тому, що повний об'єм не увійшов до малюнку через велику кількість колонок.

      1. Реалізація відображення бази даних

Відображення бази даних (компонент DataSet) необхідний для того, щоб виключити зайві звернення до бази даних та сервера. Це дуже важлива особливість, адже якщо з базою працює безліч користувачів, навантаження на сервер може бути досить великим – кількість запитів у багато разів більша, що призведе до уповільнення виконання запитів.

Тому за рахунок DataSet на комп'ютері клієнта відображається база, з якої він працює. Після завершення роботи бази клієнта та сервера синхронізуються (вірніше, до серверної бази вносяться зміни, зроблені в базі даних клієнта)

Відображення нашої бази даних на MS Visual Studio 2005 виглядає так:

Усі числові дані мають тип Int32, рядкові – String. Розміри рядкових даних відповідають тим, що наведені у фізичній моделі бази даних.

На скрині видно, що у кожній таблиці є ще й TableAdapter'и. Це свого роду мости для з'єднання DataSet та джерелом даних. Тут є такі методи, як Fill та GetData()

Цей метод призначений для того, щоб заповнювати таблицю потрібними даними із джерела (файл бази даних)

    Метод GetData()

Призначений для того, щоб брати дані з таблиці.

    1. Реалізація програмного забезпечення

Головною особливістю у реалізації програмного забезпечення є той факт, що всі класи, що відповідають за редагування таблиць бази даних, успадковуються від одного базового класущо надає зручність у реалізації. Методи цього базового класу було описано вище. Віртуальні методи базового класу необхідно перекрити у класі-нащадці. Всі ці методи дозволяють змінювати у нащадка такі параметри як: назва заголовка форми, заповнення та збереження потрібної таблиці бази даних (один клас-нащадок працює тільки з однією таблицею, в сенсі редагування даних; проте при відображенні даних користувачу, можливо використання кількох таблиць бази даних з метою показувати дані у зрозумілій користувачеві формі).

      1. Інтерфейс програми

Головне вікно є MDI додаток, який має наступне меню:

Кожна таблиця для редагування БД викликається відповідним пунктом меню «Таблиці».

Звіт про навантаження на викладачів також створюється за натисканням на відповідний пункт меню «Звіти».

Як додаткова можливість програмного забезпечення, існує пункт меню Консоль, яка дозволяє виконувати SQL запити до бази даних, введені користувачем і виводити результат в таблицю (компонент DataTable). Для цього, звичайно, необхідно знати назви таблиць і полів, і, в основному, створювалася з метою зручності в реалізації програмного забезпечення, але цим можуть скористатися й інші «посвячені» користувачі.

Анотація: Прочитавши цю лекцію, ви зможете: створювати запити за допомогою Конструктора запитів SQL Server Management Studio, отримувати інформацію про базу даних із системних таблиць бази даних, динамічно створювати прості запитина основі введення користувача, форматувати введення користувача і фільтрувати складні динамічні запити, виконувати синтаксичний аналіз і переформатувати дані для використання у фільтрі, захистити базу даних від атак типу "SQL-injection", використовувати процедуру sp_executeSql для передачі запиту

У попередній лекції розповідалося про те, як підвищити продуктивністьзапитів. Тепер ви знаєте, як створити ефективний набір запитів, щоб надати користувачам найбільше корисну інформаціювід вашої програми за допомогою заздалегідь створених запитів у збережених процедурах або поданнях.

Однак у будь-яких додатках, крім найпростіших, неможливо заздалегідь дізнатися про все можливі варіантитипів інформації, які можуть знадобитися користувачам, та як вони захочуть відфільтрувати та впорядкувати її. Замість того, щоб намагатися передбачити всі такі можливості, можна надати користувачеві інформацію, що повідомляється додатком. У цій лекції розповідається, як динамічно будувати запити з урахуванням вибору, який користувач робить у процесі виконання робочого циклу .

Інтерфейс користувача для побудови запитів

Середовище SQL Server Management Studio включає складний інтерфейс для побудови запитів. Давайте вивчимо цей інтерфейс, щоб у вас сформувалося уявлення про те, як можна створювати запити динамічно. Вашому додатку не знадобляться всі елементи керування, які надає SQL Server Management Studio середовище. По суті потрібно ретельно продумати, як найкращим чиномобмежити користувачам можливості вибору.

Створюємо запит за допомогою конструктора запитів SQL Server Management Studio

Вилучення інформації про таблиці бази даних

Щоб надати користувачеві список параметрів, програмі, ймовірно, доведеться отримати інформацію про таблиці бази даних. Існує кілька способів отримати цю інформацію. Найважливіший із цих методів - використання схеми INFORMATION_SCHEMA . Ця схема є стандартною у будь-якій базі даних.

Застосування INFORMATION_SCHEMA

Схема INFORMATION_SCHEMA – це особлива схема, яка є у кожній базі даних. Вона містить визначення деяких об'єктів бази даних.

INFORMATION_SCHEMA відповідає стандарту ANSI, який призначений для вилучення інформації від будь-якого ANSI-сумісного ядра бази даних. SQL Server INFORMATION_SCHEMA складається з набору уявлень, які запитують таблиці бази даних sys*, що містять інформацію про структуру бази даних. Запит до цих таблиць можна виконати безпосередньо, так само, як до будь-яких таблиць бази даних. Однак у більшості випадків для того, щоб отримати інформацію з таблиць *sys, краще використовувати уявлення схеми INFORMATION_SCHEMA .

Примітка. Схема INFORMATION_SCHEMA іноді вимагає таблиці, які не потрібні, що завдає шкоди продуктивності. У наступному прикладі даної лекції це не особливо важливо, тому що додаток вже очікував введення користувача. Однак це слід враховувати, якщо швидкість є важливим аспектом для вашої програми.

Ось базовий код T-SQL, який використовується для отримання інформації про стовпці, що входять до таблиці:

Зверніть увагу, що для отримання схеми для таблиці потрібно вибрати поле TABLE_SCHEMA . Це може мати значення для створення аналогічних запитів надалі. Щоб експериментувати з методами, описаними в цій лекції, створіть новий проекту Visual Studio.

Створюємо новий проект Visual Studio
  1. Виберіть з меню Start команди All Programs, Microsoft Visual Studio 2005, Microsoft Visual Studio 2005.
  2. У меню Visual Studio виберіть команду File, New, Project (Файл, Створити, Проект).
  3. У панелі Project Types (Типи проектів) розгорніть вузол Visual Basic (Рішення Visual Basic) і виберіть шаблон Application (Додаток) у панелі Templates (Шаблони). Дайте проекту ім'я Chapter7 і натисніть кнопку ОК,
  4. Додаток для цього прикладу можна знайти у файлах прикладів у папці \Chapter7\DynQuery. Ви можете вирізати та вставляти код для наступних процедур із файлу Form1.vb.
Отримання списку таблиць та уявлень

Як правило, вам потрібно буде надати користувачеві можливість вибрати не тільки стовпці, а й таблицю для динамічного запиту, тому доведеться відобразити список таблиць. Необхідну інформацію можна отримати за допомогою наступного запиту:

SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES

У програмі цей запит можна використовувати таким чином.

Отримуємо список таблиць

Наведений вище код Visual Basic ініціалізує об'єкт SqlCommand з ім'ям com з рядком SQL, який потрібно виконати, а потім виконує об'єкт SqlCommand . Це найпростіший спосіб виконати пропозицію T-SQL із програми.

Як вправу можна розмістити схеми та таблиці, отримані в процесі виконання процедури Load нашої форми, в інтерфейсі програми у вигляді форми, щоб користувач міг вибрати схему і таблицю для роботи. Наприклад у цій лекції ми припускаємо, що користувач вибрав схему Sales і таблицю Customer .

Після того, як користувач вибрав таблицю, можна витягти список стовпців для цієї таблиці за допомогою того ж методу, використовуючи введення користувача як ім'я таблиці в запиті. Для цього в рядок запиту слід ввести замісник, а потім замінити замісник викликом String.Format . У наведеному нижче коді заступник у рядку запиту – (0).

Отримуємо список стовпців
  1. Додайте наступну процедуру RetrieveColumns у код нижче процедури RetrieveTables:

    Sub RetrieveColumns(ByVal TableName As String) MyConnection As New SqlClient.SqlConnection(_ "Data Source=.\SQLExpress;" & _ "Initial Catalog=AdventureWorks;Trusted_Connection=Yes;") Dim sqlStr As String sqlStr = "SELECT , COLUMN_NAME, " + _ "ORDINAL_POSITION, DATA_TYPE " + _ "FROM INFORMATION_SCHEMA.COLUMNS " + _ "WHERE (TABLE_NAME = "(0)")" Dim tableColumns As New DataTable (sqlStr, TableName), MyConnection) da.Fill(tableColumns) For i As Integer = 0 Для tableColumns.Rows.Count - 1 With tableColumns.Rows.Item(i) Console.WriteLine("(0) (1) (2) )", _ .Item(1), .Item(2), .Item(3)) End With Next End Sub

  2. У процедуру Form1_Load додайте наступний виклик процедури RetrieveColumns після процедури RetrieveTables :