2011-04-25 67 views
1

我正在尝试创建一个包含多个列的表。我试图绑定值(这是一个变量)来创建表名。我不断收到一个错误:('创建update语句时出错''near'?':syntax error'')显然,我尝试绑定它时出错。任何人都可以为我阐明这一点吗?针对iOS的Sqlite语句

- (void)addTable{ 

    NSString *cat = sourceName; 

    if(addtablestmt == nil) { 

    const char *sqlStr = "CREATE Table ? ('itemID' 'integer','itemName' 'char(50)','itemCategory' 'char(50)','itemCount' 'integer','itemDone' 'char(50)','itemNote' 'char(50)','itemOrder' 'char(50)',PRIMARY KEY (itemID))"; 


    if(sqlite3_prepare_v2(database, sqlStr, -1, &addtablestmt, NULL) != SQLITE_OK) 
     NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database)); 

    sqlite3_bind_text(addtablestmt, 1, [cat UTF8String], -1, SQLITE_TRANSIENT); 

    } 

    if(SQLITE_DONE != sqlite3_step(addtablestmt)){ 
     NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database)); 

    } 

    sqlite3_reset(addtablestmt); 

} 
+0

你确定sqlite支持这样的动态表创建吗? – Rayfleck 2011-04-25 17:38:00

+0

我认为它支持它,但我可能会在这里走错路。 – 2011-04-25 17:45:03

+0

我在这里摆脱了我的元素(多年来没有做过动态sql),但通常是构建动态查询或更新语句,而不是动态创建表。在这里打个盹,有一段惊人的编纂经验。 – Rayfleck 2011-04-25 18:38:58

回答

0

你可以尝试更多的东西一样:

NSString *sqlStr = [NSString stringWithFormat:@"CREATE Table %@ ('itemID' 'integer','itemName' 'char(50)','itemCategory' 'char(50)','itemCount' 'integer','itemDone' 'char(50)','itemNote' 'char(50)','itemOrder' 'char(50)',PRIMARY KEY (itemID))", sourceName]; 

if(sqlite3_prepare_v2(database, [sqlStr UTF8String], -1, &addtablestmt, NULL) != SQLITE_OK) 
     NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database)); 
0

不能绑定表名作为参数。如果您打算这么做,那么您需要按照Joe的建议动态创建字符串。但要小心,因为这种方法可能会导致SQL注入攻击。例如,用户可以输入名称“;从sqlite_master删除”。