Код C для хранения sqlite db не хранит данные в физической памяти - PullRequest
0 голосов
/ 13 сентября 2011

Хотя эта программа отлично работает во время выполнения на моем компиляторе dev-C ++, принимая значения и отображая их снова, при следующем запуске она не открывает предыдущие базы данных, и мне приходится снова вводить данные. Данные БД введенный не сохраняется физически в памяти. Пожалуйста, помогите!

void fill(sqlite3* db, char* tbname);
void CreateDatabase(sqlite3** db);
void CreateTable(sqlite3* db, char* tbname);
void display(sqlite3* db, char* tbname);

int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i;
    for(i=0; i<argc; i++){
        printf("%s = ",azColName[i]);
        if( argv[i] )
            printf(argv[i]);
        else
            printf("NULL");
        printf("\n");
    }

    return 0;
}

void dsperr(char**db_err)
{
    if( *db_err )
    {
        printf("db_err\n");
        sqlite3_free(*db_err); // release (free) memory
        *db_err = 0; // reinitialize the caller's pointer
    }
}

void GetTablename(char* tbname)
{
    printf("Enter the table name\n");
    scanf("%s", tbname);
}

int main()
{
    while(1)
    {
        sqlite3* db = 0; // database connection
        char tbname[DBNAMESIZE];   // table name
        int done = 0;
        while(!done)
        {
            char answer[8] = {0};
            printf("\n\nPlease select one of the folowing options\n");
            printf("1. Create a new or open an existing database\n");
            printf("2. Create a new table\n");
            printf("3. Add some data\n");
            printf("4. List all data\n");
            printf("5. Quit\n");
            scanf("%1s",answer);

            switch(answer[0])
            {
            case '1':
                CreateDatabase(&db);
                break;
            case '2':
                CreateTable(db, tbname);
                break;
            case '3':
                fill(db, tbname);
                break;
            case '4':
                display(db, tbname);
                break;
            case '5':
                done = 1;
                break;
            }
        }

    sqlite3_close(db);
    }
}

void CreateDatabase(sqlite3** db)
{
    char dbname[DBNAMESIZE];
    int n;
    printf("Please enter the name of the database\n");
    scanf("%s",dbname);
    fgets(dbname,sizeof(dbname), stdin);

    if( dbname[strlen(dbname)-1] == '\n')
        dbname[strlen(dbname)-1] = '\0';
    n = sqlite3_open(dbname, db);
    if( n != SQLITE_OK )
    {
        printf("Error opening database.\n");
    }
    else
        printf("Database open ok\n");
}

void CreateTable(sqlite3* db, char* tbname)
{
    char* db_err = 0;
    int n = 0;
    char statement[255] = {0};
    GetTablename(tbname);

    if( tbname[0] == '\0' )
        return;
    sprintf(statement, "CREATE TABLE %s (id integer);", tbname);

    n = sqlite3_exec(db, statement, NULL, 0, &db_err);
    dsperr(&db_err);
    if( n != SQLITE_OK )
    {
        printf("Error executing \"%s\"\n",statement);
    }
    else
        printf("Table created successfully\n");
}

void fill(sqlite3* db, char* tbname)
{
    char* db_err = 0;
    int id;
    int n = 0;
    char buf[80];

    if( strlen(tbname) == 0)
    {
        GetTablename(tbname);
        if( tbname[0] == '\0')
            return;
    }

    printf("Enter the data into the table\n");
    scanf("%d",&id);
    sprintf(buf,"insert into %s values(%d);", tbname, id);
    n = sqlite3_exec(db, buf, NULL, 0, &db_err);
    dsperr(&db_err);

    if( n != SQLITE_OK )
    {
        printf("Error inserting value %d\n", id);
        return;
    }
}

void display(sqlite3* db, char* tbname)
{
    char* db_err = 0;
    char select[255] = {0};
    if( strlen(tbname) == 0)
    {
        GetTablename(tbname);
        if( tbname[0] == '\0' )
            return;
    }

    if( strlen(tbname) > 0)
    {
        sprintf(select, "select * from %s;", tbname);
        sqlite3_exec(db, select, callback, 0, &db_err);
        dsperr(&db_err);
    }
}

Ответы [ 3 ]

0 голосов
/ 13 сентября 2011

Насколько я вижу, dbname заполнено неправильно createdatabase.При удалении fgets(...) ниже scanf(..) как минимум создается файл базы данных с правильным именем.

0 голосов
/ 13 сентября 2011

Я не уверен, почему вы использовали

fgets(dbname,sizeof(dbname), stdin);

, но он очищает строку dbname и создает временную базу данных.если вы удалите эту строку, она создаст базу данных, как и должно быть.

Кроме того, внешний цикл while в main не нужен и не позволяет пользователю выйти из системы.

0 голосов
/ 13 сентября 2011

Я не использовал C годами, но согласно документации для sqlite3_open() на на этой странице :

Если имя файла является пустой строкой, то будет создана частная временная база данных на диске. Эта частная база данных будет автоматически удалена, как только соединение с базой данных будет закрыто.

Возможно, вы передаете пустую строку в sqlite3_open()? Похоже, вы читаете dbname дважды, один раз с scanf и один раз с fgets.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...