Подсчет строк после INSERT INTO SELECT в C#: решение
Быстрый ответ
Для определения количества обработанных строк в SQL используйте целочисленное значение, которое возвращает функция ExecuteNonQuery()
:
int affectedRows = new SqlCommand("UPDATE Table SET Column = 'Value'", new SqlConnection(connectionString)).ExecuteNonQuery();
Переменная affectedRows
отобразит количество строк, затронутых вашими операциями UPDATE
, INSERT
или DELETE
.
Транзакции и обработка массовых операций
При работе с массовыми операциями и транзакциями рекомендуется использовать метод BeginTransaction()
, позволяющий точно учитывать количество затронутых строк. Приведу пример корректной обработки транзакций:
using (var con = new SqlConnection(connectionString))
{
con.Open();
using (var tran = con.BeginTransaction())
{
try
{
var cmd = new SqlCommand("ВАША SQL КОМАНДА", con, tran);
int affectedRows = cmd.ExecuteNonQuery(); // Получение количества затронутых строк здесь
tran.Commit(); // Важно зафиксировать изменения, чтобы база данных приняла их
return affectedRows;
}
catch
{
tran.Rollback(); // Откат изменений в случае ошибок
throw;
}
}
}
Особенности MySQL и способы их обработки
При работе с MySQL не забывайте указать UseAffectedRows=True
в строке подключения. Без этой настройки метод MySqlCommand.ExecuteNonQuery()
может не отобразить точное количество обработанных строк, особенно при активности триггеров.
SQLite и метод total_changes()
Если вы работаете с SQLite, то можете воспользоваться запросом SELECT total_changes();
после выполнения основной операции, чтобы получить общее число изменённых строк, включая действия триггеров:
int totalChanges;
using(var command = new SQLiteCommand("SELECT total_changes();", new SQLiteConnection(connectionString)))
{
totalChanges = Convert.ToInt32(command.ExecuteScalar()); // Используем total_changes() в SQLite для определения изменений
}
Особенности управления ресурсами при исключениях
При выполнении SQL операций особое значение имеет управление ресурсами. Воспользуйтесь конструкцией using
для контекста подключения к базе данных, чтобы не допустить утечек и обеспечить корректное закрытие соединений.
Интерпретация возвращаемых значений методом ExecuteNonQuery
Помните, что метод ExecuteNonQuery()
может возвращать -1
, что означает, что результат операции неопределён или ни одна строка не была затронута, чаще всего по причине отмены выполнения или ОТКАТА. Положительные значения свидетельствуют о успешных операциях добавления или изменения данных (INSERT
, UPDATE
, DELETE
).
Дополнительное чтение и возможности расширения знаний
Хотите разобраться в деталях использования ExecuteNonQuery()
? Изучите документацию SqlCommand, в которой вы найдёте множество полезных инструкций и описаний возможных исключений.
Визуализация
Представьте .NET как строительную площадку. Здесь ExecuteNonQuery
выступает в роли начальника 🧑🔧, отдающего приказы рабочим:
Когда начальник 🧑🔧 командует "Кладите кирпич за кирпичем!" 🧱🛠️
Рабочие исполняют задачу:
1. Первый ряд [🧱🧱🧱]
2. Второй ряд [🧱🧱🧱🧱🧱]
3. Третий ряд [🧱🏗️🧱]
Результаты деятельности начальника:
"3 ряда окончены, 0 рядов разобрано"
// Аналогично отчёту метода ExecuteNonQuery о количестве обработанных строк
Положительные числа соответствуют созданию (добавлению данных), а отрицательные – отмене операции (уничтожению данных)! 🚧➕🚧➖
Объединяя всё вместе: SQL и .NET
Понимание роли ExecuteNonQuery
в SQL-операциях при использовании .NET важно для создания надёжного и точного слоя доступа к данным. Ключом к успешному управлению операциями с данными является использование транзакций, корректная обработка исключений и учёт особенностей различных баз данных.
Не забывайте завершать транзакции после выполнения массовых запросов, иначе база данных может "возмутиться" и отменить все изменения, выполненные в рамках транзакции.
Полезные материалы
- Метод SqlCommand.ExecuteNonQuery (System.Data.SqlClient) | Microsoft Learn — официальная документация Microsoft, где подробно раскрывается работа
ExecuteNonQuery
. - Статья на C# Corner о получении количества изменённых строк в SQL — практическое руководство по определению количества затронутых строк после
ExecuteNonQuery
. - Статья на SQL Shack о выполнении команд ADO.NET SqlCommand — разбор нюансов выполнения команд ADO.NET SqlCommand, необходимых каждому разработчику SQL.