2016-02-04 15 views
2

阅读其他几篇文章后,似乎我想要的可能是,但此刻我有一个无符号字符数组,我希望在sqlite中输入一行表。现在我知道sqlite使用UTF-8编码,所以我应该认为能够做到这一点,但我不确定。SQLite C++插入无符号字符数组

此刻我的代码不工作,我有一个表...

void PersonalDataBase::openUserDataBase() 
{ 
    int rc; 
    //table setup 
    string table = "CREATE TABLE IF NOT EXISTS USERS (" \ 
     "_id     INTEGER PRIMARY KEY NOT NULL," \ 
     "USERNAME   TEXT     NOT NULL," \ 
     "PASSWORD   TEXT," \ 
     "USERHASH   TEXT     NOT NULL," \ 
     "EVAL    TEXT     NOT NULL," \ 
     "NVAL    TEXT     NOT NULL," \ 
     "PVAL    TEXT," \ 
     "QVAL    TEXT," \ 
     "DVAL    TEXT);"; 
    sqlite3_stmt *stmt; 

    sqlite3_initialize(); 

    /* Open database */ 
    //Note rc should be checked for errors 
    rc = sqlite3_open_v2("database/data/UsersDB.db", &userDB, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); 

    //add table 
    rc = sqlite3_prepare_v2(userDB, table.c_str(), -1, &stmt, 0); 
    sqlite3_step(stmt); 
    sqlite3_finalize(stmt); 
} 

现在呼吁这我的表创建,但现在插入它...

用于插入后我的表,我创建了一个新的条目,并生成我无符号的字符数组E,d,N,p,q,然后....

 string insertQuery = "INSERT INTO USERS (USERNAME,PASSWORD,USERHASH,EVAL,NVAL,PVAL,QVAL,DVAL) " \ 
        "VALUES ('" + username + "', '" + password + "', "; 
     //set E 
     string temp1 = ""; 
     for (int i = 0; i < e -> getLength(); i++) 
     { 
      temp1 += (char) e -> getByte(i); 
     } 
     insertQuery += temp1 + "', '"; 

     //set N 
     temp1 = ""; 
     for (int i = 0; i < n -> getLength(); i++) 
     { 
      temp1 += (char) n -> getByte(i); 
     } 
     insertQuery += temp1 + "', '"; 

     //set P 
     temp1 = ""; 
     for (int i = 0; i < p -> getLength(); i++) 
     { 
      temp1 += (char) p -> getByte(i); 
     } 
     insertQuery += temp1 + "', '"; 

     //set Q 
     temp1 = ""; 
     for (int i = 0; i < q -> getLength(); i++) 
     { 
      temp1 += (char) q -> getByte(i); 
     } 
     insertQuery += temp1 + "', '"; 

     //set D 
     temp1 = ""; 
     for (int i = 0; i < d -> getLength(); i++) 
     { 
      temp1 += (char) d -> getByte(i); 
     } 
     insertQuery += temp1 + "');"; 

     //insert Key + User data into Table 
     sqlite3_prepare_v2(userDB, insertQuery.c_str(), -1, &stmt1, 0); 
     sqlite3_step(stmt1); 
     sqlite3_finalize(stmt1); 

我建我的查询,但我是很肯定的一部分我问题是我的getByte()函数r eturns一个无符号的字符,这个值可以是任何东西,它是ascii相当于可以说'或者,我认为搞乱了我的查询字符,我的问题是有没有办法,我可以直接写我的无符号字符到我的数据库?或者我应该创建一个函数,将他们的8位转换为7位,然后使用字符?然而,这仍然不能解决我可能是'和'或其他角色的问题。任何人有什么想法我应该在这里做什么?

+0

我很困惑是不是我在做什么准备语句?对不起,我是新来的sql,我以前用它作为一个类,但不是用于C++而不是用crytpographic值 –

回答

1

为了避免格式化问题,使用参数:

string insertQuery = "INSERT INTO USERS (USERNAME,PASSWORD,USERHASH,EVAL,NVAL,PVAL,QVAL,DVAL) " 
       "VALUES (?,?,?,?,?,?,?,?);"; 
err = sqlite3_prepare_v2(userDB, insertQuery.c_str(), -1, &stmt1, 0); 
// check err 
sqlite3_bind_text(stmt1, 1, username.c_str(), -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(stmt1, 2, password.c_str(), -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(stmt1, 3, e.c_str(), -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(stmt1, 4, n.c_str(), -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(stmt1, 5, p.c_str(), -1, SQLITE_TRANSIENT); 
sqlite3_bind_text(stmt1, 6, q.c_str(), -1, SQLITE_TRANSIENT); 
// or as blob: 
sqlite3_bind_blob(stmt1, 7, d.byte_ptr(), d.byte_count(), SQLITE_TRANSIENT); 
err = sqlite3_step(stmt1); 
+0

谢谢!什么是SQLITE_TRANSIENT选项呢? blob和文本有什么区别? –

+1

[Documentation](http://www.sqlite.org/c3ref/bind_blob.html)。 [斑点](https://en.wikipedia.org/wiki/Binary_large_object)。 –

相关问题