Главная страница
Навигация по странице:

  • SqliteCommand

  • Parameters

  • ExecuteNonQuery

  • ExecuteScalar()

  • Создание таблицы

  • Добавление данных

  • Обновление объектов

  • Практическая работа №28

  • Методические рекомендации по выполнению практических работ по междисциплинарному курсу


    Скачать 2.6 Mb.
    НазваниеМетодические рекомендации по выполнению практических работ по междисциплинарному курсу
    Дата05.09.2022
    Размер2.6 Mb.
    Формат файлаpdf
    Имя файлаMU_PR_MDK_01_01.pdf
    ТипМетодические рекомендации
    #663423
    страница13 из 13
    1   ...   5   6   7   8   9   10   11   12   13
    Практическая работа №27 Создание запросов к БД
    Для выполнения запросов к базе данных SQLite применяется класс SqliteCommand, который представляет реализацию интерфейса System.Data.IDbCommand. Для создания объекта SqliteCommand можно использовать один из его конструкторов:

    SqliteCommand()

    SqliteCommand(String): создает объект SqliteCommand, в конструктор которого передается выполняемое выражение SQL

    SqliteCommand(String, SqliteConnection): создает объект SqliteCommand, в конструктор которого передается выполняемое выражение SQL и используемое подключение к базе данных в виде объекта SqliteConnection

    SqliteCommand(String,
    SqliteConnection,
    SqliteTransaction): третий параметр представляет применяемую транзакцию в виде объекта SqliteTransaction
    Альтернативным способом создания объекта
    SqliteCommand представляет метод CreateCommand90 класса SqliteConnection:
    1 2
    3 4
    5 using (var connection = new SqliteConnection("Data Source=usersdata.db"))
    { connection.Open();
    SqliteCommand command = connection.CreateCommand();
    }
    Для конфигурации объекта SqliteCommand можно использовать ряд его свойств, некоторые из них:

    CommandText: хранит выполняемую команду SQL

    CommandTimeout: хранит временной интервал в секундах, после которого
    SqliteCommand прекращает попытки выполнить команду. По умолчанию равен 30 секундам. Значение 0 представляет отстутсвие интервала.

    Parameters: предствляет параметры команды

    Connection: предоставляет используемое подключение SqliteConnection
    Например, установим свойства подключения и выполняемой команды:
    1 2
    3 4
    5 6
    7 using (var connection = new SqliteConnection("Data Source=usersdata.db"))
    { connection.Open();
    SqliteCommand command = new SqliteCommand(); command.Connection = connection; command.CommandText = "CREATE TABLE Users(_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, Name TEXT NOT
    NULL)";
    }
    Чтобы выполнить команду, необходимо применить один из методов SqliteCommand:

    ExecuteNonQuery: выполняет sql-выражение и возвращает количество измененных записей. Подходит для sql-выражений INSERT, UPDATE, DELETE, CREATE.

    ExecuteReader(): выполняет sql-выражение и возвращает считанные из таблицы строки. Подходит для sql-выражения SELECT.

    ExecuteScalar(): выполняет sql-выражение и возвращает одно скалярное значение, например, число. Подходит для sql-выражения SELECT в паре с одной из встроенных функций SQL, как например, Min, Max, Sum, Count.
    Создание таблицы
    Для создания базы данных применяется SQL-команда CREATE TABLE, после которой указывается имя создаваемой таблицы и в скобках определения столбцов.
    Например, создадим таблицу "Users", которая будет иметь три столбца - _id (уникальный идентификатор), Name (имя), Age (возраст):
    1 2 using System; using Microsoft.Data.Sqlite;

    3 4
    5 6
    7 8
    9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 namespace HelloApp
    { class Program
    { static void Main(string[] args)
    { using (var connection = new SqliteConnection("Data Source=usersdata.db"))
    { connection.Open();
    SqliteCommand command = new SqliteCommand(); command.Connection = connection; command.CommandText = "CREATE TABLE Users(_id INTEGER NOT
    NULL PRIMARY KEY AUTOINCREMENT UNIQUE, Name TEXT NOT NULL,
    Age INTEGER NOT NULL)"; command.ExecuteNonQuery();
    Console.WriteLine("Таблица Users создана");
    }
    Console.Read();
    }
    }
    }
    После выполнения команды в базе данных можно будет найти таблицу Users:
    Для просмотра бд SQLite можно использовать специальный инструмент - DB Browser for
    SQLite.
    Добавление данных
    Теперь добавим в выше созданную таблицу Users новый объект:
    1 2
    3 4
    5 6
    7 8
    9 10 11 12 13 14 15 16 17 18 19 20 21 22 using System; using Microsoft.Data.Sqlite; namespace HelloApp
    { class Program
    { static void Main(string[] args)
    { using (var connection = new SqliteConnection("Data Source=usersdata.db"))
    { connection.Open();
    SqliteCommand command = new SqliteCommand(); command.Connection = connection; command.CommandText = "INSERT INTO Users (Name, Age) VALUES
    ('Tom', 36)"; int number = command.ExecuteNonQuery();
    Console.WriteLine($"В таблицу Users добавлено объектов: {number}");
    }
    Console.Read();

    23 24
    }
    }
    }
    Для вставки объекта используется sql-выражение INSERT, которое имеет следующий синтаксис:
    1
    INSERT INTO название_таблицы (столбец1, столбец2, столбецN) VALUES ( значение1, значение2, значениеN)
    В ранее созданной таблице Users определены три столбца - __id и Age, которые хранят целое число, и Name, который хранит строку. Поэтому соответственно мы добавляем для столбца Name значение 'Tom', а для столбца Age число 36.
    Здесь метод ExecuteNonOuery() возвращает число затронутых строк (в данном случае добавленных в таблицу объектов). Хотя нам необязательно возвращать результат метода, но данный результат может использоваться в качестве проверки, что операция, в частности, добавление, прошла успешно.
    После добавления данных мы сможем их увидеть через DB Browser for SQLite:
    Подобным образом можно добавить несколько объектов:
    1 2
    3 4
    5 6
    7 8
    9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 using System; using Microsoft.Data.Sqlite; namespace HelloApp
    { class Program
    { static void Main(string[] args)
    { string sqlExpression = "INSERT INTO Users (Name, Age) VALUES
    ('Alice', 32), ('Bob', 28)"; using
    (var connection
    = new
    SqliteConnection("Data
    Source=usersdata.db"))
    { connection.Open();
    SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery();
    Console.WriteLine($"В таблицу Users добавлено объектов:
    {number}");
    }
    Console.Read();
    }
    }
    }
    Обновление объектов
    Для обновления применяется sql-команда UPDATE, которое имеет следующий синтаксис:
    1 2
    3
    UPDATE название_таблицы
    SET столбец1=значение1, столбец2=значение2, столбецN=значениеN
    WHERE некоторый_столбец=некоторое_значение
    Применим эту команду:
    1 using System;

    2 3
    4 5
    6 7
    8 9
    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 using Microsoft.Data.Sqlite; namespace HelloApp
    { class Program
    { static void Main(string[] args)
    { string sqlExpression = "UPDATE Users SET Age=20 WHERE Name='Tom'"; using (var connection = new SqliteConnection("Data Source=usersdata.db"))
    { connection.Open();
    SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery();
    Console.WriteLine($"Обновлено объектов: {number}");
    }
    Console.Read();
    }
    }
    }
    Здесь обновляется строка, в которой Name=Tom, то есть выше добавленный объект. Если в таблице будет несколько строк, у которых Name=Tom, то обновятся все эти строки.
    Удаление
    Удаление производится с помощью sql-выражения DELETE, которое имеет следующий синтаксис:
    1 2
    DELETE FROM таблица
    WHERE столбец = значение
    Удалим, например, всех пользователей, у которых имя Tom:
    1 2
    3 4
    5 6
    7 8
    9 10 11 12 13 14 15 16 17 18 19 20 21 using System; using Microsoft.Data.Sqlite; namespace HelloApp
    { class Program
    { static void Main(string[] args)
    { string sqlExpression = "DELETE FROM Users WHERE Name='Tom'"; using (var connection = new SqliteConnection("Data Source=usersdata.db"))
    { connection.Open();
    SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery();
    Console.WriteLine($"Удалено объектов: {number}");
    }
    Console.Read();

    22 23 24
    }
    }
    }
    Во всех трех случаях фактически меняется только sql-выражение, а остальная логика остается неизменной. И мы также можем выполнять сразу несколько операций:
    1 2
    3 4
    5 6
    7 8
    9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 using System; using Microsoft.Data.Sqlite; namespace HelloApp
    { class Program
    { static void Main(string[] args)
    {
    Console.WriteLine("Введите имя:"); string name = Console.ReadLine();
    Console.WriteLine("Введите возраст:"); int age = Int32.Parse(Console.ReadLine()); string sqlExpression = $"INSERT INTO Users (Name, Age) VALUES ('{name}',
    {age})"; using (var connection = new SqliteConnection("Data Source=usersdata.db"))
    { connection.Open();
    // добавление
    SqliteCommand command = new SqliteCommand(sqlExpression, connection); int number = command.ExecuteNonQuery();
    Console.WriteLine($"Добавлено объектов: {number}");
    // обновление ранее добавленного объекта
    Console.WriteLine("Введите новое имя:"); name = Console.ReadLine(); sqlExpression = $"UPDATE Users SET Name='{name}' WHERE Age={age}"; command.CommandText = sqlExpression; number = command.ExecuteNonQuery();
    Console.WriteLine($"Обновлено объектов: {number}");
    }
    Console.Read();
    }
    }
    }
    Консольный вывод:
    Введите имя:
    Tom
    Введите возраст:
    36
    Добавлено объектов: 1
    Введите новое имя:
    Sam
    Обновлено объектов: 1


    Практическая работа №28 Создание хранимых процедур
    Сначала вы добавляете хранимую процедуру в ваш проект (при помощи использования меню Project и выбора пункта Add Stored Procedure). В проект будет добавлен новый класс. В листинге 18.1 показан базовый код. который имеется в файле нового класса. Вы можете добавить свой код в статическую процедуру UpdateEmployeeLogin.
    \pannMvn К*31 using System; using System.Data; using System.Data.SalClient; using System.Data.SalTypes; using Microsoft.SalServer.Server; public partial class StoredProcedures
    [Microsoft.SqlServer.Server.SqlProcedure] public static void UpdateEmployeeLogin()
    {
    // Здесь вы можете разместить свой код
    }
    Все объекты управляемого кода (в проекте SQL Server) для выполнения своей работы ис- пользуют классы данных .NET Framework (т. е. ADO.NET). Это означает, что написанные вами хранимые процедуры приведут к созданию и использованию экземпляров таких классов, как SqlConnection и SqlCommand. Код, который вы пишете, идентичен коду доступа к данным, который вы писали бы в любом другом типе проекта .NET: библиотеке классов, Web-проекте или проекте Windows-форм. Поскольку общим знаменателем является использование классов ADO.NET, то разработчикам не нужно изучать других языков (вроде Т- SQL) для работы с базой данных.
    Примечание
    В задачи данной главы не входит рассмотрение преимуществ и недостатков написания объектов баз данных на управляемом языке по сравнению с Т-SQL. Обратитесь к докладу фирмы Microsoft с названием "Using CLR Integration in SQL Server 2005", который имеется в MSDN. Несмотря на то, что он достаточно старый (написан в ноябре 2004 года), в нем хорошо изложена данная тема, и мы настоятельно рекомендуем его прочитать.
    В листинге 18.2 показана процедура на языке С#, которая обновит таблицу Employee базы данных AdventureWorks информацией для входа в систему. Этот код несложен и понятен для любого, у кого есть опыт доступа к данным при помощи языка С#. using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class StoredProcedures
    [Microsoft.SqlServer.Server.SqlProcedure] public static void UpdateEmployeeLogin(Sqllnt32 employeeld, Sqllnt32 managerld, SqlString loginld, SqlString title, SqlDateTime hireDate, SqlBoolean currentFlag) using (SqlConnection conn = new SqlConnection("context connection=true"))
    {
    SqlCommand
    UpdateEmployeeLoginCommand
    = new
    SqlCommand
    ()
    ;
    UpdateEmployeeLoginCommand. CommandText =
    "update HumanResources.Employee SET Managerld = " + managerId.ToString() +
    ", Loginld = '" + loginld.ToString() + ",M +
    ", Title = 1" + title.ToString() + "'" +
    ", HireDate = '" + hireDate.ToString() + "'" +
    ", CurrentFlag = " + currentFlag.ToString() +
    " WHERE Employeeld = " + employeeld.ToString();
    UpdateEmployeeLoginCommand.Connection = conn; conn.Open();
    UpdateEmployeeLoginCommand.ExecuteNonQuery(); conn.Close();
    }

    Одна строка кода заслуживает более подробного объяснения. Объект SqlConnection соз- дается следующим образом:
    SqlConnection conn = new SqlConnection("context connection=true")
    Строка подключения "context connection=true" говорит движку провайдеров данных о том, что подключение должно быть создано в том же контексте, что и вызывающее прило- жение. Поскольку эта процедура будет работать внутри базы данных, то это означает, что вы будете и подключаться к базе данных хоста в контексте (транзакционном и прочем) вызывающего приложения, и работать в нем. Поэтому вам не нужно жестко прописывать здесь полностью всю строку подключения SQL.
    Для сравнения в листинге 18.3 показан тот же самый запрос обновления на языке T-SQL.
    ALTER PROCEDURE [HumanResources].[uspUpdateEmployeeLogin] @EmployeeID [int],
    @ManagerID [int],
    @LoginID [nvarchar](256),
    @Title [nvarchar] (50),
    @HireDate [datetime],
    @CurrentFlag [dbo].[Flag]
    WITH EXECUTE AS CALLER AS
    BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
    UPDATE [HumanResources].[Employee]
    SET [ManagerlD] = @ManagerID ,[LoginID] = @LoginID , [Title] = @Title ,[HireDate] =
    @HireDate ,[CurrentFlag] = @CurrentFlag WHERE [EmployeelD] = @EmployeeID;
    END TRY BEGIN CATCH
    EXECUTE [dbo].[uspLogError];
    END CATCH;
    END;

    4 Используемая литература и интернет источники
    Маркин, А. В. Программирование на SQL : учебное пособие для среднего профессионального образования / А. В. Маркин. — Москва : Издательство Юрайт2020г.
    Технология разработки программных продуктов: Учеб.пособие для студ. Сред. Проф. образования. / А.В.Рудаков. - М.:Издательский центр «Академия», 2006. - 208 с
    1   ...   5   6   7   8   9   10   11   12   13


    написать администратору сайта