2015-09-21 19 views
0

我開始一個新項目,必須將數據從XML轉換爲dbXMLs有其自己的格式,不能用於填寫dbsqlite3列類型

我選擇使用sqlite,因爲它是一個嵌入式平臺,我需要一個輕量級庫。

我正在努力與列類型。 我寫了下面的SQL:

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

static bool exec_sql (sqlite3 *db, char *sql, bool use_callback) 
{ 
    int rc; 
    char *zErrMsg = 0; 

    // Execute SQL statement 
    if (use_callback == true) 
    { 
     rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); 
    } 
    else 
    { 
     rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg); 
    } 

    if(rc != SQLITE_OK) 
    { 
     fprintf(stderr, "SQL: %s FAIL!!!\nError: %s\n", sql, zErrMsg); 
     sqlite3_free(zErrMsg); 
     return false; 
    } 
    return true; 
} 

int main (int argc, char *argv[]) 
{ 
    xmlDoc *doc; 
    xmlNode *root_element; 
    FILE *fw; 
    int i, srcidx, next_start; 

    sqlite3 *db; 
    char *zErrMsg = 0; 
    int rc; 
    char *sql; 

    rc = sqlite3_open("Configuration.db", &db); 

    if(rc) 
    { 
     XML2DB_DEBUG_ERR("Can't open database: %s\n", sqlite3_errmsg(db)); 

    } 
    else 
    { 
     XML2DB_DEBUG_INFO("Opened database successfully\n"); 
    } 

    sql = "CREATE TABLE Table2(" \ 
     "ID   INT  NOT NULL PRIMARY KEY," \ 
     "TABLE_1_ID INT  FOREGN KEY REFERENCES Table1(ID) NOT NULL ," \ 
     "COLUMN_1 INT[512] NOT NULL,"\ 
     "COLUMN_2 TEXT  NOT NULL,"\ 
     "COLUMN_3 BOOLEAN DEFAULT FALSE);"; 

    // Execute SQL statement 
    exec_sql(db, sql, false); 

    sql = "INSERT INTO Models (ID, TABLE_1_ID, COLUMN_1, COLUMN_2, COLUMN_3) "\ 
      "VALUES (1, 1, '{1,2,3,4,5}', 'blabla', TRUE); "; 

    // Execute SQL statement 
    exec_sql(db, sql,true); 

    sql = "SELECT * FROM Table2;"; 

    // Execute SQL statement 
    exec_sql(db, sql, true); 

    sqlite3_close(db); 

    return 0; 
} 

該代碼工作很好,但現在我發現sqlite3不支持booleanarray數據類型。

我寫的,「效果很好」,因爲SELECTDBVisualizer能夠顯示數據,不給我的錯誤。

所以,問題是:

  1. 爲什麼SQL的執行以及即使數據類型,不支持並插入值不正確?
  2. *是否有一個功能可以啓用,以始終檢查插入的值是否格式良好? *
+0

你看了[文件](http://www.sqlite.org/datatype3.html)您所選擇的DB的? –

+0

@CL。是的,我做到了。在哪裏解釋說我可以用「{1,2,3,4,5}」數據設置一個clomun INT? – LPs

+0

「在SQLite中,值的數據類型與值本身相關聯,而不與其容器相關聯。」 –

回答

2

SQLite使用dynamic typing

要檢查的數據類型,使用CHECK constraints

CREATE TABLE Table2(
    ID   INTEGER PRIMARY KEY, 
    TABLE_1_ID INT  FOREIGN KEY REFERENCES Table1(ID) NOT NULL, 
    COLUMN_1 INT[512] NOT NULL 
    COLUMN_2 TEXT  NOT NULL CHECK (typeof(COLUMN_2) = 'text'), 
    COLUMN_3 BOOLEAN DEFAULT 0 CHECK (COLUMN_3 IN (0, 1)) 
); 
+0

好的。謝謝。我會檢查它。檢查數組是否有特定的方式,或者,因爲我正在修改我的代碼,所以在逗號分隔文本中存儲值是唯一方法? – LPs

+0

SQLite沒有數組,所以很難檢查一個字符串是否具有這種格式。考慮規範你的數據庫。 –