Лабораторная работа № 3
ADO.NET
3.1 Цель работы
Изучить возможности доступа к базам данных, используя технологию ADO.NET, получить практические навыки по работе с классами ADO.NET.
3.2 Теоретические сведенья
3.2.1 Общие сведения об ADO.NET
ADO.NET (ActiveX Data Object .NET) – набор классов, используемый для доступа к источникам данных в платформе .NET. ADO.NET поддерживает асинхронный доступ к данным и сериализацию данных, получаемых из хранилища, в формате XML.
ADO.NET не предлагает единого набора типов для связи со всеми СУБД. В пространстве имен System.Data.Common находятся базовые классы и интерфейсы, а соответствующие производные типы для разных поставщиков данных – в одноименных пространствах System.Data.SqlClient, System.Data.Odbc и т.п.
И хотя имена этих реализующих типов разные, можно создать весьма универсальный программный код, благодаря использованию полиморфизма и специального объекта класса DbProviderFactory, с помощью которого извлекаются объекты данных, специфичные для каждого поставщика.
Библиотеки ADO.NET могут использоваться в рамках двух концептуально различных способах взаимодействия: на связном уровне, для чего используются классы подсоединенных объектов или несвязном уровне, где нужны классы отсоединенных объектов (рис. 3.1).
Рисунок 3.1 – Организация классов ADO.NET
При использовании связного уровня программный код непосредственно соединяется с соответствующим хранилищем данных, и отсоединяется от него, когда задачи взаимодействия решены. Несвязный уровень, напротив, позволяет получить набор объектов, функционирующих как клиентские копии внешних данных.
3.3 Текст программы
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
namespace lab3
{
public partial class Form1 : Form
{
//Ссылка на подключение
private NpgsqlConnection connection = null;
//Ссылка на DataSet
private DataSet dataSet = null;
//Ссылки на DataAdapter для группы и студента
private NpgsqlDataAdapter prodDataAdapter = null;
private NpgsqlDataAdapter tovarDataAdapter = null;
//Ссылки на вспомогательные формы
private Form2 form2 = null;
private Form3 form3 = null;
private Form4 form4 = null;
public void setConnection(NpgsqlConnection connection)
{
this.connection = connection;
}
//Создание DataSet
private DataSet getDataSet()
{
if (dataSet == null)
{
dataSet = new DataSet();
dataSet.Tables.Add("Prodavec");
dataSet.Tables.Add("Tovar");
}
return dataSet;
}
//Получить форму установления соединения
public Form2 getForm2()
{
if (form2 == null)
{
form2 = new Form2();
form2.setPerent(this);
}
return form2;
}
//Установить соединение с базой
public NpgsqlConnection Connect(string host, int port, string database,
string user, string parol)
{
NpgsqlConnectionStringBuilder stringBuilder =
new NpgsqlConnectionStringBuilder();
stringBuilder.Host = host;
stringBuilder.Port = port;
stringBuilder.UserName = user;
stringBuilder.Password = parol;
stringBuilder.Database = database;
stringBuilder.Timeout = 30;
NpgsqlConnection connection =
new NpgsqlConnection(stringBuilder.ConnectionString);
connection.Open();
return connection;
}
//Заполнить DataGridView1 студентами
public void FillDataGridView1ByProdavec()
{
getDataSet().Tables["Prodavec"].Clear();
prodDataAdapter = new NpgsqlDataAdapter(
"SELECT * FROM Prodavec", connection);
new NpgsqlCommandBuilder(prodDataAdapter);
prodDataAdapter.Fill(getDataSet(), "Prodavec");
dataGridView1.DataSource = getDataSet().Tables["Prodavec"];
}
//Заполнить DataGridView2 студентами заданной группы
public void FillDataGridView2ByTovar(string name)
{
getDataSet().Tables["Tovar"].Clear();
tovarDataAdapter = new NpgsqlDataAdapter(
"SELECT Tovar.id, name, price, ves, prodavecid " +
"FROM Prodavec, Tovar " +
"WHERE Prodavec.id = Tovar.prodavecid AND nameprod = '" + name + "'", connection);
new NpgsqlCommandBuilder(tovarDataAdapter);
tovarDataAdapter.Fill(dataSet, "Tovar");
dataGridView2.DataSource = getDataSet().Tables["Tovar"];
}
//Получить форму добавления и замены группы
public Form3 getForm3()
{
if (form3 == null)
{
form3 = new Form3();
form3.setPerent(this);
}
return form3;
}
//Добавить группу
public void AddGroup(string name,
string surname, int god)
{
getDataSet().Tables["Prodavec"].Rows.Add(0, name,
surname, god);
prodDataAdapter.Update(getDataSet(), "Prodavec");
}
//Заменить группу
public void UpdateGroup(int row, string name,
string surname, int god)
{
getDataSet().Tables["Prodavec"].Rows[row]["nameprod"] = name;
getDataSet().Tables["Prodavec"].Rows[row]["surname"] = surname;
getDataSet().Tables["Prodavec"].Rows[row]["god"] = god;
prodDataAdapter.Update(getDataSet(), "Prodavec");
}
//Получить форму добавления и замены студента
public Form4 getForm4()
{
if (form4 == null)
{
form4 = new Form4();
form4.setPerent(this);
}
return form4;
}
//Добавить студента
public void AddStudent(string name,
int price, int ves, long prodId)
{
getDataSet().Tables["Tovar"].Rows.Add(0, name, price, ves, prodId);
tovarDataAdapter.Update(getDataSet(), "Tovar");
}
//Заменить студента
public void UpdateStudent(int row, string name,
int price, int ves)
{
getDataSet().Tables["Tovar"].Rows[row]["name"] = name;
getDataSet().Tables["Tovar"].Rows[row]["price"] = price;
getDataSet().Tables["Tovar"].Rows[row]["ves"] = ves;
tovarDataAdapter.Update(getDataSet(), "Tovar");
}
public Form1()
{
InitializeComponent();
}
private void подключениеКБазеToolStripMenuItem_Click(object sender, EventArgs e)
{
getForm2().Visible = true;
}
private void отключениеОтБазыToolStripMenuItem_Click(object sender, EventArgs e)
{
connection.Close();
}
private void добавитьToolStripMenuItem_Click(object sender, EventArgs e)
{
getForm3().Visible = true;
getForm3().setButton1Visible(true);
getForm3().setButton2Visible(false);
getForm3().setTextBox1Text("");
getForm3().setTextBox2Text("");
getForm3().setTextBox3Text("");
}
private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)
{
int selectedRow = dataGridView1.SelectedCells[0].RowIndex;
DialogResult dr = MessageBox.Show("Удалить продавца?", "",
MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
getDataSet().Tables["Prodavec"].Rows[selectedRow].Delete();
prodDataAdapter.Update(getDataSet(), "Prodavec");
getDataSet().Clear();
FillDataGridView1ByProdavec();
}
}
private void заменитьToolStripMenuItem_Click(object sender, EventArgs e)
{
int selectedRow = dataGridView1.SelectedCells[0].RowIndex;
string name = (string)getDataSet().Tables["Prodavec"].Rows[selectedRow].ItemArray[1];
string surname = (string)getDataSet().Tables["Prodavec"].Rows[selectedRow].ItemArray[2];
int god = (int)getDataSet().Tables["Prodavec"].Rows[selectedRow].ItemArray[3];
getForm3().Visible = true;
getForm3().setButton1Visible(false);
getForm3().setButton2Visible(true);
getForm3().setTextBox1Text(name);
getForm3().setTextBox2Text(surname);
getForm3().setTextBox3Text(System.Convert.ToString(god));
getForm3().setRow(selectedRow);
}
private void добавитьToolStripMenuItem1_Click(object sender, EventArgs e)
{
getForm4().Visible = true;
getForm4().setButton1Visible(true);
getForm4().setButton2Visible(false);
getForm4().setTextBox1Text("");
getForm4().setTextBox2Text("");
getForm4().setTextBox3Text("");
int selectedRow = dataGridView1.SelectedCells[0].RowIndex;
long prodavecId = (long)getDataSet().Tables["Prodavec"].Rows[selectedRow].ItemArray[0];
string nameprod = (string)getDataSet().Tables["Prodavec"].Rows[selectedRow].ItemArray[1];
getForm4().setGroupName(nameprod);
getForm4().setGroupId(prodavecId);
}
private void удалитьToolStripMenuItem1_Click(object sender, EventArgs e)
{
int selectedRow = dataGridView2.SelectedCells[0].RowIndex;
DialogResult dr = MessageBox.Show("Удалить товар?", "",
MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
getDataSet().Tables["Tovar"].Rows[selectedRow].Delete();
tovarDataAdapter.Update(getDataSet(), "Tovar");
string key = (string)dataGridView1
.Rows[selectedRow].Cells[1].Value;
FillDataGridView2ByTovar(key);
}
}
private void заменитьToolStripMenuItem1_Click(object sender, EventArgs e)
{
int selectedRow = dataGridView2.SelectedCells[0].RowIndex;
string name = (string)getDataSet().Tables["Tovar"]
.Rows[selectedRow].ItemArray[1];
int price = (int)getDataSet().Tables["Tovar"]
.Rows[selectedRow].ItemArray[2];
int ves = (int)getDataSet().Tables["Tovar"]
.Rows[selectedRow].ItemArray[3];
getForm4().Visible = true;
getForm4().setButton1Visible(false);
getForm4().setButton2Visible(true);
getForm4().setTextBox1Text(name);
getForm4().setTextBox2Text(System.Convert.ToString(price));
getForm4().setTextBox3Text(System.Convert.ToString(ves));
getForm4().setRow(selectedRow);
int selectedRow1 = dataGridView1.SelectedCells[0].RowIndex;
string groupName = (string)getDataSet().Tables["Prodavec"]
.Rows[selectedRow1].ItemArray[1];
getForm4().setGroupName(groupName);
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
int selectedRow = dataGridView1.SelectedCells[0].RowIndex;
string key = (string)dataGridView1.Rows[selectedRow].Cells[1].Value;
FillDataGridView2ByTovar(key);
}
private void сортировка1ToolStripMenuItem_Click(object sender, EventArgs e)
{
DataViewManager dvm = new DataViewManager();
dvm.DataSet = dataSet;
dvm.DataViewSettings["Prodavec"].Sort = "nameprod";
dataGridView1.DataSource = dvm;
dataGridView1.DataMember = "Prodavec";
}
private void сортировка2ToolStripMenuItem_Click(object sender, EventArgs e)
{
DataViewManager dvm = new DataViewManager();
dvm.DataSet = dataSet;
dvm.DataViewSettings["Prodavec"].Sort = "id";
dataGridView1.DataSource = dvm;
dataGridView1.DataMember = "Prodavec";
}
}
}
Form2.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
namespace lab3
{
public partial class Form2 : Form
{
private Form1 perent;
public void setPerent(Form1 perent)
{
this.perent = perent;
}
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string server = "localhost";
int port = 5432;
string database = "market";
string user = "postgres";
string passwd = "06031992";
NpgsqlConnection connection =
perent.Connect(server, port, database, user, passwd);
perent.setConnection(connection);
perent.FillDataGridView1ByProdavec();
this.Visible = false;
}
}
}
Form3.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace lab3
{
public partial class Form3 : Form
{
private Form1 perent = null;
private int row;
public void setPerent(Form1 perent)
{
this.perent = perent;
}
public void setRow(int row)
{
this.row = row;
}
public void setTextBox1Text(string text)
{
textBox1.Text = text;
}
public void setTextBox2Text(string text)
{
textBox2.Text = text;
}
public void setTextBox3Text(string text)
{
textBox3.Text = text;
}
public void setButton1Visible(bool value)
{
this.button1.Visible = value;
}
public void setButton2Visible(bool value)
{
this.button2.Visible = value;
}
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
perent.AddGroup(textBox1.Text, textBox2.Text, System.Convert.ToInt32(textBox3.Text));
perent.FillDataGridView1ByProdavec();
this.Visible = false;
}
private void button2_Click(object sender, EventArgs e)
{
perent.UpdateGroup(row, textBox1.Text, textBox2.Text, System.Convert.ToInt32(textBox3.Text));
perent.FillDataGridView1ByProdavec();
this.Visible = false;
}
}
}
Form4.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace lab3
{
public partial class Form4 : Form
{
private Form1 perent = null;
private string nameprod;
private long groupId;
private int row;
public void setPerent(Form1 perent)
{
this.perent = perent;
}
public void setGroupName(string nameprod)
{
this.nameprod = nameprod;
}
public void setGroupId(long groupId)
{
this.groupId = groupId;
}
public void setRow(int row)
{
this.row = row;
}
public void setTextBox1Text(string text)
{
textBox1.Text = text;
}
public void setTextBox2Text(string text)
{
textBox2.Text = text;
}
public void setTextBox3Text(string text)
{
textBox3.Text = text;
}
public void setButton1Visible(bool value)
{
this.button1.Visible = value;
}
public void setButton2Visible(bool value)
{
this.button2.Visible = value;
}
public Form4()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
perent.AddStudent(textBox1.Text, System.Convert.ToInt32(textBox2.Text), System.Convert.ToInt32(textBox3.Text), groupId);
perent.FillDataGridView2ByTovar(nameprod);
this.Visible = false;
}
private void button2_Click(object sender, EventArgs e)
{
perent.UpdateStudent(row, textBox1.Text, System.Convert.ToInt32(textBox2.Text),
System.Convert.ToInt32(textBox3.Text));
perent.FillDataGridView2ByTovar(nameprod);
this.Visible = false;
}
}
}
Рисунок 3.2 – Интерфейс программы
Выводы
В данной лабораторной были изучены возможности доступа к базам данных, используя технологию ADO.NET, получены практические навыки по работе с классами ADO.NET.