Firebird встроенная поддержка нескольких пользователей - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь создать приложение, которое взаимодействует со встроенной базой данных Firebird 3.0.Мне нужно, чтобы два или более экземпляров моего приложения могли подключаться и редактировать одну и ту же базу данных одновременно.Я должен был создать часть соединения, и она работает.Когда я запускаю первый экземпляр, он подключается правильно, но когда я пытаюсь получить доступ к базе данных с помощью другого приложения, возникает эта ошибка: Error while trying to open file -Impossible to open the file. Я также пытался подключиться к другой учетной записи, например, user2 и user1 (созданная вручную с помощью isql)но безрезультатно.Я ищу в Google весь день, но ничего не нашел.Любое предложение?Заранее спасибо

Это код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using Firebird;

namespace Firebird_multiuser
{
    public partial class Form1 : Form
    {
        //private TextBox console = new TextBox();

        Firebird.Firebird conn = new Firebird.Firebird();
        public Form1()
        {
            InitializeComponent();
            input_box.Text = @"G:\Coding\oribruniv8\Firebird\Firebird_multiuser\test.fdb";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (conn.connect(input_box.Text))
                console.AppendText("Successfully connect to database\n");
            else
            {
                console.AppendText("Error during connection ...\n");
                return;
            }

        }
    }
}

Класс Firebird


using FirebirdSql.Data.FirebirdClient;
using FirebirdSql.Data.Isql;

namespace Firebird
{
    public class Firebird
    {
        FbConnectionStringBuilder csb = new FbConnectionStringBuilder();
        int pageSize = 8192;
        bool forcedWrites = true;
        bool overwrite = true;
        FbConnection conn;

        public Firebird()
        {

            csb.ClientLibrary = **correct path to fbclient.dll**;
            csb.UserID = "sysdba";
            csb.Password = "masterkey";
            csb.ServerType = FbServerType.Embedded;
        }

        public bool create(string path)
        {
            csb.Database = path;
            FbConnection.CreateDatabase(csb.ToString(), pageSize, forcedWrites, overwrite);
            this.conn = new FbConnection(csb.ToString());
            this.conn.Open();

            return this.connection_check();


        }

        public bool connect(string path)
        {
            csb.Database = path;
            this.conn = new FbConnection(csb.ToString());
            this.conn.Open();
            return this.connection_check();

        }

        public void query(string SQLquery)
        {
            this.conn.Open();
            using (var transaction = this.conn.BeginTransaction())
            using (var command = new FbCommand())
            {
                command.Connection = this.conn;
                command.Transaction = transaction;

                command.CommandText = SQLquery;

                command.ExecuteNonQuery();

                transaction.Commit();
            }
        }

        private bool connection_check()
        {
            if (this.conn.State == ConnectionState.Open)
            {
                conn.Close();
                return true;
            }
            else
            {
                return false;
            }
        }
    }
} 

1 Ответ

1 голос
/ 01 мая 2019

Если вы хотите, чтобы два или более приложений подключались к одной и той же базе данных, пришло время рассмотреть возможность установки сервера Firebird.

Тем не менее, если вы используете встроенный Firebird 3, это возможно.По умолчанию встроенный Firebird 3 требует эксклюзивного доступа к базе данных.Это можно изменить, убедившись, что firebird.conf находится в том же месте, что и ваше fbclient.dll, используемое вашим приложением, и установив для ServerMode значение SuperClassic (или ThreadedShared).

Делать это несет небольшой риск.Если база данных является общей, то все процессы должны использовать одни и те же файлы блокировки.По умолчанию это так, но если приложения имеют разные настройки переменных среды FIREBIRD_LOCK, это может привести к повреждению базы данных, поскольку каждый процесс будет считать, что у него нет претендентов на свои блокировки.

...