Я довольно давно уже работаю с Firebird в Visual Studio и хочу поделится с вами примером кода который я постоянно использую, ну возможно с небольшими вариациями. По моему мнению код выглядит достаточно красиво.
Для новичков я расскажу как создать консольное приложение с использованием Firebird:
1. Создаем новое простое консольное приложение. По-умолчанию его код будет выглядеть так:
3. Указываем файл Firebird. Его можно скачать с сайта Firebirdsql.org
4. Дописываем в секции using код:
using FirebirdSql.Data.FirebirdClient;
5. Дописываем код main, так чтобы он принял вид:
Для новичков я расскажу как создать консольное приложение с использованием Firebird:
1. Создаем новое простое консольное приложение. По-умолчанию его код будет выглядеть так:
2. Добавляем ссылку на сборку Firebird:
4. Дописываем в секции using код:
using FirebirdSql.Data.FirebirdClient;
5. Дописываем код main, так чтобы он принял вид:
Code Snippet
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Data;
- using System.Text;
- using FirebirdSql.Data.FirebirdClient;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- // Строка подключения
- string ConStr = ""; // ваша строка подключения
- using (FbConnection fbc = new FbConnection(ConStr))
- {
- try
- {
- fbc.Open();
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message,
- System.IO.Path.GetFileName(
- System.Reflection.Assembly.GetExecutingAssembly().Location));
- return;
- }
- // Транзакция
- FbTransactionOptions fbto = new FbTransactionOptions();
- fbto.TransactionBehavior = FbTransactionBehavior.NoWait |
- FbTransactionBehavior.ReadCommitted |
- FbTransactionBehavior.RecVersion;
- FbTransaction fbt = fbc.BeginTransaction(fbto);
- // Создаем простой запрос
- string SQL = "select * from myTable Where Speed=@Speed";
- FbCommand fbcom = new FbCommand(SQL, fbc, fbt);
- fbcom.Parameters.Clear();
- fbcom.Parameters.AddWithValue("Speed", 100);
- // Создаем адаптер данных
- FbDataAdapter fbda = new FbDataAdapter(fbcom);
- DataSet ds = new DataSet();
- try
- {
- fbda.Fill(ds);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message,
- System.IO.Path.GetFileName(
- System.Reflection.Assembly.GetExecutingAssembly().Location));
- return;
- }
- finally
- {
- fbt.Rollback();
- fbc.Close();
- }
- DataTable dt = ds.Tables[0];
- if (dt.Rows.Count == 0) return;
- for (int i = 0; i < dt.Rows.Count; i++)
- {
- DataRow dr = dt.Rows[i];
- if (dr.IsNull("ID") == false)
- {
- // необходимые действия
- Int32 id = Convert.ToInt32(dr["ID"]);
- }
- }
- }
- }
- }
- }
6. Разбор полетов:
6.1 Этот пример не будет работать пока переменной ConStr не будет присвоена реальная строка подключения к базе данных.
6.2 В этом коде предусмотрен блок try-catch при подключении к базе. В случае невозможности установки соединения, программа или текущий метод завершится.
6.3 Блок кода заключен в блок using, что гарантирует высвобождение ресурсов.
6.4 Второй аргумент в методе WriteLine выводит имя текущего файла.
6.5 После подключения начинается транзакция с указанными параметрами.
6.6 Для получения данных через DataSet используется адаптер данных, однако есть возможность использовать FbDataReader, но мне кажется при работе с большими выходными наборами лучше использовтаь именно адаптер данных. Т.к.сразу после заполнения данных адаптером, соединение с базой данных можно закрыть.
6.7 В качестве примера я привел SQL код с одним параметром Speed.
6.8 После любого (ошибочного иди верного) выполнения команды Fill адаптера данных транзакция откатывается и соединение закрывается.
6.9 Возможно после сообщений об ошибках вам будет удобнее добавить команду Console.ReadLin();
Вот такой пример работы с Firebird на базе оператора Select.
А можно ли используя FirebirdSql.Data.FirebirdClient подключиться к базе на удаленном компьютере? Какая при этом должна быть строка подключения?
ОтветитьУдалитьcharacter set=WIN1251;data source=192.168.1.100;initial catalog=D:\database.fdb;user id=SYSDBA;password=masterkey
ОтветитьУдалитьВместо 192.168.1.100 - нужно указать ip адрес компьютера с сервером Firebird,
D:\database.fdb - это физический путь к базе на сервере
Логин и пароль по-умолчанию такие же
Нужна помощь по Firebird.
ОтветитьУдалитьвообщем в цикле обрабатывается несколько файлов в каждом файле куча строчек, программа виснет и через несколько секунд выдает Timeout Exceeded, перерыл кучу информации, вроде как заканчивается число подключений.
изменил код до того что перед каждой строкой в цикле стоит опен конекта, после каждого запроса стоит коммит транзакции, в конце обработки каждой строки стоит клозе конекта..не помогает..
Добрый день. Что за файлы?
УдалитьЕсли в проекте используется одна БД, то обычно нет необходимости делать несколько раз открывать и закрывать подключение.
Достаточно один раз подключиться.
файлы текстовые, в них в строках обьявления о продаже покупке квартир, обрабатывая их нарабатываю базу, ну тоетсь добавляю новые, пропускаю старые..
ОтветитьУдалитьсначала и было одно подключение на форме на событии лоад, но после зависания натыкал везде..думал поможет..кстати на другом провайдере OleDb есть параметр auto-commit вот с ним нет косяков..не виснет, но он платный для 64 разрядной винды..А что за параметры у вас в примере на транзакции может все дело вних???
На каком участке кода происходило зависание?
УдалитьСпасибо за помощь!
ОтветитьУдалитьНа очередном запросе, тоесть каждая запись в цикле проходит через несколько запросов.
ОтветитьУдалитьЕсли например пустить 5-6 файлов то они все обработаются, если выбрать файлов 20 то все, виснет, виснет всегда в одном и том же месте экспериментировал с параметром MaxPoolSize, увеличил его с 50 то 1000 обрабатывается гораздо больше файлов...потом опять виснет..
Ну в коде где у вас запросы всегдя использовать конструкцию using(fbconnection connect=new fbconnection(connectionstring)){}, тогда этой ошибки не будет
УдалитьДобрый день! Я сейчас занимаюсь парсером логов 1С, суть программы разбивать текстовые файлы на отдельные поля и записывать результат в несколько связанных таблиц в БД Firebird 2.5. Объем логов довольно большой, я столкнулся с проблемой: процесс сервера FB за два-три часа разбухает до 2-х ГБ и падает (версия х86). Я уже сломал всю голову, что такого может висеть в памяти и не давать собирать мусор. Что характерно, отключение от БД не помогает, сервер освобождает память только когда я закрываю клиентское приложение. На текущей скорости работы примерно 10-20 раз в секунду происходит создание и commit транзакции после 4-6 инсертов; update не используется сейчас вообще; select есть в двух местах, может запуститься 1-2 раза за весь цикл программы до падения сервера, при этом FbDataReader гарантированно закрывается. В каждой команде прикрутил Command.Dispose, это не помогает. Сервер держит в памяти каждый запрос, судя по графику использованной памяти. Не могу найти причину, помогите
ОтветитьУдалитьПростите за глупый вопрос... а как сформировать строку подключения к бд? FbConnectionStringBuilder как класс не обнаруживается...
ОтветитьУдалить