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

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.

Преобразовать SqlDataAdapter в массив

Author24 — интернет-сервис помощи студентам

Массив: Преобразовать массив, прибавив к четным числам, входящим в массив, значение первого элемента.
Есть задача С клавиатуры вводятся элементы целочисленного массива размера N. Преобразовать его.

sqlDataAdapter и sqlCommand
Начал осваивать asp.net по книге Анатолий Постолит Разработка приложений бд, там описывается.

Работа с sqlDataAdapter
У меня не получается получить данные запроса. Я выполняю запрос и хочу присвоить результат на.

запрос к БД от SqlDataAdapter
Вызовом метода Update() класса SqlDataAdapter можно зафиксировать все изменения произведенные в.

Эксперт .NET

11947 / 8270 / 1259
Регистрация: 21.01.2016
Сообщений: 31,091

Dimitrii, у вас данные уже хранятся в DataTable. Что хотите с ними, то и делайте: хотите обрабатывайте, хотите в другую коллекцию переводите.

Администратор

Эксперт .NET

16746 / 13156 / 5155
Регистрация: 17.03.2014
Сообщений: 26,825
Записей в блоге: 1
Dimitrii, вот так можно

1 2 3 4 5 6 7 8 9 10 11 12
int rowCount = data.Data.Tables[0].Rows.Count; int columnCount = data.Data.Tables[0].Columns.Count; string[,] arr = new string[rowCount, columnCount]; DataTable table = ds.Tables[0]; for (int i = 0; i  rowCount; i++) { for (int j = 0; j  columnCount; j++) { arr[i, j] = table.Rows[i][j].ToString(); } }

Но наверное все-таки лучше использовать сам DataTable, как уже посоветовали.
3491 / 2494 / 1174
Регистрация: 14.08.2016
Сообщений: 8,197
OwenGlendower, кхм, в 4й строке не ошибка? это же по идее не должно скомпилиться?
Администратор

Эксперт .NET

16746 / 13156 / 5155
Регистрация: 17.03.2014
Сообщений: 26,825
Записей в блоге: 1
Diamante, так точно. Исправил.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

sqlDataAdapter.Fill. исключение
Необработанное исключение типа "System.StackOverflowException" в System.Windows.Forms.dll я ведь.

SqlDataAdapter не заполняет Dataset
Пытаюсь заполнить типизированный Dataset для банальной Northwind, но безрезультатно. .

SqlDataAdapter не обновляет таблицу
Доброго времени суток. Перерыл все, испробовал все варианты, SqlDataAdapter отказывается обновлять.

SqlDataAdapter надо ли закрывать
Добрый день товарищи ! возник такой вопрос. вот обычное подключение к базе и чтение и заполнение.

Не работает sqlDataAdapter.Update();
Всем привет! C# MVS 2008 server based database.mdf sqlDataAdapter юзаю DataSet(не.

sqlDataAdapter не создается инструкция UPDATE
Привет всем! Добрый вечер! Начал осваивать VS 2008 вкупе с SQL server 2008 и Visual Basic.

Или воспользуйтесь поиском по форуму:

Загрузка данных в набор данных

Прежде DataSet чем выполнять запросы к объекту с помощью LINQ to DataSet, необходимо сначала заполнить объект . Существует несколько способов заполнения объекта DataSet. Например, можно использовать LINQ to SQL для запроса базы данных и загрузки результатов в DataSet. Дополнительные сведения см. в разделе LINQ to SQL.

Другой распространенный способ загрузки данных в объект DataSet — использование класса DataAdapter для получения данных из базы данных. Это продемонстрировано в следующем примере.

Пример

В этом примере объект DataAdapter используется для запроса к базе данных AdventureWorks, получения сведений о продажах начиная с 2002 года и загрузки результатов в объект DataSet. DataSet После заполнения можно создавать запросы к нему с помощью LINQ to DataSet. Метод FillDataSet в этом примере используется в примерах запросов в LINQ to DataSet Examples. Дополнительные сведения см. в разделе Запрос наборов данных.

try < // Create a new adapter and give it a query to fetch sales order, contact, // address, and product information for sales in the year 2002. Point connection // information to the configuration setting "AdventureWorks". string connectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;" + "Integrated Security=true;"; SqlDataAdapter da = new SqlDataAdapter( "SELECT SalesOrderID, ContactID, OrderDate, OnlineOrderFlag, " + "TotalDue, SalesOrderNumber, Status, ShipToAddressID, BillToAddressID " + "FROM Sales.SalesOrderHeader " + "WHERE DATEPART(YEAR, OrderDate) = @year; " + "SELECT d.SalesOrderID, d.SalesOrderDetailID, d.OrderQty, " + "d.ProductID, d.UnitPrice " + "FROM Sales.SalesOrderDetail d " + "INNER JOIN Sales.SalesOrderHeader h " + "ON d.SalesOrderID = h.SalesOrderID " + "WHERE DATEPART(YEAR, OrderDate) = @year; " + "SELECT p.ProductID, p.Name, p.ProductNumber, p.MakeFlag, " + "p.Color, p.ListPrice, p.Size, p.Class, p.Style, p.Weight " + "FROM Production.Product p; " + "SELECT DISTINCT a.AddressID, a.AddressLine1, a.AddressLine2, " + "a.City, a.StateProvinceID, a.PostalCode " + "FROM Person.Address a " + "INNER JOIN Sales.SalesOrderHeader h " + "ON a.AddressID = h.ShipToAddressID OR a.AddressID = h.BillToAddressID " + "WHERE DATEPART(YEAR, OrderDate) = @year; " + "SELECT DISTINCT c.ContactID, c.Title, c.FirstName, " + "c.LastName, c.EmailAddress, c.Phone " + "FROM Person.Contact c " + "INNER JOIN Sales.SalesOrderHeader h " + "ON c.ContactID = h.ContactID " + "WHERE DATEPART(YEAR, OrderDate) = @year;", connectionString); // Add table mappings. da.SelectCommand.Parameters.AddWithValue("@year", 2002); da.TableMappings.Add("Table", "SalesOrderHeader"); da.TableMappings.Add("Table1", "SalesOrderDetail"); da.TableMappings.Add("Table2", "Product"); da.TableMappings.Add("Table3", "Address"); da.TableMappings.Add("Table4", "Contact"); // Fill the DataSet. da.Fill(ds); // Add data relations. DataTable orderHeader = ds.Tables["SalesOrderHeader"]; DataTable orderDetail = ds.Tables["SalesOrderDetail"]; DataRelation order = new DataRelation("SalesOrderHeaderDetail", orderHeader.Columns["SalesOrderID"], orderDetail.Columns["SalesOrderID"], true); ds.Relations.Add(order); DataTable contact = ds.Tables["Contact"]; DataTable orderHeader2 = ds.Tables["SalesOrderHeader"]; DataRelation orderContact = new DataRelation("SalesOrderContact", contact.Columns["ContactID"], orderHeader2.Columns["ContactID"], true); ds.Relations.Add(orderContact); >catch (SqlException ex)
Try Dim connectionString As String connectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;" & _ "Integrated Security=true;" ' Create a new adapter and give it a query to fetch sales order, contact, ' address, and product information for sales in the year 2002. Point connection ' information to the configuration setting "AdventureWorks". Dim da = New SqlDataAdapter( _ "SELECT SalesOrderID, ContactID, OrderDate, OnlineOrderFlag, " & _ "TotalDue, SalesOrderNumber, Status, ShipToAddressID, BillToAddressID " & _ "FROM Sales.SalesOrderHeader " & _ "WHERE DATEPART(YEAR, OrderDate) = @year; " & _ "SELECT d.SalesOrderID, d.SalesOrderDetailID, d.OrderQty, " & _ "d.ProductID, d.UnitPrice " & _ "FROM Sales.SalesOrderDetail d " & _ "INNER JOIN Sales.SalesOrderHeader h " & _ "ON d.SalesOrderID = h.SalesOrderID " & _ "WHERE DATEPART(YEAR, OrderDate) = @year; " & _ "SELECT p.ProductID, p.Name, p.ProductNumber, p.MakeFlag, " & _ "p.Color, p.ListPrice, p.Size, p.Class, p.Style " & _ "FROM Production.Product p; " & _ "SELECT DISTINCT a.AddressID, a.AddressLine1, a.AddressLine2, " & _ "a.City, a.StateProvinceID, a.PostalCode " & _ "FROM Person.Address a " & _ "INNER JOIN Sales.SalesOrderHeader h " & _ "ON a.AddressID = h.ShipToAddressID OR a.AddressID = h.BillToAddressID " & _ "WHERE DATEPART(YEAR, OrderDate) = @year; " & _ "SELECT DISTINCT c.ContactID, c.Title, c.FirstName, " & _ "c.LastName, c.EmailAddress, c.Phone " & _ "FROM Person.Contact c " & _ "INNER JOIN Sales.SalesOrderHeader h " & _ "ON c.ContactID = h.ContactID " & _ "WHERE DATEPART(YEAR, OrderDate) = @year;", _ connectionString) ' Add table mappings. da.SelectCommand.Parameters.AddWithValue("@year", 2002) da.TableMappings.Add("Table", "SalesOrderHeader") da.TableMappings.Add("Table1", "SalesOrderDetail") da.TableMappings.Add("Table2", "Product") da.TableMappings.Add("Table3", "Address") da.TableMappings.Add("Table4", "Contact") da.Fill(ds) ' Add data relations. Dim orderHeader As DataTable = ds.Tables("SalesOrderHeader") Dim orderDetail As DataTable = ds.Tables("SalesOrderDetail") Dim co As DataRelation = New DataRelation("SalesOrderHeaderDetail", _ orderHeader.Columns("SalesOrderID"), _ orderDetail.Columns("SalesOrderID"), True) ds.Relations.Add(co) Dim contact As DataTable = ds.Tables("Contact") Dim orderContact As DataRelation = New DataRelation("SalesOrderContact", _ contact.Columns("ContactID"), _ orderHeader.Columns("ContactID"), True) ds.Relations.Add(orderContact) Catch ex As SqlException Console.WriteLine("SQL exception occurred: " & ex.Message) End Try 

См. также раздел

  • Общие сведения о LINQ to DataSet
  • Запросы к DataSet
  • Примеры LINQ to DataSet

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

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