Перейти к содержимому

Как написать запрос для бд из с

  • автор:

Как правильно написать запрос sql на добавление записи в таблицу БД? c# VS13 [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 7 лет назад .

введите сюда описание изображения

Мне нужно сохранить данные из textBox’ов в новою строку таблицы «Writers» моей БД. Я пытался сделать это так, но видимо где то накосячил, ошибок нет но таблица не изменяется!

Краткое руководство. Использование .NET и C# в Visual Studio для подключения и создания запросов к базе данных

В этом кратком руководстве показано, как использовать код .NET и C# в Visual Studio для запроса базы данных в Azure SQL или Synapse SQL с инструкциями Transact-SQL.

Предварительные требования

Для работы с этим кратким руководством вам понадобится:

  • Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
  • Visual Studio 2022 Community, Professional или Enterprise Edition.
  • База данных, в которой можно выполнять запрос. Для создания и настройки базы данных можно использовать одно из этих кратких руководств.

Действие База данных SQL Управляемый экземпляр SQL SQL Server на виртуальной машине Azure Azure Synapse Analytics
Создание Портал Портал Портал Портал
CLI CLI
PowerShell PowerShell PowerShell PowerShell
Шаблон развертывания Шаблон развертывания Шаблон развертывания Шаблон развертывания
Configure Правило брандмауэра для IP-адресов на уровне сервера Подключение из виртуальной машины Параметры подключения
Подключение из локальной сети Подключение к экземпляру SQL Server
Получение сведений о подключении Azure SQL; Azure SQL; Виртуальная машина SQL Synapse SQL

Создание кода для запроса к базе данных в службе «База данных SQL Azure»

  1. В Visual Studio создайте проект .
  2. В диалоговом окне «Создать проект» выберите консольное приложение C#.
  3. Введите sqltest для имени проекта и нажмите кнопку «Далее«.
  4. Выберите параметр платформы (долгосрочная поддержка), например .NET 6.0, а затем нажмите кнопку «Создать«. Создается новый проект.
  5. Выберите Проект>Управление пакетами NuGet.
  6. В диспетчере пакетов NuGet выберите вкладку Обзор, а затем найдите и выберите Microsoft.Data.SqlClient.
  7. На странице Microsoft.Data.SqlClient щелкните Установить.
    • При выводе запроса нажмите кнопку ОК, чтобы продолжить установку.
    • Если откроется окно Прием условий лицензионного соглашения, выберите Я принимаю.
  8. После завершения установки вы можете закрыть диспетчер пакетов NuGet.
  9. В редакторе кода замените содержимое Program.cs следующим кодом. Замените значения , , и .
using System; using Microsoft.Data.SqlClient; using System.Text; namespace sqltest < class Program < static void Main(string[] args) < try < SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.DataSource = ".database.windows.net"; builder.UserID = ""; builder.Password = ""; builder.InitialCatalog = ""; using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) < Console.WriteLine("\nQuery data example:"); Console.WriteLine("=========================================\n"); String sql = "SELECT name, collation_name FROM sys.databases"; using (SqlCommand command = new SqlCommand(sql, connection)) < connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) < while (reader.Read()) < Console.WriteLine("", reader.GetString(0), reader.GetString(1)); > > > > > catch (SqlException e) < Console.WriteLine(e.ToString()); >Console.ReadLine(); > > > 

Выполнение кода

  1. Чтобы запустить приложение, выберите Отладка>Начать отладку или Запустить на панели инструментов либо нажмите клавишу F5.
  2. Убедитесь, что возвращены имена баз данных и их параметры сортировки, и закройте окно приложения.

Дальнейшие действия

  • Узнайте, как подключить и запросить базу данных в Базе данных SQL Azure с помощью .NET из командной строки в Windows/Linux/macOS.
  • Узнайте о начале работы с .NET в Windows/Linux/macOS с помощью VS Code.
  • Дополнительные сведения о разработке с помощью .NET и SQL.
  • Узнайте, как создать первую базу данных в Базе данных SQL Azure с помощью SSMS.
  • Дополнительные сведения о .NET см. в этой документации.
  • Пример логики повтора: отказоустойчивое подключение к SQL с помощью ADO.NET.

Руководство. создать объекты базы данных с помощью запросов

Если вы предпочитаете использовать скрипты для создания или изменения представлений, хранимых процедур, функций, триггеров и определяемых пользователем типов, то для этого можно пользоваться редактором Transact-SQL. Редактор Transact-SQL поддерживает технологии IntelliSense и другие языки. Дополнительные сведения см. в статье Использование редактора Transact-SQL для изменения и выполнения скриптов.

Редактор Transact-SQL вызывается, когда через контекстное меню Просмотр кода вы открываете любую сущность базы данных в подключенной базе данных или проекте. Кроме того, он автоматически открывается при использовании контекстного меню Создать запрос в окне обозревателя объектов SQL Server или при добавлении нового объекта скрипта в проект базы данных. Если подключение к базе данных не установлено, но нужно выполнить к ней запрос, можно воспользоваться диалоговым окном Создать подключение для запроса, выбрав пункт Редактор Transact-SQL в меню SQL для подключения к базе данных и запуска редактора Transact-SQL.

В следующих процедурах используются сущности, созданные ранее с помощью руководства по разработке подключенной базы данных.

Создание таблицы с помощью запроса Transact-SQL

  1. Щелкните правой кнопкой мыши узел базы данных Trade и выберите Создать запрос.
  2. Вставьте следующий код в области скрипта:
 CREATE TABLE [dbo].[Fruits] ( [Id] INT NOT NULL, [Perishable] BIT DEFAULT ((1)) NULL, PRIMARY KEY CLUSTERED ([Id] ASC), FOREIGN KEY ([Id]) REFERENCES [dbo].[Products] ([Id]) ); 

Создание новой функции

  1. Замените код в текущем окне редактора Transact-SQL приведенным ниже кодом.
 CREATE FUNCTION [dbo].GetProductsBySupplier ( @SupplierId int ) RETURNS @returntable TABLE ( [Id] int NOT NULL, [Name] NVARCHAR (128) NOT NULL, [Shelflife] INT NOT NULL, [SupplierId] INT NOT NULL, [CustomerId] INT NOT NULL ) AS BEGIN INSERT @returntable SELECT * from Products p where p.SupplierId = @SupplierId RETURN END 

Создание нового представления

  1. Замените код в текущем окне редактора Transact-SQL приведенным ниже кодом. Затем нажмите кнопку Выполнить запрос над редактором, чтобы выполнить этот запрос.
CREATE VIEW [dbo].PerishableFruits AS SELECT p.Id, p.Name FROM dbo.Products p join dbo.Fruits f on f.Id = p.Id where f.Perishable = 1 

Скрипты Simple-Scada

В базе данных можно создавать таблицы, добавлять в них строки с данными, удалять, редактировать их и т.д. Все эти действия выполняются через SQL-запросы к БД. Например, чтобы добавить новую строку в таблицу «my_table» с двумя целочисленными столбцами, нужно выполнить соответствующий SQL-запрос:

INSERT INTO `my_table` (col1, col2) VALUES (11, 65);

Чтобы получить содержимое таблицы «my_table», нужно выполнить SQL-запрос на выборку:

SELECT * FROM `my_table`;

Таким образом можно составить любой SQL-запрос, который будет выполнять поставленную задачу.

Важно! Обработать ошибки в SQL-запросах можно в скрипе «Ошибка SQL-запроса», например выдать ошибку в компонент «Текст». Также, для отладки скриптов работы с БД можно активировать опцию «Лог пользовательских SQL-запросов», тогда все пользовательские SQL-запросы будут записываться в лог-файл сервера. Данную опцию можно использовать только для отладки проекта, иначе она будет создавать лишнюю нагрузку на сервер скады .

Рекомендуем предварительно убедиться в том, что запрос не содержит ошибок. Например, чтобы составить и проверить SQL-запрос для MySQL, можно использовать MySQLWorkbench.

Когда SQL-запрос подготовлен и проверен, можно вызвать его из скрипта Simple-Scada. Для выполнения пользовательских SQL-запросов в Simple-Scada используется процедура RunSQL — в нее нужно передать код SQL-запроса и скада автоматически отправит этот запрос на выполнение. Допустим у нас имеется следующий SQL-запрос:

INSERT INTO `my_table` (col1, col2) VALUES (11, 65);

Требуется выполнить его, когда пользователь нажмет на кнопку. Для этого нужно выделить кнопку и на событие OnClick написать скрипт со следующим кодом:

var
aQuery: string ;
begin
< Формируем запрос к БД >
aQuery := ‘INSERT INTO `my_table` (col1, col2) VALUES (11, 65);’ ;
< Отправляем запрос на выполнение c тегом = 0>
RunSQL(aQuery, nil , 0 );
end .

Сначала мы записали текст SQL-запроса в строковую переменную aQuery, а затем вызвали процедуру RunSQL с этой строковой переменной. Далее, скада автоматически отправит наш запрос в БД. Если запрос выполнится успешно (без ошибок), то скада вызовет все скрипты с типом события «Выполнен SQL-запрос». Если при выполнении запроса что-то пойдет не так (например, в запросе имеется ошибка), то скада вызовет скрипты с типом события «Ошибка SQL-запроса».

Порядок выполнения запросов

Все запросы к БД выполняются асинхронно. БД выполняет каждый запрос в отдельном потоке, т.е. если отправить в БД несколько запросов подряд, то они будут выполняться одновременно в разных потоках и то, какой запрос выполнится быстрее зависит от множества факторов, например нагрузки на процессор, нагрузки на саму БД, количества других запросов выполняющихся в данный момент и т.д. Поэтому, если обязательно требуется выполнить запросы последовательно, то нужно отправить в БД первый запрос, пометив его уникальным тегом. Затем в скрипте «Выполнен SQL-запрос» необходимо проверить, что выполнился запрос помеченный нужным тегом(if DataSet.Tag = ?? then), после чего можно отправить в БД второй запрос.

Одинарные кавычки в SQL-запросах

Пусть мы хотим выполнить такой SQL-запрос: » INSERT INTO `my_table` (col1, col2) VALUES (‘привет’, ‘мир’); «. В этом запросе есть одинарные кавычки, в них мы передаём строковые константы (‘привет’ и ‘мир’). Теперь, если мы подставим этот запрос в процедуру RunSQL, то получим ошибку компилятора, например:

var
aQuery: string ;
begin
< Формируем запрос к БД >
aQuery := ‘INSERT INTO `my_table` (col1, col2) VALUES (‘ привет ‘, ‘ мир ‘);’ ; // ошибка синтаксиса!
< Отправляем запрос на выполнение c тегом = 0>
RunSQL(aQuery, nil , 0 );
end .

Дело в том, что SQL-запросы передаются в RunSQL в виде строки, а строки должны быть заключены в одинарные кавычки. Наши одинарные кавычки внутри SQL-запроса мешают компилятору правильно воспринимать строку (это видно даже по подсветке синтаксиса в примере выше). Чтобы решить проблему, нужно продублировать одинарные кавычки в SQL-запросе, вот так:

var
aQuery: string ;
begin
< Формируем запрос к БД >
aQuery := ‘INSERT INTO `my_table` (col1, col2) VALUES (»привет», »мир»);’ ;
< Отправляем запрос на выполнение c тегом = 0>
RunSQL(aQuery, nil , 0 );
end .

Теперь компилятор правильно воспринимает весь запрос как единую строку.

Есть ещё один вариант для решения проблемы с одинарными кавычками. Можно использовать функцию QuotedStr, которая добавляет одинарные кавычки по краям строки. Например:

var
aQuery: string ;
begin
< Формируем запрос к БД >
aQuery := ‘INSERT INTO `my_table` (col1, col2) VALUES (‘ + QuotedStr( ‘привет’ ) + ‘, ‘ + QuotedStr( ‘мир’ ) + ‘);’ ;
< Отправляем запрос на выполнение c тегом = 0>
RunSQL(aQuery, nil , 0 );
end .

Длинные SQL-запросы в коде

Пусть у нас есть длинный SQL-запрос: » INSERT INTO `my_table` (col1, col2, col3, col4, col5, col6) VALUES (11, 65, 25.15, ‘текст1’, ‘текст2’, ‘текст3’); «. Если вписать его одной строкой, то на экране может просто не хватить места по ширине из-за чего придётся пользоваться горизонтальным скроллом. Правильнее будет разбить текст запроса на три строки, каждую строку заключить в одинарные кавычки и сложить их знаком «+». Вот так:

var
aQuery: string ;
begin
< Формируем запрос к БД >
aQuery := ‘INSERT INTO `my_table` ‘ +
‘(col1, col2, col3, col4, col5, col6) VALUES ‘ +
‘(11, 65, 25.15, »текст1», »текст2», »текст3»);’ ;
< Отправляем запрос на выполнение c тегом = 0>
RunSQL(aQuery, nil , 0 );
end .

Разбиение на строки полезно, так как улучшает читаемость кода.

Как понять что запрос выполнился

Пусть в проекте есть кнопка, по нажатию на которую в таблице «my_table» создаётся новая строка. Т.е. на событие OnClick написан такой код:

var
aQuery: string ;
begin
< Формируем запрос к БД >
aQuery := ‘INSERT INTO `my_table` (col1, col2) VALUES (11, 65);’ ;
< Отправляем запрос на выполнение c тегом = 0>
RunSQL(aQuery, nil , 0 );
end .

Теперь мы добавили на мнемосхему компонент текст с именем «Text1» и хотим, чтобы после выполнения нашего SQL-запроса текст изменился на «Мой запрос выполнен!». Тогда мы должны, во-первых, при вызове RunSQL пометить наш запрос каким-то уникальным тегом, который больше никогда нами в RunSQL не использовался, например 55:

var
aQuery: string ;
begin
< Формируем запрос к БД >
aQuery := ‘INSERT INTO `my_table` (col1, col2) VALUES (11, 65);’ ;
< Отправляем запрос на выполнение c тегом = 55 >
RunSQL(aQuery, nil , 55 );
end .

Во-вторых, необходимо создать в меню скриптов новый скрипт с типом события «Выполнен SQL-запрос». Такой скрипт будет вызываться скада-системой каждый раз, когда выполнился любой пользовательский SQL-запрос. Также, этот скрипт будет содержать параметр «DataSet» — результат выполнения запроса. У параметра DataSet имеется свойство Tag. Это и есть тот самый тег, который мы назначили при выполнении RunSQL. Таким образом, по значению тега мы можем узнать в скрипте какой именно из наших SQL-запросов выполнился. Например:

begin
if DataSet.Tag = 55 then
Text1.Text := ‘Запрос выполнен!’ ;
end .

Блокировка кнопки на время выполнения запроса

Допустим имеется кнопка, по нажатию на которую выполняется запрос к БД. Требуется блокировать кнопку на время выполнения запроса для предотвращения повторных нажатий. Для решения этой задачи на событие OnClick кнопки нужно написать код запроса к БД, а также пометить запрос уникальным тегом, который ранее не использовался в RunSQL, например 77:

Далее, создадим новый скрипт с типом события «Выполнен SQL-запрос» и следующим кодом:

begin
if DataSet.Tag = 77 then // если запрос помеченный тегом 77 выполнен, то
Button1.Enabled := True; // разблокируем кнопку
end .

Метод RunSQL компонента «Таблица»

У компонента «Таблица» есть свой внутренний метод RunSQL, который удобно использовать для того чтобы отобразить результат выполнения SQL-запроса в таблице на мнемосхеме. Например можно создать на мнемосхеме таблицу с именем «Table1», разместить рядом кнопку «Считать» и на событие OnClick кнопки написать такой код:

Теперь при нажатии на кнопку «Считать» скада выполнит SQL-запрос, а после выполнения автоматически отобразит результат в таблице Table1. Если запрос выполнится с ошибкой, то текст ошибки отобразится в таблице. Другие примеры для метода RunSQL таблицы можно найти по ссылке.

Работа с выборкой из множества строк

Пример работы с выборкой из множества строк можно найти по ссылке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *