Хочу обратить ваше внимание на существование весьма интересного информационного ресурса Yahoo! Groupshttp://groups.yahoo.com.
Это тематические почтовые форумы - аналог Дискуссионных групп на Subscribe.ru. Форумов на Yahoo! десятки тысяч
разнообразной тематики, в том числе и по программированию. Я попробовал подписаться на несколько форумов, и уже на
следующий день был завален кучей писем, многие из которых написаны рекламными роботами. Да, есть среди них и полезная
информация, но в основном - это мусор. И надо постараться, чтобы выудить из этой кучи интересное. В целом, можно
сделать вывод, что форумы Yahoo! - ресурс интересный, но сильно замусоренный.
Продолжим разбираться с .Net и СУБД Oracle. На всякий случай отмечу, что если вы используете другую СУБД,
то эти статьи вам тоже полезны. Например, для СУБД MS SQLServer. Замените класс System.Data.OracleClient
на класс System.Data.SQLClient.
Выборка из базы.
В .Net многие действия можно сделать разными способами и выборка данных не исключение. Например, выборку можно
реализовать следующим образом: извлечь данные с помощью класса OracleDataReader в коллекцию и работать с ней. А можно
воспользоваться интересным классом DataGridView. Класс DataGridView я сейчас рассмотрю.
Обратите внимание на примечание в MSDN: Этот класс новый, появился в .NET Framework начиная с версии 2.0.
Класс DataGridView наиболее полезен, если данные извлекаются в первую очередь для отображения пользователю.
Итак, помещаем на форму контрол System.Windows.Forms.DataGridView и называем его PrjList. При запуске
приложения он отобразится как List (таблица).
В конструктор формы прописываем следующий код инициализации:
BindingSource bindingSource1 = new BindingSource();
try
{
bindingSource1.DataSource = GetData("Select PrjType as Тип, PrjName as Имя, "+
"PrjPriority as Приоритет from tPrjm_refrencePrj");
PrjList.DataSource = bindingSource1;
}
catch (OracleException msg)
{
MessageBox.Show(msg.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
BindingSource - класс, осуществляющий привязку данных, он задает источник, откуда возьмутся данные для отображения
в контроле. В моем случае это выборка из таблицы tPrjm_refrencePrj. Обратите внимание на конструкцию as…
в выборке, так я задаю имена столбцов для отображения в контроле.
Теперь осталось только описать метод GetData.
Он может быть таким.
private static DataTable GetData(string vCommandStr)
{
string vConnectionString =
"Data Source=" + "<Имя базы>" +
";User Id=" + "<Пользователь>" +
";Password=" + "<Пароль>";
OracleConnection vConnection = new OracleConnection(vConnectionString);
OracleCommand vCommand = new OracleCommand(vCommandStr,vConnection);
OracleDataAdapter adapter = new OracleDataAdapter();
adapter.SelectCommand = vCommand;
DataTable vTable = new DataTable();
DataColumn vColumn;
// ColumnName and add to DataTable.
vColumn = new DataColumn();
vColumn.DataType = System.Type.GetType("System.Int32");
vColumn.ColumnName = "Тип";
vTable.Columns.Add(vColumn);
// ColumnName and add to DataTable.
vColumn = new DataColumn();
vColumn.DataType = System.Type.GetType("System.String");
vColumn.ColumnName = "Имя";
vTable.Columns.Add(vColumn);
// ColumnName and add to DataTable.
vColumn = new DataColumn();
vColumn.DataType = System.Type.GetType("System.Int32");
vColumn.ColumnName = "Приоритет";
vTable.Columns.Add(vColumn);
vTable.Locale = System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(vTable);
return vTable;
}
Я делаю следующее:
Устанавливаю соединение с базой (OracleConnection).
Создаю команду выборки (OracleCommand).
Создаю DataAdapter. Это представление набора команд, данных и соединения с базой данных, предназначено для
заполнения данными класса DataSet и обновления базы.
Создаю DataTable - представление таблицы данных в памяти, таким образом я задаю форму выдачи данных на экран.
Если это не сделать то по умолчанию DataGridView покажет таблицу, полученную командой select,
причем имена столбцов возьмутся из конструкции as…. С помощью DataTable я настраиваю DataGridView
нужным мне образом. Установка DataTable не представляет особых затруднений, нужно лишь описать необходимые
столбцы, задав имя и тип данных.
После того как DataTable готова, ее можно заполнить, используя OracleDataAdapter.
Выбранные данные, будут автоматически переданы в DataGridView и выведены в форму.
Описанный выше способ выборки и отображения данных работоспособен, но как-то немного коряв. Например,
имена столбцов должны задаваться и в функции select через as… и при описании DataTable. Если опустить описание
в DataTable, то имена отобразятся БОЛЬШИМИ БУКВАМИ, что не очень красиво. Кроме того, если структура таблицы
изменится, то придется дополнительно изменять описание DataTable, что опять же не гибко. Можно, конечно,
задавать имена столбцов коллекцией и потом вычитывать их при необходимости. Но должен быть и более элегантный способ.
Давайте его искать…