- Автор темы
- #1
Прелюдия к практическому примеру.
Если обратиться к первоисточникам (MSDN), то можно заметить, что классы для работы с ODBC и классы для работы с OleDb чрезвычайно схожи как по названиям, так и по названиям методов и свойств, которые они содержат. В данном разделе мы рассмотрим функцию, которая отсутствует в классе для работы с ODBC (надеюсь, читатель сумеет ответить на вопрос почему). Эта функция позволяет определить структуру базы данных, к которой произошло подключение.
Класс OleDbConnection
public DataTable GetOleDbSchemaTable(Guid schema, object[] restrictions);
Данная функция возвращает информацию о структуре элементов, указанных в первом параметре, в виде таблицы.
Первый параметр - поле ненаследуемого класса OleDbSchemaGuid, в котором необходимо указать тип запрашиваемой информации. Информацию можно запросить о: таблицах базы, структуре таблиц базы, ограничениях, ключах, хранимых процедурах и т. д.
Второй параметр содержит информацию, специфичную для первого параметра. Например, если необходимо узнать какие таблицы хранятся в базе данных, то второй параметр будет массивом из 4-х элементов.
примеры, или заглянув в MSDN.
Практический пример работы с базами с помощью ADO.NET.
Данное приложение является учебным примером, в котором пользователь имеет возможность осуществить просмотр структуры таблиц базы данных "Library".
Домашнее задание
Реализовать построение схемы данных (а-ля Access) произвольной базы данных (в базе более одной таблицы).
Если обратиться к первоисточникам (MSDN), то можно заметить, что классы для работы с ODBC и классы для работы с OleDb чрезвычайно схожи как по названиям, так и по названиям методов и свойств, которые они содержат. В данном разделе мы рассмотрим функцию, которая отсутствует в классе для работы с ODBC (надеюсь, читатель сумеет ответить на вопрос почему). Эта функция позволяет определить структуру базы данных, к которой произошло подключение.
Класс OleDbConnection
public DataTable GetOleDbSchemaTable(Guid schema, object[] restrictions);
Данная функция возвращает информацию о структуре элементов, указанных в первом параметре, в виде таблицы.
Первый параметр - поле ненаследуемого класса OleDbSchemaGuid, в котором необходимо указать тип запрашиваемой информации. Информацию можно запросить о: таблицах базы, структуре таблиц базы, ограничениях, ключах, хранимых процедурах и т. д.
Второй параметр содержит информацию, специфичную для первого параметра. Например, если необходимо узнать какие таблицы хранятся в базе данных, то второй параметр будет массивом из 4-х элементов.
- Имя каталога базы данных или null, если провайдер не поддерживает каталоги.
- Имя схемы базы данных или null, если провайдер не поддерживает схемы.
- Имя таблицы или null, если необходимо получить информацию о всех таблицах.
- Тип таблицы, например, "TABLE" - таблицы, "VIEW" - представления, "SYSTEM TABLE" - системные таблицы и т. д.
примеры, или заглянув в MSDN.
Практический пример работы с базами с помощью ADO.NET.
Данное приложение является учебным примером, в котором пользователь имеет возможность осуществить просмотр структуры таблиц базы данных "Library".
Код:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
using System.Data.OleDb;
namespace CSharpApplication.OleDb
{
class OleDbExample : Form
{
// Источник данных
DataSet dataset = new DataSet("Library");
// Сетка
DataGrid datagrid = new DataGrid();
// Объект для подключения к базы данных через
// OleDb Provider
OleDbConnection connection = new OleDbConnection();
static void Main()
{
Application.Run(new OleDbExample());
}
OleDbExample()
{
this.WindowState = FormWindowState.Maximized;
this.Text = "OleDb Example";
// Строка соединения для Access'овской базы данных
string con = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=Library.mdb";
connection.ConnectionString = con;
// Открываем соединение
connection.Open();
// Получаем список таблиц пользователя, находящихся в базе
DataTable Tables = connection.GetOleDbSchemaTable(
OleDbSchemaGuid.Tables,
new object[] {null, null, null, "TABLE"});
// Перебираем строки полученной таблицы
foreach(DataRow row in Tables.Rows)
{
// Вынимаем имя таблицы пользователя (3-й столбец)
string Name = (string)row[2];
// Вынимаем структуру столбцов для этой таблицы
DataTable ColumnsInTable = connection.GetOleDbSchemaTable(
OleDbSchemaGuid.Columns,
new object[] {null, null, Name, null});
// Удаляем "излишние" данные
// (Определяются опытным путем)
ColumnsInTable.Columns.RemoveAt(0);
ColumnsInTable.Columns.RemoveAt(0);
ColumnsInTable.Columns.RemoveAt(0);
ColumnsInTable.Columns.RemoveAt(1);
ColumnsInTable.Columns.RemoveAt(1);
ColumnsInTable.Columns.RemoveAt(4);
ColumnsInTable.Columns.RemoveAt(5);
ColumnsInTable.Columns.RemoveAt(5);
ColumnsInTable.Columns.RemoveAt(6);
ColumnsInTable.Columns.RemoveAt(9);
ColumnsInTable.Columns.RemoveAt(9);
ColumnsInTable.Columns.RemoveAt(10);
ColumnsInTable.Columns.RemoveAt(10);
ColumnsInTable.Columns.RemoveAt(10);
ColumnsInTable.Columns.RemoveAt(10);
ColumnsInTable.Columns.RemoveAt(10);
ColumnsInTable.Columns.RemoveAt(10);
// Присваиваем этой таблице имя
ColumnsInTable.TableName = Name;
// Добавляем таблицу в источник данных
dataset.Tables.Add(ColumnsInTable);
}
datagrid.Parent = this;
// Указываем на отображаемый сеткой источник данных
datagrid.DataSource = dataset;
datagrid.ClientSize = this.ClientSize;
datagrid.Location = new Point(0, 0);
datagrid.Anchor = AnchorStyles.Bottom | AnchorStyles.Top |
AnchorStyles.Left | AnchorStyles.Right;
// Заголовок сетки
datagrid.CaptionText = "Structure of tables of database \"Library\"";
// Шрифт заголовка сетки
datagrid.CaptionFont = new Font("Verdana", 16);
// Цвет ссылок на названия таблиц
datagrid.LinkColor = Color.Blue;
// Шрифт сетки
datagrid.Font = new Font("Arial", 10);
// Сетка предназначена только для чтения
datagrid.ReadOnly = true;
// Разворачиваем имена таблиц
datagrid.Expand(-1);
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
// Закрываем соединение
connection.Close();
base.OnClosing (e);
}
}
}
Домашнее задание
Реализовать построение схемы данных (а-ля Access) произвольной базы данных (в базе более одной таблицы).