C mysqldataadapter как получить строку запроса
Перейти к содержимому

C mysqldataadapter как получить строку запроса

  • автор:

Работа с SqlDataAdapter и DataSet

Ранее для получения данных мы использовали объект SqlDataReader, с помощью которого построчно можно перебрать ответ от сервера базы данных. Но есть и другой способ, который демонстрирует использование объектов SqlDataAdapter и DataSet. DataSet представляет хранилище данных, с которыми можно работать независимо от наличия подключения, а SqlDataAdapter заполняет DataSet данными из БД.

Для получения данных через объект SqlDataAdapter необходимо организовать подключение к БД и выполнить команду SELECT. Есть несколько способов создания SqlDataAdapter:

SqlDataAdapter adapter = new SqlDataAdapter(); SqlDataAdapter adapter = new SqlDataAdapter(command); SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); SqlDataAdapter adapter = new SqlDataAdapter(sql, connectionString);
  • Можно использовать конструктор без параметров, а команду SELECT и подключение установить позже
  • Можно передать в конструктор объект SqlCommand
  • Можно в конструкторе установить sql-выражение SELECT и объект SqlConnection
  • Можно в конструкторе установить sql-выражение SELECT и строку подключения

Рассмотрим, как получить данные в DataSet через SqlDataAdapter. Для работы с DataSet особенно удобно использовать элементы управления, которые могут заполняться из внешнего источника данных, например, DataGridView в Windows Forms. Поэтому создадим новый проект по типу Windows Forms Application.

Добавим на единственную форму в проекте элемент DataGridView и определим следующий код формы:

using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace AdoNetWinFormsApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; string sql = "SELECT * FROM Users"; using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); // Создаем объект DataAdapter SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); // Создаем объект Dataset DataSet ds = new DataSet(); // Заполняем Dataset adapter.Fill(ds); // Отображаем данные dataGridView1.DataSource = ds.Tables[0]; >> > >

В конструкторе формы в DataGridView загружаются данные. Для загрузки данных создается объект SqlDataAdapter, который принимает объект подключения и sql-выражение SELECT. Затем создается объект DataSet и с помощью метода adapter.Fill() в него загружаются данные. Дальше происходит установка источника данных для DataGridView:

dataGridView1.DataSource = ds.Tables[0];

В качестве источника устанавливается одна из таблиц в DataSet. Каждая таблица представляет объект DataTable, и в DataSet может быть определено несколько таких таблиц. Но в данном случае при выборке в DataSet есть только одна таблица, которую мы можем получить из коллекции Tables по индексу.

DataSet

Ранее для получения данных мы использовали объект SqlDataReader, с помощью которого построчно можно перебрать ответ от сервера базы данных. Но есть и другой способ, который демонстрирует использование объектов DataSet .

Класс DataSet из пространства имен System.Data представляет хранилище или кэш данных в памяти, извлеченных из источника данных. Объект DataSet содержит таблицы, которые представлены типом DataTable . Таблица DataTable , в свою очередь, состоит из столбцов и строк. Каждый столбец представляет объект DataColumn , а строка — объект DataRow .

Для наполнения объекта DataSet данными из источника данных применяется класс System.Data.Common.DataAdapter (который реализует интерфейс System.Data.IDataAdapter ), а точнее его реализации, предназначенные для работы с определенной СУБД.

Для заполнения объекта DataSet у объекта DataAdapter вызывается метод Fill() , в который в качестве параметра передается заполняемый объект DataSet.

Метод Fill() неявно открывает объект подключения, который хранится в свойстве Connection объекта DataAdapter , если это подключение не открыто. Если метод Fill() открывает подключение, то после получения данных метод Fill закрывает это подключение.

Если подключение до вызова метода Fill() ранее уже было открыто, например, с помощью метода Open()/OpenAsync() , метод Fill просто использует это подключение.

SqlDataAdapter

Для работы с БД SQL Server пакет Microsoft.Data.SqlClient как раз предоставляет реализацию DataAdapter в виде класса SqlDataAdapter .

Для получения данных через объект SqlDataAdapter необходимо организовать подключение к БД и выполнить команду SELECT. Есть несколько способов создания SqlDataAdapter:

SqlDataAdapter adapter = new SqlDataAdapter(); SqlDataAdapter adapter = new SqlDataAdapter(command); SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); SqlDataAdapter adapter = new SqlDataAdapter(sql, connectionString);

Для работы SqlDataAdapter необходим объект SqlConnection, либо строка подключения и выполняемое SQL-выражение «SELECT».

Пример наполнения DataSet с помощью SqlDataAdapter:

using System; using System.Data; using Microsoft.Data.SqlClient; namespace HelloApp < class Program < static void Main(string[] args) < string connectionString = "Server=(localdb)\\mssqllocaldb;Database=adonetdb;Trusted_Connection=True;"; string sql = "SELECT * FROM Users"; using (SqlConnection connection = new SqlConnection(connectionString)) < // Создаем объект DataAdapter SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); // Создаем объект DataSet DataSet ds = new DataSet(); // Заполняем Dataset adapter.Fill(ds); >Console.Read(); > > >

В этом случае в DataSet окажутся данные, извлеченные с помощью выражения SELECT * FROM Users .

DataTable, столбцы и строки

Объект DataSet состоит из набора объектов DataTable . Для доступа к таблицам в DataSet определено свойство Tables , которое представляет объект DataTableCollection .

Объект DataTable , в свою очередь, состоит из набора объектов DataColumn — описания столбцов таблицы, которые определяют схему таблицы и которые можно получить через свойство Columns .

Кроме столбцов класс DataTable определяет свойство Rows , которое представляет тип DataRowCollection и которое хранит строки таблицы. Каждая строка представляет класс DataRow .

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

  • Item[Int32] : возвращает или устанавливает значение ячейки по ее индексу. Возвращает значение типа object .
  • Item[String] : возвращает или устанавливает значение ячейки по имени столбца. Возвращает значение типа object .
  • ItemArray : возвращает или устанавливает значения всех ячеек строки в виде объекта object[]

Теперь используем все выше рассмотренные типы, чтобы получить данные таблицы и вывести их содержимое на консоль:

using System; using System.Data; using Microsoft.Data.SqlClient; namespace HelloApp < class Program < static void Main(string[] args) < string connectionString = "Server=(localdb)\\mssqllocaldb;Database=adonetdb;Trusted_Connection=True;"; string sql = "SELECT * FROM Users"; using (SqlConnection connection = new SqlConnection(connectionString)) < // Создаем объект DataAdapter SqlDataAdapter adapter = new SqlDataAdapter(sql, connection); // Создаем объект Dataset DataSet ds = new DataSet(); // Заполняем Dataset adapter.Fill(ds); // Отображаем данные // перебор всех таблиц foreach (DataTable dt in ds.Tables) < foreach (DataColumn column in dt.Columns) Console.Write($"\t"); Console.WriteLine(); // перебор всех строк таблицы foreach (DataRow row in dt.Rows) < // получаем все ячейки строки var cells = row.ItemArray; foreach (object cell in cells) Console.Write($"\t"); Console.WriteLine(); > > > Console.Read(); > > >

Консольный вывод в моем случае:

Id Age Name 2 32 Alice 3 28 Bob 19 36 Tom 22 34 Tim 23 31 Kate

Хотя DataSet представляет самодостаточный класс, с которым можно работать вне зависимости от применяемой технологии на .NET, однако чаще всего он применяется именно для связи элементов управления для отображения данных c БД, например, элемента DataGridView в Windows Forms.

C mysqldataadapter как получить строку запроса

Доброго времени суток! Подскажите пожалуйста как обратится/получить результаты запроса? В Дэлфи это без проблем реализуется а на ШАРПЕ не получается?(

Пример кода который должен вернуть строчку текста. База MS-SQL 2008:

FromAllSource.SelectCommand = "select sms from FroAll"; FromAllSource.DataBind();

«»Сериалы и компьютерные игры это словно вторая жизнь, которою ты проживаешь, во главе главного героя или персонажа, параллельно своей!»»

Регистрация: 09.01.2008
Сообщений: 26,238
например, так:

 public static string ExecuteScalar(string sql) < SqlConnection cnn = new SqlConnection("тут строка подключения к БД"); cnn.Open(); SqlCommand mycommand = new SqlCommand(cnn); mycommand.CommandText = sql; object value = mycommand.ExecuteScalar(); cnn.Close(); if (value != null) < return value.ToString(); >return ""; > . String MySMS = ExecuteScalar("select top 1 sms from FroAll");

p.s. писал тут. могут быть опечатки, описки, ошибки в регистре методов/переменных и т.п.

p.p.s. это просто ОДИН из МНОЖЕСТВА вариантов решения заявленной в топике задачи (получить в переменной результата запроса)!

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Форумчанин
Регистрация: 28.03.2009
Сообщений: 393

Спасибо огромное! Попробую работает ли.
Но есть вопрос! В «тут строка подключения к БД» нужно использовать название строки подключения которая уже существует?

«»Сериалы и компьютерные игры это словно вторая жизнь, которою ты проживаешь, во главе главного героя или персонажа, параллельно своей!»»

Регистрация: 09.01.2008
Сообщений: 26,238

нужно использовать название строки подключения которая уже существует?

разумеется! И можно, и нужно!

Кстати, если я правильно догадываюсь, то FromAllSource — это датаадаптер.
Например, это SqlDataAdapter
Покажите, как Вы его иницилизировали! (возможно, через строку подключения? или через SqlConnection. )

[offtop]
кстати. вот что меня шокировало (да и продолжает шокировать в C# (ну и в .NET, соответственно)) — так это то, что одно и тоже действие может быть сделано множеством РАЗНООБРАЗНЕЙШИХ методов и способов!
(поясню на простейшем примере.
допустим. есть массив A[1..N]. нужно найти максимальную величину.
на паскале будет цикл от 1 до N (максимальные вариации — цикл будет for или while или repeat) и последовательный перебор элементов массива, сравнение их с переменной. ВСЁ!
Но не так в C#! Тут цикл может быть как по переменной, так и foreach.
а можно найти максимум просто запросом к массиву:

 byte[] byt = < 97, 115, 150, 97, 115 >; byte iMax = byt.Max(); MessageBox.Show(iMax.ToString());

и я уверен, что это далеко не единственный «хитрый» способ! (LINQ, лямбда функции и ещё всякие другие «страшные» слова помогут решить задачу по другому. )

возвращаясь к SqlDataAdapter
new SqlDataAdapter имеет 4 варианта. какой использовать — выбирать Вам.

это я всё к тому, что вашу задачу можно решить и другими способами.

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Как выполнить Sql-запрос в c#?

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

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

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

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

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

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