C#. Работаем с Firebird (2.5) из Visual Studio 2010
Здравствуй, уважаемый читатель. Недавно пришлось разбираться, как подружить приложение на C# с Firebird (как установить соединение с БД, как выполнять запросы). Информации по этой теме оказалось катастрофически мало как на русском, так и на английском. Кроме документации по Firebird ADO.NET Data Provider, в принципе, ничего больше нет. Разбирался в основном методом проб и ошибок. Решил все это записать в итоге, может кому интересно будет, а главное - полезно.
Делаем проект
Создадим новый проект - Windows Form Application. Затем разместим компоненты на форме (Рис.1).
Чтобы было проще ориентироваться по коду - вот названия визуальных компонентов, которые использовались:
1. tbPathToDB (TextBox)
2. tbLogin (TextBox)
3. tbPwd (TextBox)
4. btnInsert (Button)
5. btnSelect (Button)
6. btnConnect (Button)
7. btnExit (Button)
Теперь надо установить Firebird и Firebird ADO.NET Data Provider (скачиваются с официального сайта Firebird: http://firebirdsql.org/index.php?op=files ). Далее создадим тестовую базу данных и таблицу в ней, с которой будем работать в примере, например, такую:
CREATE TABLE BOOKS ( ID INTEGER NOT NULL, CAPTION VARCHAR(255));
В настройках проекта необходимо добавить ссылку (reference) на установленный Firebird ADO.NET Data Provider для того, чтобы стало возможным использовать пространство имен FirebirdSql.Data.FirebirdClient - Project -> Add reference затем на закладке Browse указать файл FirebirdSql.Data.FirebirdClient.dll
Рисунок 2. Добавляем ссылку на Firebird ADO.NET Data Provider
Приготовления закончены, можно приступать к программированию. Ниже приведен код с подробными комментариями:
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 FirebirdSql.Data.FirebirdClient; //добавляем пространство имен firebird ado.net provider, необходимое для взаимодействия с Firebird
namespace fb_test
{
public partial class FormMain : Form
{
//переменные, нужные в контексте всей программы
FbConnection fb; //fb ссылается на соединение с нашей базой данных, по-этому она должна быть доступна всем методам нашего класса
public FormMain()
{
InitializeComponent();
}
//выход из приложения
private void btnExit_Click(object sender, EventArgs e)
{
Close();
}
private void btnConnect_Click(object sender, EventArgs e) //обрабатываем событие Click кнопки "Connect"
{
//формируем connection string для последующего соединения с нашей базой данных
FbConnectionStringBuilder fb_con = new FbConnectionStringBuilder();
fb_con.Charset = "WIN1251"; //используемая кодировка
fb_con.UserID = tbLogin.Text; //логин
fb_con.Password = tbPwd.Text; //пароль
fb_con.Database = tbPathToDB.Text; //путь к файлу базы данных
fb_con.ServerType = 0; //указываем тип сервера (0 - "полноценный Firebird" (classic или super server), 1 - встроенный (embedded))
//создаем подключение
fb = new FbConnection(fb_con.ToString()); //передаем нашу строку подключения объекту класса FbConnection
fb.Open(); //открываем БД
FbDatabaseInfo fb_inf = new FbDatabaseInfo(fb); //информация о БД
//пока у объекта БД не был вызван метод Open() - никакой информации о БД не получить, будет только ошибка
MessageBox.Show("Info: " + fb_inf.ServerClass + "; " + fb_inf.ServerVersion); //выводим тип и версию используемого сервера Firebird
}
private void btnInsert_Click(object sender, EventArgs e) //обрабатываем событе Click кнопки Insert
{
//выполним запрос на вставку
FbCommand InsertSQL = new FbCommand("INSERT INTO BOOKS(ID, CAPTION) VALUES(6, 'Полное собрание сочинений Дарьи Донцовой')", fb);
if (fb.State == ConnectionState.Closed) //если соединение закрыто - откроем его; Перечисление ConnectionState содержит состояния соединения (подключено/отключено)
fb.Open();
FbTransaction fbt = fb.BeginTransaction(); //стартуем транзакцию; стартовать транзакцию можно только для открытой базы (т.е. мутод Open() уже был вызван ранее, иначе ошибка)
InsertSQL.Transaction = fbt; //необходимо проинициализить транзакцию для объекта InsertSQL
try
{
int res = InsertSQL.ExecuteNonQuery(); //для запросов, не возвращающих набор данных (insert, update, delete) надо вызывать этот метод
MessageBox.Show("SUCCESS: " + res.ToString());
fbt.Commit(); //если вставка прошла успешно - комитим транзакцию
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
InsertSQL.Dispose(); //в документации написано, что ОЧЕНЬ рекомендуется убивать объекты этого типа, если они больше не нужны
fb.Close();
}
private void btnSelect_Click(object sender, EventArgs e) //обрабатываем событие Click кнопки Select
{
//так проверять состояние соединения (активно или не активно)
if (fb.State == ConnectionState.Closed)
fb.Open();
FbTransaction fbt = fb.BeginTransaction(); //стартуем транзакцию; стартовать транзакцию можно только для открытой базы (т.е. мутод Open() уже был вызван ранее, иначе ошибка)
FbCommand SelectSQL = new FbCommand("SELECT * FROM BOOKS", fb); //задаем запрос на выборку
SelectSQL.Transaction = fbt; //необходимо проинициализить транзакцию для объекта SelectSQL
FbDataReader reader = SelectSQL.ExecuteReader(); //для запросов, которые возвращают результат в виде набора данных надо использоваться метод ExecuteReader()
string select_result = ""; //в эту переменную будем складывать результат запроса Select
try
{
while (reader.Read()) //пока не прочли все данные выполняем...
{
select_result = select_result + reader.GetInt32(0 ).ToString() + ", " + reader.GetString(1) + "\n";
}
}
finally
{
//всегда необходимо вызывать метод Close(), когда чтение данных завершено
reader.Close();
fb.Close(); //закрываем соединение, т.к. оно нам больше не нужно
}
MessageBox.Show(select_result); //выводим результат запроса
SelectSQL.Dispose(); //в документации написано, что ОЧЕНЬ рекомендуется убивать объекты этого типа, если они больше не нужны
}
}
}
Стоит подробнее рассмтреть класс FbCommand. Данный класс предоставляет следующие методы для выполнения команд в базе данных Firebird:
- ExecuteReader. Выполняет команды, которые возвращают строки.
- ExecuteNonQuery. Выполняет такие команды SQL как INSERT, DELETE, UPDATE, и выражение SET.
- ExecuteScalar. Возвращает одно значение (например, результат агрегатной функции) из базы данных.
Настоятельно рекомендуется вызвать метод Dispose() у экземпляров данного класса, после того, как они больше не нужны, чтобы освободить занятую память. На этом все.
Автор: Андрей Брюханов
- Добавить комментарий
- 53091 просмотр
Комментарии
14 комментария(ев)Дата: Втр, 23/02/2016 - 20:59
задайте вопрос на форуме. и уточните ваш вопрос.
Дата: Пнд, 06/06/2016 - 04:33
очевидно в этой строчке вместо смайлика должны быть ноль и закрытая скобка
Дата: Втр, 08/11/2016 - 01:58
Гениально, особенно вот этот кусок ]]>http://i.imgur.com/yaEe8Mq.png]]>
где вместо ангела, догадайтесь сами что.
Дата: Втр, 08/11/2016 - 02:01
На сайте сломан модуль, отвечающий за теги. Ремонту не подлежит. Админов нет, одни модеры остались. Я там поставил пробел, смайл пропал.