我有一个使用 SQLite 数据库的应用程序,所有东西都按照它应该的方式工作。我现在正在添加需要第二个 SQLite 数据库的新功能,但是我很难弄清楚如何联接来自不同数据库的表。
If someone can help me out with this one, I'd really appreciate it!
编辑: 参见 这个问题中的一个例子,当您按照已接受的答案附加数据库时,您可以适应您的语言。
Well, I don't have much experience with SQLite you have to access both databases in a single query.
你可以有这样的东西:
select name from DB1.table1 as a join DB2.table2 as b where a.age = b.age;
在像 SQLServer 这样的数据库中,您可以以这种层次结构的方式访问其他数据库,这也适用于 SQLite。
我认为您可以启动一个具有多个数据库的 sqlite 实例!
如果在 Sqlite 构建中,附件是 已激活(应该在 大部分构建中) ,则可以使用 附件关键字将另一个数据库文件附加到当前连接。限制数据库的数量,可以附加是一个编译时间设置(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;
请注意,数据库名称 main和 temp是为主数据库和数据库保留的,用于保存临时表和其他临时数据对象。这两个数据库名称对于每个数据库连接都存在,不应该用于附件”。
main
temp
下面是一个 C # 示例来完成这个问题
/// <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; } }