Utilisation C ++ (Visual Studio) et SQLite. Comment puis-je lier une date à un paramètre?
sqlite3_stmt *statement; const char *sql = "INSERT INTO employees " "(full_name," "date_started)" " VALUES " "(@full_name," "@date_started)"; sqlite3_prepare_v2(database_, sql, -1, &statement, NULL); int parameterIndex = sqlite3_bind_parameter_index(statement, "@full_name"); sqlite3_bind_text(statement, parameterIndex, "John Smith", -1, SQLITE_TRANSIENT); parameterIndex = sqlite3_bind_parameter_index(statement, "@date_started"); // <??? what goes here ???> // I want to include the local current time, so I want to know: // 1. what's the best way to get local time in C++ // 2. and what goes here for the date binding sqlite3_step(statement); sqlite3_finalize(statement);
3 Réponses :
Vous devriez pouvoir obtenir l'heure locale à l'aide de la fonction voir http: //www.cplusplus. com / référence / clibrary / ctime / localtime / pour des informations détaillées et un exemple. p> p> localTime () code>.
Eh bien merci pour cela, mais ma question principale est de savoir comment lier cela à un paramètre SQLite.
Voici ce que j'ai imaginé. Cela fonctionne mais je suis ouvert à de meilleures méthodes.
time_t rawtime; struct tm *currentTime; time ( &rawtime ); currentTime = localtime ( &rawtime ); const int TIME_STRING_LENGTH = 20; char buffer [TIME_STRING_LENGTH]; // SQLite expected date string format is "YYYY-MM-DD HH:MM:SS" (there are others too) strftime(buffer, TIME_STRING_LENGTH, "%Y-%m-%d %H:%M:%S", currentTime); sqlite3_bind_text(statement, parameterIndex, buffer, -1, SQLITE_TRANSIENT);
Préfère utiliser gmtime code> au lieu de
localTime code> car il n'est pas sensible à l'heure d'été.
Ah je suppose que c'est probablement pourquoi mon compilateur me donnait un avertissement sur l'utilisation de localTime code>.
En fin de compte, je préfère avoir la date d'heure comme des cordes, alors je choisis cela comme la réponse. Ce n'est pas vraiment clair pour moi, ce qui est le meilleur format DateTime pour une colonne de date, mais le temps dira.
Il n'y a pas d'astuce à cela:
const char * sql = "INSERT INTO Employees(full_name, data_started) VALUES (?, ?)"; time_t time = 0x3DE43B0C; sqlite3_bind_int64(statement, 2, time);
J'ai défini ma colonne Date_Started dans ma table en tant que DateTime, qui a une affinité numérique (qui apparaît surtout la même chose que réelle). Que se passe-t-il lorsque j'utilise sqlite3_bind_text avec une chaîne de date pour insérer une date? Est-il automatiquement converti en une valeur réelle (car c'est le type de colonne)? De même avec votre exemple entier, SQLite Auto-est-il le convertir en réel?
Il sera gardé comme un entier. Si vous essayez de mettre du texte dans une colonne avec une affinité numérique, SQLite ne le convertira que si cela peut être fait sans perte et de manière réversible, sinon il le gardera en tant que texte.
Eh bien, toutes mes dates insérées via la liaison de texte se présentent dans la base de données comme texte. Je viens d'essayer votre méthode et un entier se présente. Je ne sais pas que j'aime voir un entier, cela signifie que je dois toujours appeler une fonction DateTime (date_started, 'unixepoch') code> pour voir quelle est la date. Savez-vous quelque chose sur les avantages / les inconvénients de différents types de stockage des dates dans SQLite?
C'est le compromis habituel entre l'espace de stockage et le temps de requête. Vous pouvez vérifier si appeler DateTime code> ralentit votre requête; Sinon, il serait préférable de stocker des dates de la forme entier plus compacte.