Моделирование работы библиотеки на С#
1. Техническое задание
Решается задача разработки программы
моделирующей работу библиотеки. По условию программа должна содержать
информацию о книгах и абонентах. Должна присутствовать возможность принять
нового абонента или книги, удаление из библиотеки или редактирование информации
о нем, а также должна быть функция поиска по базе книг и граждан, записанных в
библиотеку. Осуществлять запись литературы на данного человека и сдача их в
определенную дату. База касса должна быть сделана в Access и связана с программой
на С#. Программа может быть написана на Visual С#.
Для начала определимся со средой
разработки данного программного обеспечения. При работе пользователя с
программой очень важную роль играет графический интерфейс и эргономика. Тем
более, с программами такого рода работают операторы, обладающие
пользовательскими знаниями персонального компьютера. Поэтому важным при
разработке программы будет интуитивно понятный и эргономичный интерфейс. Также
следует учесть, что работа будет вестись с базой данных Access. Важно определиться с
элементами управления, которые обеспечат наглядное представление информации из
базы данных, а также позволят с лёгкостью редактировать записи и удалять их.
Данная программа не рассчитана на сетевой режим. Она будет корректно работать
под операционной системой Windows c версией Framework v2.0.
2. Описание программы
2.1 Описание формы
2.1.1 Главное меню
На рисунке 1 изображена форма
главного меню, в котором осуществляется выбор необходимой функции: поиск книги,
поиск абонента, добавление или удаление книги, добавление или удаление
абонента, запись книги на дом и сдача ее.
Рисунок 1 - Form 1 - Меню.
2.1.2 Поиск книги
Здесь осуществляет непосредственный
поиск книги в данной библиотеке. Вводимые параметры: наименование, автор,
издательство, год издания. Программа обнаруживает данную книгу и выводит ее в
таблицу. Удобство заключается в том, что можно смотреть как по отдельным
графам, так и вводить данные все вместе, чтобы осуществить более точный поиск.
Рисунок 2 - Form 2 - Поиск книги
2.1.3 Поиск абонента
В следующей форме, представленной на
рисунке 3, показан поиск абонента. Библиотекарю необходимо ввести такие
параметры как: фамилия, имя, отчество, дата рождения, город, улица, дом,
квартира, данные паспорта, чтобы посмотреть записан ли данный гражданин в
библиотеку. Если такой человек существует, то необходимо возвратиться в меню,
для записи книги на дом. В обратном случае, можно добавить абонента.
Рисунок 3 - Form 3 - Поиск абонента
2.1.4 Добавление или
удаление книги из библиотеки
В случае потери или книга в
неудовлетворительном виде, ее можно списать или попросту удалить из базы
данных. При привозе или заказе в библиотеку новых книг их так же можно добавить
в список.
Рисунок 4 - Form 4 - Добавление или
удаление книги из библиотеки.
2.1.5 Добавление или
удаление абонента из библиотеки
В случае смены места жительства, или
каких либо других причин возможно удаление абонента из библиотеки, а также
изменение фамилии, номера паспорта и других параметров.
Рисунок 5 - Form 5 - Добавление или
удаление абонента из библиотеки
2.1.6 Запись и сдача
книг
В данном окне можно записать одну
или несколько книг на определенный срок, предварительно найдя абонента и книгу,
если ее количество экземпляров есть в данный момент в библиотеке.
Рисунок 6 - Form 6 - Запись и сдача книг
2.1.7 Должники
В данное окно заносятся граждане,
кто не успел принести литературу вовремя. Окно с должниками вынесено отдельно
для удобства библиотекаря, чтобы он смог позвонить и оповестить абонентов о
задолженности.
Рисунок 7 - Form 7 - Должники
2.2 Общий алгоритм
При запуске данной программы
открывается главное меню Form1_Load, при выполнении функций radioButton1, radioButton2, radioButton3,
radioButton4, radioButton5, происходит выбор соответствующей формы. При помощи
кнопок Button1_Click происходит переход на форму и Button2_Click реализуется выход из
программы.
В Form2_Load подключается таблица с
книгами. В Button1_Click выполняется переход в главное меню. В Button2_Click записывается в базу
данных новая книга через значения textbox. В Button3_Click выполняется удаление строки базы данных.
В Form3_Load подключается таблица с
абонентами. В Button1_Click выполняется переход в главное меню. В Button2_Click записывается в базу
данных новый абонент через значения textbox. В Button3_Click выполняется удаление строки базы данных.
В Form4_Load подключается таблица с
книгами. В Button1_Click выполняется переход в главное меню. В Button3_Click, Button4_Click, Button5_Click, Button6_Click, проверяет на
совпадение значения textbox1, textbox2, textbox3, textbox4 соответственно и данных ячейки, при этом программа выделяет
соответствующую ячейку. В Button2_Click проверяет на совпадение значения textbox1, textbox2, textbox3, textbox4 одновременно и
выделяет соответствующую ячейку в базе данных.
В Form5_Load подключается таблица с
абонентами. В Button1_Click выполняется переход в главное меню. В Button3_Click проверяет на совпадение
значения Pass_TextChanged по номеру и серии паспортаи и выделяет
соответствующую ячейку в базе данных. В Button2_Click проверяет на совпадение
значения textbox1, textbox2, textbox3, textbox4, textbox5, textbox6, textbox7, DateOfBirth_ValueChanged одновременно и выделяет
соответствующую ячейку в базе данных.
В Form6_Load подключается таблица с
абонентами и книгами. В Button1_Click выполняется переход в главное меню. В Button7_Click проверяет на совпадение
значения Pass_TextChanged по номеру и серии паспортаи выделяет соответствующую
ячейку в базе данных. В Button8_Click проверяет на совпадение значения textbox5, textbox6, textbox7, textbox8, textbox9, textbox10, textbox11, DateOfBirth_ValueChanged
одновременно и выделяет соответствующую ячейку в базе данных. В Button3_Click, Button4_Click, Button5_Click, Button6_Click, проверяет на
совпадение значения textbox1, textbox2, textbox3, textbox4 соответственно и данных ячейки, при этом программа выделяет
соответствующую ячейку.
В Button2_Click проверяет на совпадение
значения textbox1, textbox2, textbox3, textbox4 одновременно и выделяет соответствующую ячейку в базе данных. В Button9_Click происходит запись книги
на абонента через дату. В RetDate_ValueChanged выбирается определенная дата
сдачи и заносится в таблицу базы данных. Уменьшает на единицу количество книг.
В Button10_Click происходит удаление
строки в базе данных о наличии книг на руках, увеличивается количество книг на
единицу в библиотеке.
В Form7_Load можно посмотреть список
должников, которые просрочили сдачу книг. Благодаря Button1_Click можно вернуться назад.
3. Исходный код
3.1 Form 1 - Главное меню
System;System. Collections.
Generic;System. ComponentModel;System. Data;System. Drawing;System.
Text;System. Windows. Forms;WindowsApplication1
{partial class Form1: Form
{Form1 ()
{();
}void radioButton1_CheckedChanged
(object sender, EventArgs e)
{
}void radioButton2_CheckedChanged
(object sender, EventArgs e)
{
}void button1_Click (object sender,
EventArgs e)
{(radioButton3. Checked == true)
{Hide();a =new Form2 ();.
ShowDialog();. Close();
}(radioButton4. Checked == true)
{Hide();a =new Form3 ();.
ShowDialog();. Close();
}(radioButton1. Checked == true)
{();a = new Form4 ();.
ShowDialog();. Close();
}(radioButton2. Checked == true)
{();a = new Form5 ();.
ShowDialog();. Close();
}(radioButton5. Checked == true)
{();a = new Form6 ();. ShowDialog();.
Close();
}
}void button2_Click (object sender,
EventArgs e)
{. Exit();
}void Form1_Load (object sender,
EventArgs e)
{
}
}
3.2 Form 2 - Поиск книги
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Text;System. Windows. Forms;System. Text.
RegularExpressions;WindowsApplication1
{partial class Form4:
Form
{Form4 ()
{();
}void
dataGridView1_CellContentClick (object sender, DataGridViewCellEventArgs e)
{
}void Form4_Load (object
sender, EventArgs e)
{
// TODO: This line of
code loads data into the 'libDataSet1. Книги' table. You can move, or remove
it, as needed..книгиTableAdapter. Fill (this.libDataSet1. Книги);
}void button1_Click
(object sender, EventArgs e)
{();a = new Form1 ();.
ShowDialog();. Close();
}void button2_Click
(object sender, EventArgs e)
{filter = «»;(textBox1.
Text!= «»)= «Наименование = '» + textBox1. Text + «'»;(textBox2. Text!= «»)
{(filter!= «»)+=
«AND»;+= «Автор = '» + textBox2. Text + «'»;
}(textBox3. Text!= «»)
{(filter!= «»)+= «AND»;+=
«Издательство = '» + textBox3. Text + «'»;
}(textBox4. Text!= «»)
{(Regex. IsMatch
(textBox4. Text, «^\\d+$»))
{(filter!= «»)+=
«AND»;+= «Год = '» + textBox4. Text + «'»;
}
}
книгиBindingSource.
Filter = filter;
}void button3_Click
(object sender, EventArgs e)
{filter = «»;(textBox1.
Text!= «»)= «Наименование = '» + textBox1. Text + «'»;
книгиBindingSource.
Filter = filter;
}void button4_Click
(object sender, EventArgs e)
{filter = «»;(textBox2.
Text!= «»)= «Автор = '» + textBox2. Text + «'»;
книгиBindingSource.
Filter = filter;
}void button5_Click
(object sender, EventArgs e)
{filter = «»;(textBox3.
Text!= «»)= «Издательство = '» + textBox3. Text + «'»;
книгиBindingSource.
Filter = filter;
}void button6_Click
(object sender, EventArgs e)
{filter = «»;(textBox4.
Text!= «»)(Regex. IsMatch (textBox4. Text, «^\\d+$»))+= «Год = '» + textBox4.
Text + «'»;
книгиBindingSource.
Filter = filter;
}
}
}
3.3 Form 3 - Поиск абонента
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Text;System. Windows. Forms;System. Text.
RegularExpressions;WindowsApplication1
{partial class Form5:
Form
{Form5 ()
{();
}void Form5_Load (object
sender, EventArgs e)
{
// TODO: This line of
code loads data into the 'libDataSet1. Абоненты' table. You can move, or remove
it, as needed..абонентыTableAdapter. Fill (this.libDataSet1. Абоненты);
}void button1_Click
(object sender, EventArgs e)
{();a = new Form1 ();.
ShowDialog();. Close();
}void label9_Click
(object sender, EventArgs e)
{
}void button2_Click
(object sender, EventArgs e)
{filter = «»;(textBox3.
Text!= «»)= «Фамилия = '» + textBox3. Text + «'»;(textBox1. Text!= «»)
{(filter!= «»)+=
«AND»;+= «Имя = '» + textBox1. Text + «'»;
}(textBox2. Text!= «»)
{(filter!= «»)+=
«AND»;+= «Отчество = '» + textBox2. Text + «'»;
}(filter!= «»)+=
«AND»;+= «[Дата рождения] = '» + DateOfBirth. Value. Date. ToString() +
«'»;(textBox5. Text!= «»)
{(filter!= «»)+=
«AND»;+= «Город = '» + textBox5. Text + «'»;
}(textBox6. Text!= «»)
{(filter!= «»)+=
«AND»;+= «Улица = '» + textBox6. Text + «'»;
}(textBox7. Text!= «»)
{(Regex. IsMatch
(textBox7. Text, «^\\d+$»))
{(filter!= «»)+=
«AND»;+= «Дом = '» + textBox7. Text + «'»;
}
}
(textBox4. Text!= «»)
{(Regex. IsMatch
(textBox4. Text, «^\\d+$»))
{(filter!= «»)+=
«AND»;+= «Квартира = '» + textBox4. Text + «'»;
}
}
(Pass. Text!= «»)
{(filter!= «»)+=
«AND»;+= «Паспорт = '» + Pass. Text + «'»;
}
}
абонентыBindingSource.
Filter = filter;
}void button3_Click
(object sender, EventArgs e)
{filter = «»;(Pass.
Text!= «» && Regex. IsMatch (Pass. Text, «^\\d+$»))+= «Паспорт = '» +
Pass. Text + «'»;
абонентыBindingSource.
Filter = filter;
}
}
}
.4 Form 4 - Добавление или удаление книги
using System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Text;System. Windows. Forms;WindowsApplication1
{partial class Form2:
Form
{Form2 ()
{();
}void
textBox1_TextChanged (object sender, EventArgs e)
{
}void Form2_Load (object
sender, EventArgs e)
{
// TODO: This line of
code loads data into the 'libDataSet1. Книги' table. You can move, or remove
it, as needed..книгиTableAdapter. Fill (this.libDataSet1. Книги);. Tables
[«Книги»].PrimaryKey = new DataColumn[] {libDataSet1. Tables
[«Книги»].Columns[0]};
}void label6_Click
(object sender, EventArgs e)
{
}void button1_Click
(object sender, EventArgs e)
{
книгиTableAdapter.
Update(libDataSet1);();a = new Form1 ();. ShowDialog();. Close();
}void button2_Click
(object sender, EventArgs e)
{(textBox1. Text!= «»
&& textBox2. Text!= «» && textBox3. Text!= «» &&
libDataSet1. Tables [«Книги»].Rows. Find (textBox1. Text) == null). Tables
[«Книги»].Rows. Add (textBox1. Text, textBox2. Text, textBox3. Text, Year.
Value, 0, BooksCountAll. Value);
}void button3_Click (object
sender, EventArgs e)
{(dataGridView1.
CurrentRow!= null)
{((int) dataGridView1.
CurrentRow. Cells[4].Value == 0). Rows. RemoveAt (dataGridView1. CurrentRow.
Index);. Show («Вы не можете удалить книгу, пока хотя бы один экземляр
находится на руках у абонентов.»);
}
}void
dataGridView1_CellContentClick (object sender, DataGridViewCellEventArgs e)
{
}void
textBox4_TextChanged (object sender, EventArgs e)
{
}void
dataSet1BindingSource_CurrentChanged (object sender, EventArgs e)
{
}
}
}
.5 Form 5 - Добавление или
удаление абонента
using System;System. Collections.
Generic;System. ComponentModel;System. Data;System. Drawing;System.
Text;System. Windows. Forms;System. Text.
RegularExpressions;WindowsApplication1
{partial class Form3: Form
{Form3 ()
{();
}void Form3_Load (object sender,
EventArgs e)
{
// TODO: This line of code loads
data into the 'libDataSet1. Абоненты' table. You can move, or remove it, as
needed..абонентыTableAdapter. Fill (this.libDataSet1. Абоненты);. Tables
[«Абоненты»].PrimaryKey = new DataColumn[] {libDataSet1. Tables
[«Абоненты»].Columns[8]};
}void label2_Click (object sender,
EventArgs e)
{
}void button1_Click (object sender,
EventArgs e)
{
абонентыTableAdapter.
Update(libDataSet1);();a = new Form1 ();. ShowDialog();. Close();
}void button3_Click (object sender,
EventArgs e)
{(dataGridView1. CurrentRow!= null)
{((int) dataGridView1. CurrentRow.
Cells[9].Value == 0). Rows. RemoveAt (dataGridView1. CurrentRow. Index);. Show
(«Вы не можете удалить абонента, пока у него на руках находится хотя бы одна
книга.»);
}
}void button2_Click (object sender,
EventArgs e)
{(textBox1. Text!= «» &&
textBox2. Text!= «» && textBox3. Text!= «» && textBox5. Text!=
«» &&. Text!= «» && Regex. IsMatch (Pass. Text, «^\\d+$»)
&& libDataSet1. Tables [«Абоненты»].Rows. Find (Pass. Text) == null).
Tables [«Абоненты»].Rows. Add (textBox3. Text, textBox1. Text, textBox2. Text,
DateOfBirth. Value. Date. ToString(), textBox5. Text, textBox6. Text, HouseNum.
Value, ApartNum. Value, Pass. Text, 0);
}void dateTimePicker1_ValueChanged
(object sender, EventArgs e)
{
}void numericUpDown1_ValueChanged
(object sender, EventArgs e)
{
}
}
}
3.6 Form 6 - Запись и сдача книг
System;System. Collections.
Generic;System. ComponentModel;System. Data;System. Drawing;System.
Text;System. Windows. Forms;System. Text.
RegularExpressions;WindowsApplication1
{partial class Form6: Form
{Form6 ()
}void button1_Click (object sender,
EventArgs e)
{
взятые_книгиTableAdapter.
Update(libDataSet1);
абонентыTableAdapter. Update(libDataSet1);
книгиTableAdapter.
Update(libDataSet1);();a = new Form1 ();. ShowDialog();. Close();
}void label6_Click (object sender,
EventArgs e)
{
}void Form6_Load (object sender,
EventArgs e)
{
// TODO: This line of code loads
data into the 'libDataSet1. Взятые_книги' table. You can move, or remove it, as
needed..взятые_книгиTableAdapter. Fill (this.libDataSet1.
Взятые_книги);.абонентыTableAdapter. Fill (this.libDataSet1.
Абоненты);.книгиTableAdapter. Fill (this.libDataSet1. Книги);. Tables [«Взятые_книги»].PrimaryKey
= new DataColumn[] {libDataSet1. Tables [«Взятые_книги»].Columns[0],
libDataSet1. Tables [«Взятые_книги»].Columns[1]};
}void button8_Click (object sender,
EventArgs e)
{filter = «»;(textBox9. Text!= «»)=
«Фамилия = '» + textBox9. Text + «'»;(textBox11. Text!= «»)
{(filter!= «»)+= «AND»;+= «Имя = '»
+ textBox11. Text + «'»;
}(textBox10. Text!= «»)
{(filter!= «»)+= «AND»;+= «Отчество
= '» + textBox10. Text + «'»;
}(filter!= «»)+= «AND»;+= «[Дата
рождения] = '» + DateOfBirth. Value. Date. ToString() + «'»;(textBox8. Text!=
«»)
{(filter!= «»)+= «AND»;+= «Город =
'» + textBox8. Text + «'»;
}(textBox6. Text!= «»)
{(filter!= «»)+= «AND»;+= «Улица =
'» + textBox6. Text + «'»;
}(textBox7. Text!= «»)
{(Regex. IsMatch (textBox7. Text,
«^\\d+$»))
{(filter!= «»)+= «AND»;+= «Дом = '»
+ textBox7. Text + «'»;
}
}(textBox5. Text!= «»)
{(Regex. IsMatch (textBox5. Text,
«^\\d+$»))
{(filter!= «»)+= «AND»;+= «Квартира
= '» + textBox5. Text + «'»;
}
}(Pass. Text!= «»)
{(Regex. IsMatch (Pass. Text,
«^\\d+$»))
{(filter!= «»)+= «AND»;+= «Паспорт =
'» + Pass. Text + «'»;
}
}
абонентыBindingSource. Filter =
filter;
}void button7_Click (object sender,
EventArgs e)
{filter = «»;(Pass. Text!= «»
&& Regex. IsMatch (Pass. Text, «^\\d+$»))+= «Паспорт = '» + Pass. Text
+ «'»;
абонентыBindingSource. Filter =
filter;
}void button2_Click (object sender,
EventArgs e)
{filter = «»;(textBox1. Text!= «»)=
«Наименование = '» + textBox1. Text + «'»;(textBox2. Text!= «»)
{(filter!= «»)+= «AND»;+= «Автор =
'» + textBox2. Text + «'»;
}(textBox3. Text!= «»)
{(filter!= «»)+= «AND»;+=
«Издательство = '» + textBox3. Text + «'»;
}(textBox4. Text!= «»)
{(Regex. IsMatch (textBox4. Text,
«^\\d+$»))
{(filter!= «»)+= «AND»;+= «Год = '»
+ textBox4. Text + «'»;
}
}
книгиBindingSource. Filter = filter;
}void button3_Click (object sender,
EventArgs e)
{filter = «»;(textBox1. Text!= «»)=
«Наименование = '» + textBox1. Text + «'»;
книгиBindingSource. Filter = filter;
}void button4_Click (object sender,
EventArgs e)
{filter = «»;(textBox2. Text!= «»)=
«Автор = '» + textBox2. Text + «'»;
книгиBindingSource. Filter = filter;
}void button5_Click (object sender,
EventArgs e)
{filter = «»;(textBox3. Text!= «»)=
«Издательство = '» + textBox3. Text + «'»;
книгиBindingSource. Filter = filter;
}void button6_Click (object sender,
EventArgs e)
{filter = «»;(textBox4. Text!=
«»)(Regex. IsMatch (textBox4. Text, «^\\d+$»))+= «Год = '» + textBox4. Text +
«'»;
книгиBindingSource. Filter = filter;
}void button9_Click (object sender,
EventArgs e)
{[] myarray = new object[2]
{dataGridView2. CurrentRow. Cells[8].Value. ToString(), dataGridView1.
CurrentRow. Cells[0].Value. ToString()};(dataGridView2. CurrentRow!= null
&& dataGridView1. CurrentRow!= null && libDataSet1. Tables
[«Взятые_книги»].Rows. Find(myarray) == null)
{book_row = (DataRowView)
dataGridView1. CurrentRow. DataBoundItem;((int) book_row. Row[4] < (int)
book_row. Row[5])
{. Tables [«Взятые_книги»].Rows. Add
(dataGridView2. CurrentRow. Cells[8].Value. ToString(), dataGridView1.
CurrentRow. Cells[0].Value. ToString(), RetDate. Value. Date.
ToString());ab_row = (DataRowView) dataGridView2. CurrentRow.
DataBoundItem;_row. Row[9] = (int) ab_row. Row[9] + 1;_row. Row[4] = (int)
book_row. Row[4] + 1;
}
}
}void dataGridView2_CursorChanged
(object sender, EventArgs e)
{
}void dataGridView2_SelectionChanged
(object sender, EventArgs e)
{filter = «»;(dataGridView2.
CurrentRow!= null)+= «Паспорт = '» + dataGridView2. CurrentRow. Cells[8].Value.
ToString() + «'»;
взятыекнигиBindingSource. Filter =
filter;
{
}void button10_Click (object sender,
EventArgs e)
{(dataGridView3. CurrentRow!= null
&& dataGridView2. CurrentRow!= null && dataGridView1.
CurrentRow!= null)
{ab_row = (DataRowView)
dataGridView2. CurrentRow. DataBoundItem;_row. Row[9] = (int) ab_row. Row[9] -
1;ind = книгиBindingSource. Find («Наименование», dataGridView3. CurrentRow.
Cells[0].Value. ToString());bo_row = (DataRowView) книгиBindingSource.
List[ind];_row. Row[4] = (int) bo_row. Row[4] - 1;. Rows. RemoveAt (dataGridView3.
CurrentRow. Index);
}
}void label5_Click (object sender,
EventArgs e)
{
}void button11_Click (object sender,
EventArgs e)
{();a = new Form7 ();.
ShowDialog();. Close();
}
}
}
3.7 Form 7 - Должники
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Text;System. Windows. Forms;WindowsApplication1
{partial class Form7:
Form
{Form7 ()
{();
}void Form7_Load (object
sender, EventArgs e)
{
// TODO: This line of
code loads data into the 'libDataSet1. Абоненты' table. You can move, or remove
it, as needed..абонентыTableAdapter. Fill (this.libDataSet1. Абоненты);
абонентыBindingSource.
Filter = «[Кол-во книг] > 0»;
}void button1_Click
(object sender, EventArgs e)
{();a = new Form6 ();.
ShowDialog();. Close();
}
}
}
Заключение
программа библиотека поиск книга
В ходе проделанной работы была
реализована программа, моделирующая работу библиотеки. Программа довольно
проста в использовании и благодаря ей можно с легкостью проводить
библиотекарские мероприятия, такие как: запись абонента в базу данных
библиотеки, изменение информации о нем по его требованиям, запись в базу данных
поступившей вновь в библиотеку книг, изменение информации о книге, запись книги
на абонента, просмотр списка должников библиотеки. Разработанная программа
может быть успешно внедрена в действующие библиотеки Вологодской области, что
позволит существенно сократить рабочее время библиотекаря.
Список источников
1. Павловская, Т.А. C#. Программирование на языке высокого уровня. Учебник для вузов/
Т.А. Павловская. - СПб.: Питер, 2009. - 432 с., ил.
. Дарахвелидзе, П.Г. Программирование в Delphi 7/ П.Г. Дарахвелидзе,
Е.П. Марков. - СПб.: БХВ-Петербург, 2003. - 784 с., ил.
. Троелсен, Эндрю Язык программирования C# 2005 и платформа.NET 2.0/ Эндрю Троелсен. -
3-е изд.: пер. с англ. М. «И.Д. Вильямс», 2007. - 1168 с., ил.
. Постолит, А.В. Visual Studio.NET: разработка приложений баз данных/ А.В. Постолит. - СПб.:
БХВ-Петербург, 2003. - 544 с., ил.
. Верма, Р.Д. Справочник по функциям Win32 API/ Р.Д. Верма. - 2-е изд.
- М.: Горячая линия-Телеком, 2005. - 551 с., ил.