Присвойте определенные данные структуре с помощью sqlite3 - PullRequest
0 голосов
/ 13 мая 2019

У меня есть эта структура в C:

typedef struct{
  char *NOMBRE;
  char *APELLIDO;
  int DNI;
  char *FECHA_NACIMIENTO;
  int TELEFONO;
  char *EMAIL;
  char *DOMICILIO;
  long N_SS ;
  long N_CUENTA ;
  char *PASSWORD;
} Usuario;

Теперь, когда у меня есть структура, я хотел бы, используя оператор SQL, назначить определенные данные из таблицы структуре.

Это мой метод:

void bd_sacarDatosUsuario(char *user) {
  sqlite3 *db;
  char *zErrMsg = 0;
  const char* data = "Callback function called";

  char sql[70];
  char sql2[10];
  char user2[10];
  strcpy(sql, "SELECT * FROM DATOS_PERSONALES WHERE DNI='");

  int rc = sqlite3_open("BD/gimud.db", &db);
  if (rc) {
    fprintf(stdout, "Can't open database: %s\n", sqlite3_errmsg(db));
  } else {
    fprintf(stdout, "Opened database successfully\n");
  }
  strcpy(sql2, "';");
  strcpy(user2, user);
  strcat(sql, user2);
  strcat(sql, sql2);

  printf("%s\n", sql);

  rc = sqlite3_exec(db, sql, callback, (void*) data, &zErrMsg);

  if (rc != SQLITE_OK) {
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);

  } else {
    fprintf(stdout, "Consulta creada con exito\n");
  }
  sqlite3_close(db);
}

Как я мог бы в функции обратного вызова назначить данные для Usuario u?Я имею в виду:

Usuario u;
u.NOMBRE = argv[0]; // and so on...

1 Ответ

0 голосов
/ 14 мая 2019

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

Если функция обратного вызова 3-го аргумента для sqlite3_exec() не равна NULL, то она вызывается для каждой строки результата, выходящей из вычисленных операторов SQL.Вы можете передать дополнительный аргумент функции callback, здесь у вас будет возможность сохранить данные из таблицы в вашу так называемую структуру Usuario.Четвертый аргумент callback служит для этой цели.

В демонстрационных целях приведенный ниже код выполняет следующие действия:

  • Открывает базу данных
  • Создает таблицу с тремя столбцами, включая поля ID, NAME и PASSWORD
  • Вставляет строку в таблицу (ID = 1, NAME = PETER, PASSWORD = ORANGE)
  • Выделяет пространство для структуры
  • Выполняет оператор выбора и ВЫЗЫВАЕТCALLBACK () функция, которая хранит данные.
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string.h>

typedef struct Usuario{
    char *name;
    char *password;
} Usuario;

int callback(void *Usuario, int argc, char **argv, char **azColName) {
    struct Usuario *tmp = (struct Usuario *)Usuario;
    char missing[] = "MISSING";
    tmp->name = (char *)malloc(sizeof(char) * strlen(argv[1]));
    tmp->name = argv[1] ? argv[1] : (char*)"NULL";
    tmp->password = (char *)malloc(sizeof(char) * strlen(argv[2]));
    tmp->password = argv[2] ? argv[2] : (char*)"NULL";
    return 0;
}


void bd_sacarDatosUsuario() {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

    // Open database
    rc = sqlite3_open("test.db", &db);
    if( rc ) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return ;
    } else {
        fprintf(stderr, "Opened database successfully\n");
    }

    /* Create table statement */
    const char *sql = "CREATE TABLE TEST("  \
    "ID INT PRIMARY KEY NOT NULL," \
    "NAME CHAR(50) NOT NULL," \
    "PASSWORD CHAR(50) NOT NULL);";
    rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);

    if( rc != SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Success\n");
    }

    // Insert test data
    sql = "INSERT INTO TEST(ID, NAME, PASSWORD) VALUES(1, \"PETER\", \"ORANGE\");";
    rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);
    if( rc != SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Success\n");
    }


    // Allocate space for the structure
    struct Usuario *u = (struct Usuario *)malloc(sizeof(struct Usuario));

    sql = "SELECT * FROM TEST";
    rc = sqlite3_exec(db, sql, callback, u, &zErrMsg);
    if( rc != SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Success\n");
    }

    sqlite3_close(db);

    printf("Hi my name is: %s with password of %s\n", u->name, u->password);
}

int main() {
    bd_sacarDatosUsuario();

}

Измените структуру в соответствии с вашими потребностями.Обратите внимание, что вы должны проверить, возвращает ли malloc значение, отличное от NULL, и, конечно, освободить его после того, как вам это не нужно.

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