SQLite. Как вы присоединяетесь к таблицам из разных баз данных?
У меня есть приложение, которое использует базу данных SQLite, и все работает так, как должно. Я сейчас добавляю новые функции, для которых требуется вторая база данных SQLite, но мне сложно определить, как присоединиться к таблицам из разных баз данных.
Если кто-то может помочь мне с этим, я бы очень признателен!
Изменить: См. этот вопрос для примера, который вы можете адаптировать к своему языку при прикреплении баз данных, как указано в принятом ответе.
Ответы
Ответ 1
Если ATTACH активирован в вашей сборке Sqlite (так должно быть в большинстве сборок), вы можете прикрепить другой файл базы данных к текущему соединению, используя ключевое слово ATTACH. Ограничение на количество присоединяемых дБ - это настройка времени компиляции (SQLITE_MAX_ATTACHED), в настоящее время по умолчанию она равна 10, но это также может варьироваться в зависимости от вашей сборки. Глобальный лимит составляет 125.
attach 'database1.db' as db1;
attach 'database2.db' as db2;
Вы можете увидеть все подключенные базы данных с ключевым словом
.databases
Тогда вы должны быть в состоянии сделать следующее.
select
*
from
db1.SomeTable a
inner join
db2.SomeTable b on b.SomeColumn = a.SomeColumn;
Обратите внимание, что "[t] имена баз данных main
и temp
зарезервированы для первичной базы данных и базы данных для хранения временных таблиц и других временных объектов данных. Оба этих имени базы данных существуют для каждого соединения с базой данных и не должны использоваться для вложения".
Ответ 2
Для меня
attach database database1.db as db1;
не работает
Я должен изменить его на
attach 'database1.db' as db1;
тогда вы можете увидеть все подключенные базы данных с ключевым словом
.databases
Ответ 3
Вот пример С# для завершения этого вопроса
/// <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;
}
}
Ответ 4
Ну, у меня нет большого опыта работы с SQLite, вам нужно иметь доступ к обеим базам данных в одном запросе.
У вас может быть что-то вроде:
select name from DB1.table1 as a join DB2.table2 as b where a.age = b.age;
В таких базах данных, как SQLServer, вы можете обращаться к другим базам данных в этом иерархическом порядке, это также должно работать для SQLite.
Я думаю, вы можете инициировать экземпляр sqlite с более чем 1 базой данных!