绑定或色谱柱索引超出范围Sqlite C
Bind or column index out of range SQLITE C++
我有错误:绑定或列索引超出范围。该程序的目的是将数据从 .mlex 文件导入到数据库中。程序的输出是我想要的,但是我要导入的每行出现错误。如果您有任何有关IMMProve我的计划的提示的建议?我对每一个绑定都有相同的错误,我不确定查询的语法。
sqlite3 *db; //Declare pointer pour la db
int check(int rc);
int main(int argc, char *argv[])
{
setlocale(LC_ALL, ""); //pour les accents
char *zErrMsg = 0;
//ouvre la db;
int rc = sqlite3_open("base.db", &db);
if (rc)
{
std::cerr << "Impossible d'ouvrir la db" << sqlite3_errmsg(db);
sqlite3_close(db);
return 0;
}
//création d'un tableau
const char *zSql = "CREATE TABLE IF NOT EXISTS FLLL(ID INTEGER PRIMARY KEY AUTOINCREMENT,Forme VARCHAR(40), Categorie VARCHAR(40), Lemme VARCHAR(40), Bloc varchar(40))";
rc = sqlite3_exec(db, zSql, NULL, NULL, &zErrMsg);
if (rc != SQLITE_OK) {
std::cerr << "SQL error :" << zErrMsg;
sqlite3_close(db);
return 0;
}
//ouvre le fichier
std::ifstream monFlux("C:/Users/Quent/OneDrive/Bureau/Dico/LEFFF/lefff-3.45.mlex", std::ios::in);
if (monFlux) std::cout << "fichier ouvert"<<std::endl;
else {
std::cout << "erreur, ouverture impossible";
monFlux.close();
return 0;
}
//lire ligne par ligne
std::string ligne;
int idx = 0;
while (std::getline(monFlux, ligne,'n'))
{
int cpt = 0;
idx++;
std::istringstream iss(ligne+'t');
std::string token;
std::cout << ligne << std::endl;
sqlite3_stmt *ppStmt1 = 0;
sqlite3_stmt *ppStmt2 = 0;
sqlite3_stmt *ppStmt3 = 0;
sqlite3_stmt *ppStmt4 = 0;
const char *pzTail = 0;
const char *zSql1 = "INSERT INTO FLLL(Forme) VALUES(?)";
const char *zSql2 = "UPDATE FLLL SET Categorie = ? WHERE ID = (?)";
const char *zSql3 = "UPDATE FLLL SET Lemme = ? WHERE ID = (?)";
const char *zSql4 = "UPDATE FLLL SET BLOC = ? WHERE ID = (?)";
if (sqlite3_prepare_v2(db, zSql1, strlen(zSql1) + 1, &ppStmt1, &pzTail) != SQLITE_OK || sqlite3_prepare_v2(db, zSql2, strlen(zSql2) + 1, &ppStmt2, &pzTail) != SQLITE_OK || sqlite3_prepare_v2(db, zSql3, strlen(zSql3) + 1, &ppStmt3, &pzTail) != SQLITE_OK || sqlite3_prepare_v2(db, zSql4, strlen(zSql4) + 1, &ppStmt4, &pzTail) != SQLITE_OK)
{
std::cerr << "db erreur :" << sqlite3_errmsg(db);
sqlite3_close(db);
return 0;
}
while (std::getline(iss, token, 't'))
{
cpt++;
const char *c = token.c_str();
switch (cpt)
{
case 1: rc = sqlite3_bind_text(ppStmt1,1,c , -1, SQLITE_STATIC);
if (rc) check(rc);
rc = sqlite3_bind_int(ppStmt1, 2, idx);
if (rc) check(rc); //error is here
rc = sqlite3_step(ppStmt1);
if (rc!=SQLITE_DONE) check(rc);
rc = sqlite3_reset(ppStmt1);
if (rc) check(rc);
break;
case 2: rc = sqlite3_bind_text(ppStmt2, 1, c, -1, SQLITE_STATIC);
if (rc) check(rc);
rc = sqlite3_bind_int(ppStmt2,2, idx);
if (rc) check(rc); //error is here
rc = sqlite3_step(ppStmt2);
if (rc != SQLITE_DONE) check(rc);
rc = sqlite3_reset(ppStmt2);
if (rc) check(rc);
break;
case 3: rc = sqlite3_bind_text(ppStmt3, 1, c, -1, SQLITE_STATIC);
if (rc) check(rc);
rc = sqlite3_bind_int(ppStmt3, 2, idx);
if (rc) check(rc); //error is here
rc = sqlite3_step(ppStmt3);
if (rc != SQLITE_DONE) check(rc);
rc = sqlite3_reset(ppStmt3);
if (rc) check(rc);
break;
case 4: rc = sqlite3_bind_text(ppStmt4, 1, c, -1, SQLITE_STATIC);
if (rc) check(rc);
rc = sqlite3_bind_int(ppStmt4,2, idx);
if (rc) check(rc); //error is here
rc = sqlite3_step(ppStmt4);
if (rc != SQLITE_DONE) check(rc);
rc = sqlite3_reset(ppStmt4);
if (rc) check(rc);
break;
default:
break;
}
//std::cout<<token<<std::endl;
}
sqlite3_finalize(ppStmt1);
sqlite3_finalize(ppStmt2);
sqlite3_finalize(ppStmt3);
sqlite3_finalize(ppStmt4);
}
std::cout << "jai mangéà";
getchar();
sqlite3_close(db);
monFlux.close();
return 0;
}
您的 INSERT
查询仅插入一列(Forme
),但是您的表有5列。
可能的解决方案可能是:
- 使用
NULL
值或
插入其他列 - 用默认值创建表。
插入NULL
这意味着更改INSERT
查询以包含其他列。
INSERT INTO FLLL(Forme, Categorie, Lemme, Bloc) VALUES (?, NULL, NULL, NULL)
注意ID
列被排除在外,因为它会自动通过SQLITE递增。
使用默认值创建表
这意味着更改您的CREATE
语句(并独自离开INSERT
查询)。
CREATE TABLE IF NOT EXISTS FLLL
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Forme VARCHAR(40) DEFAULT NULL,
Categorie VARCHAR(40) DEFAULT NULL,
Lemme VARCHAR(40) DEFAULT NULL,
Bloc VARCHAR(40) DEFAULT NULL
)
这是未经测试的,但我认为应该有效。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 查询SQLite数据库中的日期
- 尝试通过多个向量访问变量时,向量下标超出范围
- 带内存和隔离功能的SQLite
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- Qt SQLite没有查询或参数计数不匹配
- 超出范围时使用对象
- Qt SQlite无法创建表
- 绑定或色谱柱索引超出范围Sqlite C