Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SQLite3] Sprawdzanie istnienia tablicy

Ostatnio zmodyfikowano 2014-03-22 09:49
Autor Wiadomość
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...:

C/C++
#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';"; // to zapytanie znalazlem w necie
   
    result = sqlite3_open( "db", & dbHandle );
    if( result != SQLITE_OK )
    {
        cout << "ERROR: " << sqlite3_errcode( dbHandle ) << endl;
        sqlite3_close( dbHandle );
        return 1;
    }
   
    // tu chcialbym sprawdzic, czy tablica istnieje
    result = sqlite3_exec( dbHandle, query, 0, 0, & errMsg ); // nie wiem czy dobrze to wykonuje
    if( result == SQLITE_OK ) // czyli jesli istnieje tablica
    {
        cout << "Tablica istnieje" << endl;
    }
    else
    {
        cout << "Tablica nie istnieje wiec tworze nowa" << endl;
        // tu tworze nowa...
        sqlite3_exec( dbHandle, "create table tab1 (pole integer, obwod integer);", 0, 0, & errMsg );
    }
   
    sqlite3_close( dbHandle );
}
P-106929
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.
P-106949
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:
C/C++
#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 ); // jakies wartosci wrzucilem
    }
   
   
    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:
C/C++
#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 ); // pobieranie liczby kolumn
   
    while( 1 )
    {
        int rows = sqlite3_step( stmt );
       
        if( rows == SQLITE_ROW ) // jesli pobrano wiersz
        {
            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; // jesli zrobione wszystkie wiersze
       
        else // jesli wystapil jakis blad
        {
            cout << "error" << endl;
            break;
        }
    } // while
}
Nie jest źle :).
P-106976
« 1 »
  Strona 1 z 1