kamien Temat założony przez niniejszego użytkownika |
[SQLite3] Sprawdzanie istnienia tablicy » 2014-03-21 18:00:30 Mam mały problem. Po otworzeniu bazy danych i stworzeniu w niej tablicy przesyłam jakieś zapytania wypełniające tę tablicę (funkcją exec()). Gdy po raz kolejny odpalam program chciałbym sprawdzić, czy dana tablica istnieje. Jeśli istnieje, to wypisuje stosowny komunikat. Jeśli nie istnieje to tworzy nową tablicę. Próbowałem poczytać dokumentację, lecz ciężko mi było coś z niej zrozumieć. Fajnie by było, jakby ktoś pokazał na przykładzie jak to zrobić :). Próbowałem coś takiego, ale nie działa zbyt dobrze...: #include <iostream> #include <sqlite3.h> using namespace std;
int main() { sqlite3 * dbHandle; int result; char * errMsg = 0; const char * query = "select count(type) from sqlite_master where type='table' and name='tab1';"; result = sqlite3_open( "db", & dbHandle ); if( result != SQLITE_OK ) { cout << "ERROR: " << sqlite3_errcode( dbHandle ) << endl; sqlite3_close( dbHandle ); return 1; } result = sqlite3_exec( dbHandle, query, 0, 0, & errMsg ); if( result == SQLITE_OK ) { cout << "Tablica istnieje" << endl; } else { cout << "Tablica nie istnieje wiec tworze nowa" << endl; sqlite3_exec( dbHandle, "create table tab1 (pole integer, obwod integer);", 0, 0, & errMsg ); } sqlite3_close( dbHandle ); }
|
|
DejaVu |
» 2014-03-21 19:57:37 Jedna z opcji: wykonaj create table - jak się nie powiedzie to znaczy, że tablica istnieje (o ile będzie istniało miejsce na dysku i zapytanie będzie poprawne). Druga opcja: zrób selecta na tablicy systemowej SQLite-a.
/edit: Nawet zapytanie masz sensowne podane w swoim kodzie. Z tego wynika, że Twoim problemem obecnie jest pobieranie jakichkolwiek danych z bazy, a nie sprawdzenie czy tablica istnieje, bo zapytanie masz właściwe. |
|
kamien Temat założony przez niniejszego użytkownika |
» 2014-03-22 09:49:59 Dzięki za szybką odpowiedź. A więc jeśli chodzi o opcję nr 1. to coś napisałem i działa poprawnie: #include <iostream> #include <sqlite3.h> using namespace std;
int main() { sqlite3 * dbHandle; char * errMsg = 0; const char * check = "create table tab1 (pole float, obwod integer);"; const char * query = "insert into tab1 values (1, 2), (3.14, 123);"; int res; sqlite3_open( "db", & dbHandle ); res = sqlite3_exec( dbHandle, check, 0, 0, & errMsg ); if( res != SQLITE_OK ) { cout << "tablica juz istnieje" << endl; cout << "SQL error: " << errMsg << endl; } else { cout << "stworzono nowa tablice" << endl; sqlite3_exec( dbHandle, query, 0, 0, & errMsg ); } return 0; }
Natomiast jeśli chodzi o drugie rozwiązanie to nie do końca wiem, jak zrobić tego selecta. A co do odczytywania wartości z tabeli to jest z tym trochę zabawy. Coś z tym pokombinuję jeszcze, jak nic mi nie będzie wychodziło to założę odpowiedni temat. // edit: Dobra, przed chwilą trochę zmodyfikowałem poprzedni program: #include <iostream> #include <sqlite3.h> using namespace std;
void Read( sqlite3 * ); int main() { sqlite3 * dbHandle; char * errMsg = 0; const char * check = "create table tab1 (pole float, obwod integer);"; const char * query = "insert into tab1 values (1, 2), (3.14, 123);"; int res; sqlite3_open( "db", & dbHandle ); res = sqlite3_exec( dbHandle, check, 0, 0, & errMsg ); if( res != SQLITE_OK ) { cout << "SQL error: " << errMsg << endl << endl; Read( dbHandle ); return 1; } else { cout << "stworzono nowa tablice" << endl << endl; sqlite3_exec( dbHandle, query, 0, 0, & errMsg ); } Read( dbHandle ); sqlite3_close( dbHandle ); }
void Read( sqlite3 * handle ) { sqlite3_stmt * stmt; sqlite3_prepare_v2( handle, "select * from tab1;", - 1, & stmt, 0 ); int cols = sqlite3_column_count( stmt ); while( 1 ) { int rows = sqlite3_step( stmt ); if( rows == SQLITE_ROW ) { for( int col = 0; col < cols; col++ ) { const char * value =( const char * ) sqlite3_column_text( stmt, col ); ( col == 0 ?( cout << "Pole: " << value << endl ) :( cout << "Obwod: " << value << endl ) ); } cout << endl; } else if( rows == SQLITE_DONE ) break; else { cout << "error" << endl; break; } } }
Nie jest źle :). |
|
« 1 » |