Как правильно написать запрос 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»
- В Visual Studio создайте проект .
- В диалоговом окне «Создать проект» выберите консольное приложение C#.
- Введите sqltest для имени проекта и нажмите кнопку «Далее«.
- Выберите параметр платформы (долгосрочная поддержка), например .NET 6.0, а затем нажмите кнопку «Создать«. Создается новый проект.
- Выберите Проект>Управление пакетами NuGet.
- В диспетчере пакетов NuGet выберите вкладку Обзор, а затем найдите и выберите Microsoft.Data.SqlClient.
- На странице Microsoft.Data.SqlClient щелкните Установить.
- При выводе запроса нажмите кнопку ОК, чтобы продолжить установку.
- Если откроется окно Прием условий лицензионного соглашения, выберите Я принимаю.
- После завершения установки вы можете закрыть диспетчер пакетов NuGet.
- В редакторе кода замените содержимое 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(); > > >
Выполнение кода
- Чтобы запустить приложение, выберите Отладка>Начать отладку или Запустить на панели инструментов либо нажмите клавишу F5.
- Убедитесь, что возвращены имена баз данных и их параметры сортировки, и закройте окно приложения.
Дальнейшие действия
- Узнайте, как подключить и запросить базу данных в Базе данных 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
- Щелкните правой кнопкой мыши узел базы данных Trade и выберите Создать запрос.
- Вставьте следующий код в области скрипта:
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]) );
Создание новой функции
- Замените код в текущем окне редактора 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
Создание нового представления
- Замените код в текущем окне редактора 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 таблицы можно найти по ссылке.

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