SQLite - jak łączyć tabele z różnych baz danych?

Mam aplikację, która korzysta z bazy danych SQLite i wszystko działa tak, jak powinno. Jestem teraz w trakcie dodawania nowych funkcjonalności, które wymagają drugiej bazy danych SQLite, ale mam problem z wymyśleniem, jak połączyć tabele z różnych baz danych.

Jeśli ktoś mógłby mi z tym pomóc, byłbym bardzo wdzięczny!

Edit: Zobacz to pytanie dla przykładowego przypadku możesz dostosować do swojego języka, dołączając bazy danych jako wymienione w zaakceptowanej odpowiedzi.

Author: Community, 2011-07-26

3 answers

Jeśli załącz jest aktywowany w kompilacji SQLite (powinna być w Większość kompilacji ), możesz dołączyć inny plik bazy danych do bieżącego połączenia za pomocą słowa kluczowego załącz . Limit liczby db, które mogą być dołączone jest ustawieniem czasu kompilacji( SQLITE_MAX_ATTACHED), obecnie domyślnie wynosi 10, ale to również może się różnić w zależności od posiadanej kompilacji. Globalny limit wynosi 125.

attach 'database1.db' as db1;
attach 'database2.db' as db2;

Możesz zobaczyć wszystkie połączone bazy danych z słowo kluczowe

.databases

Wtedy powinieneś być w stanie wykonać następujące czynności.

select
  *
from
  db1.SomeTable a
    inner join 
  db2.SomeTable b on b.SomeColumn = a.SomeColumn;

Zauważ, że "[t] on nazwy baz danych main i temp są zarezerwowane dla podstawowej bazy danych i bazy danych do przechowywania tymczasowych tabel i innych tymczasowych obiektów danych. Obie te nazwy baz danych istnieją dla każdego połączenia z bazą danych i nie powinny być używane do załączników".

 102
Author: Brian Gideon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-25 22:04:01

Cóż, nie mam dużego doświadczenia z SQLite musisz uzyskać dostęp do obu baz danych w jednym zapytaniu.

Możesz mieć coś takiego:

select name from DB1.table1 as a join DB2.table2 as b where a.age = b.age;

W bazach danych takich jak SQLServer możesz uzyskać dostęp do innych baz danych w ten hierarchiczny sposób, to powinno działać również dla SQLite.

Myślę, że możesz zainicjować instancję sqlite z więcej niż 1 bazami danych !

 2
Author: Yugal Jindle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-26 03:01:22

Oto przykład C#, aby wypełnić to pytanie

/// <summary>
/// attachSQL = attach 'C:\\WOI\\Daily SQL\\Attak.sqlite' as db1 */
/// path = "Path of the sqlite database file
/// sqlQuery  = @"Select A.SNo,A.MsgDate,A.ErrName,B.SNo as BSNo,B.Err as ErrAtB from Table1 as A 
///                    inner join db1.Labamba as B on 
///                    A.ErrName = B.Err";
/// </summary>
/// <param name="attachSQL"></param>
/// <param name="sqlQuery"></param>
public static DataTable GetDataTableFrom2DBFiles(string attachSQL, string sqlQuery)
{
    try
    {
        string conArtistName = "data source=" + path + ";";
        using (SQLiteConnection singleConnectionFor2DBFiles = new SQLiteConnection(conArtistName))
        {
            singleConnectionFor2DBFiles.Open();
            using (SQLiteCommand AttachCommand = new SQLiteCommand(attachSQL, singleConnectionFor2DBFiles))
            {
                AttachCommand.ExecuteNonQuery();
                using (SQLiteCommand SelectQueryCommand = new SQLiteCommand(sqlQuery, singleConnectionFor2DBFiles))
                {
                    using (DataTable dt = new DataTable())
                    {
                        using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(SelectQueryCommand))
                        {
                            adapter.AcceptChangesDuringFill = true;
                            adapter.Fill(dt);
                            return dt;
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Use Process Exception method An error occurred");
        return null;
    }

}
 2
Author: Dr.Sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-01 16:57:57