2011-11-17 40 views
2

我有兩個C程序,都使用sqlite3庫。sqlite3 - 腳本不會得到對錶的更改,除非腳本重新啓動

1 - 一個插入一行到表

2 - 而另一個具有一個while循環等待一個行被放置到相同的表(當它找到一個行程序結束)。

如果我啓動while循環程序,然後用第一個程序插入該行,則while循環程序不會看到該行。我可以在另一個終端上同時運行程序,插入後,它會發現它第一次嘗試。

我的詢問是正確的。

我是不是正確地鎖定數據庫?每個語句都使用sqlite3_close()和PRAGMA synchronous = FULL(2)關閉數據庫。

這裏是我的代碼:http://pastebin.com/qRATMJku

感謝您的幫助。

+2

是你在插入後進行提交? –

+0

我該怎麼做?我在這裏使用了c api quickstart的代碼(底部):http://www.sqlite.org/quickstart.html 這是不是提交? – cwhelms

+0

「每個語句都會用sqlite3_close()關閉數據庫」,真的嗎?即使在while循環? –

回答

0

可以嘗試以下代碼:

插入一行,如:(與第二列的值= '123')

char query[] = INSERT INTO tablename ('msg', 'sid') VALUES ('msgvalue', '123') 

將打破循環

#include <stdio.h> 
#include <sqlite3.h> 
#include <stdlib.h> 
int callback (void *a,int ac,char **av,char **column) { 
    if (ac == 2 && av[1] && atoi(av[1]) == 123) // expect av[1] to be '123' 
     *(char *) a = 1; 
} 

int main(void) { 
    sqlite3_stmt *stmt; 
    sqlite3 *handle; 
    char query[] = "SELECT * FROM tablename"; 
    char found = 0; 

    if(sqlite3_open("/tmp/sampledb.sqlite3",&handle)) 
     exit(1); 

    for(;;) { 
     sqlite3_exec(handle,query,callback,&found,NULL); 
     if (found) 
      break; 
     printf("sleeping\n"); 
     sleep(1); 
    } 
    sqlite3_close(handle); 
}