sqlite支持創(chuàng)建數(shù)據(jù)庫,如果建立多個(gè)鏈接鏈接該庫需要執(zhí)行ATTACH命令 //創(chuàng)建內(nèi)存數(shù)據(jù)庫 sqlite3 *db; sqlite3 *tmp; rc = sqlite3_open("new1.db", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); return(0); }else{ fprintf(stderr, "Opened database successfully\n"); /*執(zhí)行attach*/ rc = sqlite3_open("new2.db", &tmp); rc = sqlite3_exec(tmp,"attach 'new.db' as newdb",0,0,&zErrMsg); if( rc != SQLITE_OK ){ fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } 兩個(gè)數(shù)據(jù)庫連接db和tmp,通過attach命令連接到new1.db,但是兩個(gè)連接有不同之處。new.db存在表select,使用db查詢時(shí)執(zhí)行如下sql select * from test tmp連接通過帶有模式的查詢sql select * from newdb.test 這樣兩個(gè)連接都可以操作new1.db了。 創(chuàng)建內(nèi)存數(shù)據(jù)庫需要數(shù)據(jù)文件名改成“:memory:”,注意前后都有要分號,要不不是內(nèi)存數(shù)據(jù), //創(chuàng)建內(nèi)存數(shù)據(jù)庫 rc = sqlite3_open(":memory:", &db); if( rc ){ fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); return(0); }else{ fprintf(stderr, "Opened database successfully\n"); } 但是通過attach命令無法實(shí)現(xiàn)兩個(gè)鏈接共享一個(gè)內(nèi)存數(shù)據(jù)庫,實(shí)驗(yàn)證明attach后會(huì)新創(chuàng)建一個(gè)內(nèi)存數(shù)據(jù)庫,解決的辦法有兩個(gè): 1、將一部分內(nèi)存虛擬一個(gè)磁盤,SQLite的數(shù)據(jù)庫就放到這個(gè)虛擬磁盤中。 2、升級到最新版本的sqlite,支持多個(gè)鏈接共享內(nèi)存數(shù)據(jù)庫,詳細(xì)做法參考: https://www./inmemorydb.html
|
|