Executenonquery c что это

от admin

Для чего используется cmd.ExecuteNonQuery(), если необходимо возвращать выходное значение хранимой процедуры?

ExecuteNonQuery используется для того, что написано в его имени — исполнения процедуры без возврата результата запроса.

Дело в том, что хранимая процедура в TSQL может возвращать значения двумя путями: через результирующие наборы (когда в процедуре есть предложения SELECT без INSERT INTO) и через возвращаемое значение (предложение RETURN). В случае первого способа данные можно получить через ExecuteReader или ExecuteScalar, а во втором случае необходимо использовать ExecuteNonQuery и считать возвращаемое значение через параметр ReturnValue, как это сделано в коде из вопроса.

Классы Command и DataReader

позволяет выполнить SQL-оператор любого типа. Хотя класс Command можно использовать для решения задач определения данных (таких как создание и изменение баз данных, таблиц и индексов), все же более вероятно его применение для выполнения задач манипулирования данными (вроде извлечения и обновления записей в таблице).

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

Основные сведения о командах

Прежде чем использовать команду, необходимо выбрать ее тип, установить ее текст и привязать к соединению. Всю эту работу можно выполнить, установив значения соответствующих свойств (CommandType, CommandText и Connection), либо передать необходимую информацию в аргументах конструктора.

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

Команда будет выполнять прямой оператор SQL. Оператор SQL указывается в свойстве CommandText. Это — значение по умолчанию

Команда будет выполнять хранимую процедуру в источнике данных. Свойство CommandText представляет имя хранимой процедуры

Команда будет опрашивать все записи таблицы. CommandText — имя таблицы, из которой команда извлечет все записи. (Эта опция предназначена только для обратной совместимости с некоторыми драйверами OLE DB. Она не поддерживается поставщиком данных SQL Server и не работает так хорошо, как тщательно направленный запрос.)

Например, ниже показано, как создать объект Command, представляющий запрос:

А вот более эффективный способ использования одного конструктора Command. Обратите внимание, что указывать CommandType не нужно, поскольку значение CommandType.Text принимается по умолчанию:

В этих примерах объект Command просто определяется, но не выполняется. Объект Command предоставляет три метода, которые можно использовать для выполнения команды, в зависимости от того, нужно ли вам извлечь полный результирующий набор, получить единственное значение или просто выполнить отличную от запроса команду. Эти методы перечислены в таблице ниже:

Выполняет команды, отличные от select, такие как SQL-операторы вставки, удаления или обновления записей. Возвращаемое значение указывает количество строк, обработанных командой. Метод ExecuteNonQuery() также можно использовать для выполнения команд определения данных, которые создают, изменяют и уничтожают объекты базы данных (наподобие таблиц, индексов, ограничений и т.п.)

Выполняет запрос select и возвращает значение первого поля первой строки из набора строк, сгенерированного командой. Этот метод обычно применяется при выполнении агрегатной команды select, использующей функции вроде count() или sum() для вычисления единственного значения

Выполняет запрос select и возвращает объект DataReader, который является оболочкой однонаправленного курсора, доступного только для чтения

Чуть позже я продемонстрирую использование этих методов, но для начала нужно разобрать класс DataReader, экземпляр которого возвращает метод ExecuteReader().

Класс DataReader

Класс DataReader позволяет читать данные, возвращенные командой SELECT, по одной строке за раз, в однонаправленном, доступном только для чтения потоке. Иногда это называют курсором. Использование DataReader — простейший путь получения данных, но ему недостает возможностей сортировки и связывания автономного объекта DataSet. Однако DataReader представляет наиболее быстрый способ доступа к данным. Ниже перечислены основные методы DataReader:

Перемещает курсор строки на следующую строку в потоке. Этот метод также должен быть вызван перед чтением первой строки данных (Когда DataReader создается впервые, курсор строки помещается в позицию непосредственно перед первой строкой.) Метод Read() возвращает true, если существует следующая строка для чтения, или false, если прочитана последняя строка в наборе

Возвращает значение, сохраненное в поле с указанным именем столбца или индексом, внутри текущей выбранной строки. Тип возвращенного значения — ближайший тип .NET, наиболее соответствующий встроенному значению, хранимому в источнике данных. Если вы обратитесь к полю по индексу и нечаянно передадите неверный индекс, ссылающийся на несуществующее поле, то получите исключение IndexOutOfRangeException. Используя индексатор для DataReader, можно получить значение по имени поля

Сохраняет значения текущей строки в массиве. Количество сохраняемых полей зависит от размеров массива, переданного этому методу. С помощью свойства DataReader.FieldCount можно определить действительное количество полей в строке и воспользоваться этой информацией для создания массива нужного размера, если нужно сохранить в нем все поля

Эти методы возвращают значение поля с указанным индексом в текущей строке, причем тип данных указывается в имени метода. Обратите внимание, что если попытаться присвоить возвращенное значение переменной неверного типа, возникнет исключение InvalidCastException. Кроме того, эти методы не поддерживают типов, допускающих NULL-значения.

Если поле может содержать null, это придется проверить перед вызовом одного из методов. Чтобы проверить на null-значение, сравните непреобразованное значение (которое можно извлечь по позиции методом GetValue() или по имени с помощью индексатора DataReader) с константой DBNull.Value

Если команда, которая сгенерировала DataReader, возвратила более одного набора строк, этот метод перемещает указатель на следующую строку и устанавливает его непосредственно перед первой строкой

Закрывает модуль чтения. Если исходная команда запустила хранимую процедуру, возвратившую выходное значение, это значение может быть прочитано из соответствующего параметра после закрытия модуля чтения

Метод ExecuteReader() и DataReader

В следующем примере создается простая команда запроса, которая должна вернуть все записи из таблицы Employees базы данных Northwind. Команда создается при загрузке страницы. Соединение открывается, и команда выполняется методом ExecuteReader(), который возвращает SqlDataReader. Получив DataReader, можно организовать цикл для прохождения по его записям, вызывая метод Read() в теле цикла. Этот метод перемещает курсор строки на следующую запись (при первом вызове — на первую строку). Метод Read() также возвращает булевское значение, означающее наличие последующих строк для чтения. В следующем примере цикл продолжается до тех пор, пока Read() не вернет false, после чего элегантно завершается:

Обратите внимание, что этот код читает значение поля TitleOfCourtesy, обращаясь к нему по имени, через индексатор Item. Поскольку свойство Item — индексатор по умолчанию, явно включать имя свойства Item при извлечении значения поля не понадобится. Далее код читает поля LastName и FirstName, вызывая GetString() с индексом поля (1 и 2 в данном случае). И, наконец, код обращается к полю HireDate, вызывая метод GetDateTime() с индексом поля, равным 6. Все эти подходы эквивалентны и включены сюда для демонстрации поддерживаемых вариантов.

Запустив эту страницу, вы увидите результат, показанный на рисунке ниже:

Выполнение команды ADO.NET

В большинстве страниц ASP.NET столь трудоемкий подход для отображения данных использовать не придется. Вместо этого вы будете применять элементы управления данными, которые описаны в последующих статьях. Однако DataAdapter, скорее всего, будет использоваться при написании кода доступа к данным в компоненте базы данных.

Значения null

Как вам уже наверняка известно, базы данных используют значения null для представления отсутствующей или неопределенной информации. Эту же концепцию можно использовать в .NET с типами, допускающими значения null, которые принимают значения и null-ссылки. Ниже приведен пример с целочисленной переменной, допускающей значение null:

К сожалению, DataReader не интегрируется с допускающими null значениями .NET. Это расхождение объясняется причинами исторического характера. Допускающие null типы данных впервые появились в .NET 2.0, когда модель DataReader уже хорошо устоялась, и ее было трудно менять.

Вместо этого DataReader возвращает константу DBNull.Value, когда встречает в базе данных значение null. Попытка использовать это значение или привести его к другому типу данных вызовет исключение. (Печально, но никакого способа приведения между DBNull.Value и типами, допускающими null, не существует.) В результате должна предприниматься проверка на DBNull.Value там, где это может возникнуть, с использованием следующего кода:

Перечисление CommandBehavior

Метод ExecuteReader() имеет перегруженную версию, которая принимает в качестве параметра значение перечисления CommandBehavior. Одно из часто используемых его значений — CommandBehavior.CloseConnection. Когда это значение передается ExecuteReader(), то DataReader закрывает ассоциированное с ним соединение, как только закрывается сам DataReader (при использовании конструкции using в применении этой опции нет смысла).

Другое допустимое значение — CommandBehavior.SingleRow — повышает производительность выполнения запроса, когда нужно извлечь единственную строку. Например, если вы извлекаете единственную запись, используя уникальное значение первичного ключа (CustomerID, Production и т.д.), то можно применить эту оптимизацию. Можно также использовать CommandBehavior.SequentialAccess для чтения части двоичного поля, что снижает расход памяти при чтении больших двоичных полей.

Другие значения перечисления применяют реже, поэтому здесь не рассматриваются. Полный список можно найти в документации по .NET.

Обработка множества результирующих наборов

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

Читать:
Getaxis unity что это

Команда может вернуть более одного результирующего набора двумя способами:

Если вызывается хранимая процедура, она может содержать несколько операторов SELECT.

Если вы используете простую текстовую команду, то можете собрать вместе несколько SQL-команд, разделяя их точками с запятой (;). Не все поставщики данных поддерживают такой прием, однако поставщик SQL Server это делает.

Ниже приведен пример строки, определяющей пакет из трех команд select:

Строка содержит три запроса. Все вместе они возвращают первые пять записей из таблицы Employees, первые пять записей из таблицы Customers и первые пять — из таблицы Suppliers. Обработка результатов достаточно проста. Вначале DataReader обеспечивает доступ к результатам из таблицы Employees. По завершении чтения методом Read() всех этих записей вызывается метод NextResult() для перехода к следующему результирующему набору. Когда больше не остается результирующих наборов, этот метод вернет false.

Проход по всем результирующим наборам можно организовать в цикле while, хотя в этом случае нужно проявить осторожность и не вызвать NextResult() до завершения чтения первого результирующего набора. Ниже показан пример применения этого более специализированного приема:

Обратите внимание, что в этом случае доступ ко всем полям осуществляется с использованием обобщенного метода GetValue(), который принимает индекс читаемого поля. Причина в том, что код спроектирован для чтения всех полей всех возвращаемых результирующих наборов, независимо от того, какой запрос применяется в каждом случае. Однако в реальном приложении базы данных вы почти наверняка будете знать имена и типы всех полей всех таблиц.

Метод ExecuteScalar()

Метод ExecuteScalar() возвращает значение сохраненной в первом поле первой строки результирующего набора, сгенерированного запросом SELECT команды. Этот метод обычно применяется для выполнения запросов, возвращающих единственное поле, возможно, вычисленное агрегатной функцией SQL вроде COUNT() или SUM().

Следующая процедура демонстрирует, как можно с таким подходом получить (и отобразить на странице) количество записей таблицы Employees:

Код достаточно прост, но стоит отметить, что вы должны привести возвращаемое значение к правильному типу, поскольку ExecuteScalar() возвращает объект.

Метод ExecuteNonQuery()

Метод ExecuteNonQuery() выполняет команды, которые не возвращают результирующих наборов, такие как INSERT, DELETE или UPDATE. Метод ExecuteNonQuery() возвращает одну порцию информации — количество обработанных записей (или -1, если команда отлична от INSERT, DELETE или UPDATE). Применение этого метода класса Command аналогично предыдущим методам.

Executenonquery c что это

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

После установки подключения мы можем выполнить к базе данных какие-либо команды, например, добавить в базу данных объект, удалить, изменить его или просто извлечь. Команды представлены объектом интерфейса System.Data.IDbCommand. Провайдер для MS SQL предоставляет его реализацию в виде класса SqlCommand . Этот класс инкапсулирует sql-выражение, которое должно быть выполнено.

Для выполнения команды нам потребуется sql-выражение и объект подключения:

С помощью свойства CommandText устанавливается SQL-выражение, которое будет выполняться. В данном случае это запрос на получение всех объектов из таблицы Users. А с помощью свойства Connection можно установить объект подключения SqlConnection.

В качестве альтернативы можно было бы использовать одну из версий конструктора класса:

Чтобы выполнить команду, необходимо применить один из методов SqlCommand:

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

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

ExecuteScalar : выполняет sql-выражение и возвращает одно скалярное значение, например, число. Подходит для sql-выражения SELECT в паре с одной из встроенных функций SQL, как например, Min, Max, Sum, Count.

Добавление объектов

Выполним команду по добавлению одного объекта в таблицу Users базы данных usersdb, которая ранее была создана:

Для вставки объекта используется sql-выражение INSERT, которое имеет следующий синтаксис:

В данном случае мы знаем, что в базе данных у нас есть таблица Users, в которой есть три столбца — Id и Age, хранящие целое число, и Name, хранящий строку. Поэтому соответственно мы добавляем для столбца Name значение ‘Tom’, а для столбца Age число 18.

Здесь метод ExecuteNonOuery() возвращает число затронутых строк (в данном случае добавленных в таблицу объектов). Хотя нам необязательно возвращать результат метода, но данный результат может использоваться в качестве проверки, что операция, в частности, добавление, прошла успешно.

Чтобы убедиться, что данные добавлены, мы можем перейти к таблице Users в SQL Server Management Studio и с помощью опции Select Top 1000 Rows вывести добавленную строку:

Добавление в БД через SqlCommand

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

Обновление будет происходить аналогично, только теперь будет использоваться sql-выражение UPDATE, которое имеет следующий синтаксис:

Применим это выражение:

Здесь обновляется строка, в которой Name=Tom, то есть выше добавленный объект. Если в таблице будет несколько строк, у которых Name=Tom, то обновятся все эти строки.

Удаление

Удаление производится с помощью sql-выражения DELETE, которое имеет следующий синтаксис:

Удалим, например, всех пользователей, у которых имя Tom:

Во всех трех случаях фактически меняется только sql-выражение, а остальная логика остается неизменной. И мы также можем выполнять сразу несколько операций:

Using executenonquery insert,edit,delete and update examples in c#

This tutorial demonstrate to explained using executenonquery insert, update, delete and update with examples and how to use ado.net in sqlcommand method in c# .

ExecuteNonQuery is basically used for operations where there is nothing returned from the sql query or stored procedure .preffered use will be for insert,update and delete operation.

ExecuteNonQuery is one of the most popular to used method in sqlcommand object and is used to executing statements.And this tasks performed well in data manipulation tasks ..

Before this tutorial previous learn How to create login page in C#:>>How to create login form in C#

create a database named as finacial.

create a table and named as login

create table login (id int primary key identity(1,1) not null, username varchar(50) not null, password varchar(50) not null);

create table and named as recharge

CREATE TABLE recharge(

id int primary key IDENTITY(1,1) NOT NULL,

mobilenetwork varchar(50) NULL,

mobilenumber varchar(50) NULL,

amount varchar(40) NULL,

date varchar(60) NULL,

status varchar(50) NULL);

And then create two empty file named as

1.login.cs

2.rrmain.cs

1.login.cs

public partial class Login : Form

SqlConnection con = new SqlConnection(“Data Source=.\\sqlexpress;Initial Catalog=finacial;Integrated Security=True”);

private void button1_Click(object sender, EventArgs e)

SqlDataAdapter sda = new SqlDataAdapter(“select Count(*) from login where username=’” + textBox1.Text + “‘ and password=’” + textBox2.Text + “‘“,con);

DataTable dt = new DataTable();

if (dt.Rows[0][0].ToString() == “1”)

RR_Main rm = new RR_Main();

private void button2_Click(object sender, EventArgs e)

2.rrmain.cs

public partial class RR_Main : Form

SqlConnection con = new SqlConnection(“Data Source=.\\sqlexpress;Initial Catalog=finacial;Integrated Security=True”);

private void btnNew(object sender, EventArgs e)

private void btnsave(object sender, EventArgs e)

SqlCommand cm = new SqlCommand(“insert into recharge ( mobilenetwork, mobilenumber, amount , date , status) values (‘“ + comboBox1.Text + “‘,’” + textBox2.Text + “‘,’” + textBox3.Text + “‘,’” + dateTimePicker2.Text + “‘,’”+comboBox8.Text+”’)”, con);

SqlDataAdapter sda = new SqlDataAdapter(“select * from recharge”,con);

System.Data.DataTable dt = new System.Data.DataTable();

foreach (DataRow items in dt.Rows)

int n = dataGridView1.Rows.Add();

dataGridView1.Rows[n].Cells[0].Value = (n + 1).ToString();

private void textBox2_TextChanged(object sender, EventArgs e)

if (textBox2.TextLength <= 10)

private void dataGridView1_MouseClick(object sender, MouseEventArgs e)

private void btnupdate(object sender, EventArgs e)

SqlCommand cm = new SqlCommand(“Update recharge set mobilenetwork=’” + comboBox1.Text + “‘,mobilenumber=’” + textBox2.Text + “‘,amount=’” + textBox3.Text + “‘,status=’”+comboBox8.Text+”’ where +textBox16.Text + “‘“, con);

private void textBox15_TextChanged(object sender, EventArgs e)

SqlDataAdapter sda = new SqlDataAdapter(“select * from recharge where date like ‘%” + textBox15.Text + “%’ or mobilenumber like ‘“ + textBox15.Text + “%’”, con);

System.Data.DataTable dt = new System.Data.DataTable();

foreach (DataRow items in dt.Rows)

int n = dataGridView1.Rows.Add();

dataGridView1.Rows[n].Cells[0].Value = (n + 1).ToString();

private void btndelete(object sender, EventArgs e)

SqlCommand cm = new SqlCommand(“delete from recharge where con);

private void RR_Main_FormClosed(object sender, FormClosedEventArgs e)

private void changePasswordToolStripMenuItem_Click(object sender, EventArgs e)

Change_Password cp = new Change_Password();

private void exitToolStripMenuItem_Click(object sender, EventArgs e)

In this tutorial,i create code to login type.Displaying data in a tabular format is a task you are likely to perform frequently. The DataGridView control is designed to be a complete solution for displaying tabular data with Windows Forms. The DataGridView control is highly configurable and extensible, and it provides many properties, methods, and events to customize its appearance and behavior.

The DataGridView control makes it easy to define the basic appearance of cells and the display formatting of cell values. The cell is the fundamental unit of interaction for the DataGridView.

In my datagridview is clickable and update the data using datagridview_mousevent () and what it has in my screenshot i create the code like the way and when your data is enter automatically the data is display in Gridview table just copy and paste my code and use it.

In this step we will learn C# executenonquery insert,edit,delete and update

it will helps you with your need. The next time I will put some more interesting commands, and continue project thank you this is helpful for you will Like That’s all, You can customize this code further as per your requirement. And please feel free to give comments on this tutorial.

Похожие статьи