2012-07-02 21 views
2

我有一個char數組的列表,我想將所有項存儲在SQLite數據庫中,我的問題如何將字符串數組值存儲在SQLite數據庫中,其中我的字符串數組是因爲字符串數組值來自服務器,所以可以動態改變。C++:使用sqlite創建動態數據庫用於傳輸語音流

這裏我做了sqlite3插入項目通過傳遞參數,我想只是在動態使用這個數據庫..任何人都可以給我任何想法。 我是新的C++開發:

#include <iostream> 
using namespace std; 
#include "sqlite3.h" 
#include<string.h> 
#define STRING_MAX 32 

typedef struct metadata_t { 
    char userid[256]; 
    char firstname[256]; 
    char lastname[256]; 
    char username[256]; 
    char password[256]; 
    char email[256]; 
    char userphone[256]; 
    char time[256]; 
} metadata_t; 

void insertdata1(metadata_t * data); 

int main(int argc, const char *argv[]) 
{ 

    struct metadata_t *data; 
    cin >> data->userid; 
    cin >> data->firstname; 
    cin >> data->lastname; 
    cin >> data->username; 
    cin >> data->password; 
    cin >> data->email; 
    cin >> data->userphone; 
    cin >> data->time; 

    insertdata1(data); 

} 

void insertdata1(metadata_t * data) 
{ 
    sqlite3 *db; 
    sqlite3_open("test1.db", &db); 

    string createQuery = 
     "CREATE TABLE IF NOT EXISTS items (userid INTEGER PRIMARY KEY, firstname TEXT,lastname TEXT,username TEXT,password TEXT,email text,userphone INTEGER, " 
     "time TEXT NOT NULL DEFAULT (NOW()));"; 
    sqlite3_stmt *createStmt; 
    cout << "Creating Table Statement" << endl; 
    sqlite3_prepare(db, createQuery.c_str(), createQuery.size(), 
      &createStmt, NULL); 
    cout << "Stepping Table Statement" << endl; 
    if (sqlite3_step(createStmt) != SQLITE_DONE) 
     cout << "Didn't Create Table!" << endl; 

    char *a = "("; 
    char *d = ")"; 
    char *b = "'"; 
    char *c = ","; 
    char str1[1000]; 
    char *str2 = ""; 
    char *g = ";"; 
    strcpy(str1, 
      "INSERT INTO items (userid,firstname,lastname,username,password,email,userphone,time)VALUES"); 

    strcat(str1, a); 

    strcat(str1, b); 
    strcat(str1, data->userid); 
    strcat(str1, b); 
    strcat(str1, c); 
    strcat(str1, b); 
    strcat(str1, data->firstname); 
    strcat(str1, b); 
    strcat(str1, c); 
    strcat(str1, b); 
    strcat(str1, data->lastname); 
    strcat(str1, b); 
    strcat(str1, c); 
    strcat(str1, b); 
    strcat(str1, data->username); 
    strcat(str1, b); 
    strcat(str1, c); 
    strcat(str1, b); 
    strcat(str1, data->password); 
    strcat(str1, b); 
    strcat(str1, c); 
    strcat(str1, b); 
    strcat(str1, data->email); 
    strcat(str1, b); 
    strcat(str1, c); 
    strcat(str1, b); 
    strcat(str1, data->userphone); 
    strcat(str1, b); 
    strcat(str1, c); 
    strcat(str1, b); 
    strcat(str1, data->time); 
    strcat(str1, b); 
    strcat(str1, d); 
    strcat(str1, g); 

    std::string insertQuery = str1; // WORKS! 
    sqlite3_stmt *insertStmt; 
    cout << "Creating Insert Statement" << endl; 
    sqlite3_prepare(db, insertQuery.c_str(), insertQuery.size(), 
      &insertStmt, NULL); 
    cout << "Stepping Insert Statement" << endl; 
    if (sqlite3_step(insertStmt) != SQLITE_DONE) 
     cout << "Didn't Insert Item!" << endl; 

} 
+1

您是否正在尋找一種替代的實現?您的'strcat'操作可以替換爲'std :: string insertQuery =「INSERT INTO項目(用戶標識,名字,姓氏,用戶名,密碼,電子郵件,用戶電話,時間)VALUES(」; insertQuery = insertQuery +「'」+ data-> userid +「',」+「'」+ data-> firstname +「',」+「'」+ data-> lastname +「',」+「'」+ data-> username +「', 「+」'「+ data-> password +」',「+」'「+ data-> email +」',「+」'「+ data-> userphone +」',「+」'「+ data- > time +「');」;'。你不能使用'std :: string'而不是'char [256]'? –

+0

另外,在C++''typedef'中'struct'是多餘的。 '* data'是一個指向結構體的指針,應該分配內存或者更好一些,使它成爲一個棧上的變量。考慮使用''而不是'',儘管你完全可以避免它。 –

+1

sqlite建議:利用sqlite3_errmsg或函數系列中的函數來獲得更有意義的錯誤消息。你也可以使用'stderr'來代替'stdout'而不是'stdout'。您還可以添加檢查'sqlite3_open'返回值 –

回答

1

我建議使用bind variables - 他們使你的代碼更清潔,防止輸入錯誤,甚至SQL注入更多的保護。

也有不會傷害良好的生活習慣:

  • 檢查返回值每次調用後sqlite3_*功能和寫的sqlite3_errmsg()輸出stderr(= cerr),或在的情況下,日誌文件錯誤;

  • 清理完成後,我們通過在每個準備好的語句上調用sqlite3_finalize()不再使用它。

當別人稍後使用或調試您的代碼時,不遵守這些慣例會使您的業障受到影響。

所以,這裏建議insertdata1()(我希望它更乾淨和可讀性現在):

// some basic error handling 
void exit_with_sqlite_error(sqlite3 *db, const char* file, int line) 
{ 
cerr << "Error: " << sqlite3_errmsg(db) << " at " << file << ":" << line << endl; 
exit(1); 
} 

// helps to get exact location of an error 
#define EXIT_WITH_SQLITE_ERR(db) \ 
exit_with_sqlite_error(db, __FILE__, __LINE__) 

void insertdata1(metadata_t *data) 
{ 
sqlite3 *db; 
sqlite3_open("test1.db", &db); 

string createQuery = 
    "CREATE TABLE IF NOT EXISTS items (" 
    "userid INTEGER PRIMARY KEY,' 
    "firstname TEXT," 
    "lastname TEXT," 
    "username TEXT," 
    "password TEXT,' 
    "email TEXT," 
    "userphone INTEGER," 
    "time TEXT NOT NULL DEFAULT (NOW()));"; 

cout << "Creating Table Statement" << endl; 
int rc = sqlite3_exec(db, createQuery.c_str(), NULL, NULL, NULL); 
if (rc != SQLITE_OK) 
    EXIT_WITH_SQLITE_ERR(db); 

sqlite3_stmt *insertStmt = NULL; 
rc = sqlite3_prepare_v2(db, 
    "INSERT INTO items " 
    "(userid,firstname,lastname,username,password,email,userphone,time)" 
    "VALUES" 
    "(:userid,:firstname,:lastname,:username,:password,:email,:userphone,:time);", 
    -1, &insertStmt, NULL); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 

rc = sqlite3_bind_int(insertStmt, 1, atoi(data->userid)); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
rc = sqlite3_bind_text(insertStmt, 2, data->firstname, -1, SQLITE_STATIC); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
rc = sqlite3_bind_text(insertStmt, 3, data->lastname, -1, SQLITE_STATIC); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
rc = sqlite3_bind_text(insertStmt, 4, data->username, -1, SQLITE_STATIC); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
rc = sqlite3_bind_text(insertStmt, 5, data->password, -1, SQLITE_STATIC); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
rc = sqlite3_bind_text(insertStmt, 6, data->email, -1, SQLITE_STATIC); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
rc = sqlite3_bind_int(insertStmt, 7, atoi(data->userphone)); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
rc = sqlite3_bind_text(insertStmt, 8, data->time, -1, SQLITE_STATIC); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 

rc = sqlite3_step(insertStmt); 
if (rc != SQLITE_DONE && rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 

sqlite3_finalize(insertStmt); 

// call to sqlite3_close() helps to find resource leaks, because it fails 
// if you have obvious leaks, such as prepared statements not finalized 
rc = sqlite3_close(db); 
if (rc != SQLITE_OK) EXIT_WITH_SQLITE_ERR(db); 
} 
+0

感謝vond .......我想要這個代碼.. :) – Satyam