SQLite - 如何连接来自不同数据库的表?

Ada*_*ith 93 sql database sqlite join

我有一个使用SQLite数据库的应用程序,一切都按照应有的方式工作.我现在正在添加需要第二个SQLite数据库的新功能,但我很难弄清楚如何从不同的数据库连接表.

如果有人可以帮我解决这个问题,我真的很感激!

编辑:请参阅此问题以获取示例案例,您可以在附加数据库时调整您的语言,如接受的答案中所述.

Bri*_*eon 116

如果连网激活你的SQLite版本(应该是在大多数版本),你可以使用附加其他数据库文件移动到当前连接ATTACH关键字.该上可以附加分贝的数量限制是编译时间设置(SQLITE_MAX_ATTACHED),目前默认为10,但是这也可以通过你的生成变化.全球限制为125.

attach 'database1.db' as db1;
attach 'database2.db' as db2;
Run Code Online (Sandbox Code Playgroud)

您可以使用关键字查看所有连接的数据库

.databases
Run Code Online (Sandbox Code Playgroud)

然后你应该能够做到以下几点.

select
  *
from
  db1.SomeTable a
    inner join 
  db2.SomeTable b on b.SomeColumn = a.SomeColumn;
Run Code Online (Sandbox Code Playgroud)

请注意,"[t]把数据库名main,并temp保留主数据库和数据库来保存临时表和其它临时数据对象.这两个数据库的名称存在每个数据库连接,并且不应该用于连接".

  • 用户StanleyD指出,直到他在文件名前后加上“'”(单引号)后,该命令才对他有用。我发现一样。 (2认同)

Dr.*_*Sai 5

这是完成此问题的 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;
    }

}
Run Code Online (Sandbox Code Playgroud)