插入语句的语法错误
syntax error with insert statement
我正在与sqlite一起使用c/c 。下面显示的代码编译,但输入密码后,我遇到了此错误。
SQL error: near "NSERT": syntax error
我无法确定语法错误的确切位置。
代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <string>
#include <iostream>
void insertIntoTable(std::string userName,std::string password);
int main () {
std::string userName;
std::string password;
std::cout << "Enter a user name" << std::endl;
std::cin >> userName;
std::cout << "Enter a password" << std::endl;
std::cin >> password
insertIntoTable(userName,password);
}
//method to insert into table
void insertIntoTable(std::string userName,std::string password) {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
const char *sql;
int i = 1;
int j = 1;
rc = sqlite3_open("test.db", &db);
if( rc )
{
fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
exit(0);
}else
{
fprintf(stderr, "Opened database successfullyn");
}
//query
sql = "INSERT INTO Login (_id,username,password,manager_id) "
"VALUES ("+i,userName,password,j+");";
}
请帮忙。谢谢
sql = "INSERT INTO Login (_id,username,password,manager_id) "
"VALUES ("+i,userName,password,j+");";
这是胡说八道。您无法通过将非弦值值添加到C风格的字符数组或指针来构建字符串;而且逗号运算符不会将逗号附加到字符串上,而是在执行其副作用后丢弃了先前表达式的值。这意味着整个表达式等效于
sql = "INSERT..." + i;
将 i
(1)的值添加到字符串文字的地址以获取指向第二个字符的指针;因此,总体结果是NSERT INTO Login (_id,username,password,manager_id) VALUES (
您想使用std::string
。在C 11中,有方便的功能可以将数字转换为字符串:
std::string sql = "INSERT INTO Login (_id,username,password,manager_id) "
"VALUES (" + std::to_string(i) + ','
+ userName + ','
+ password + ','
+ std::to_string(j) + ");";
历史上,您需要一个字符串流
std::stringstream s;
s << "INSERT INTO Login (_id,username,password,manager_id) VALUES ("
<< i << ',' << userName << ',' << password << ',' << j << ");";
std::string sql = s.str();
所有这些答案都非常错误。SQL查询执行的绳子插值是进入注射土地的快车。没有理由要使用它。
正确的方法是使用 sqlite3_bind
在准备好的语句中使用占位符的值绑定值,即代码应该看起来像这样:
sql = "INSERT INTO Login (_id,username,password,manager_id) "
"VALUES (?, ?, ?, ?);";
sqlite3_stmt* stmt;
rc = sqlite3_prepare_v2(db, sql, strlen(sql), &stmt, nullptr);
// handle rc
// Now bind the parameters.
sqlite3_bind_int(stmt, 1, i);
sqlite3_bind_text(stmt, 2, userName.c_str(), userName.size(), SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 3, password.c_str(), password.size(), SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 4, j);
// Now execute.
我80%肯定这是应该的……不确定,因为它不是纯sql,而是..是的。
sql = "INSERT INTO `Login` (`_id`, `username`, `password`, `manager_id`) "
"VALUES ("+i+", '"+userName+"', '"+password+"', "+j+");";
看起来您的问题是值:
VALUES ("+i,userName,password,j+");";
应该是
"VALUES ("+std::to_string(i)+","+userName+","+password+","+std::to_string(j)+");";
如果您没有std :: to_string(no C 11),则需要其他方法将int转换为std :: string,例如stringstream。
您无法构建这样的字符串。
您有两个选项。使用std::string
并使用+ operator
形成string
。或者,如果您想使用char*
进行访问,请使用下面的代码
char *sql = malloc (NumberOfCharYouNeed); //allocate sufficient chars for your purpose.
sprintf (sql, "INSERT INTO Login (_id,username,password,manager_id) VALUES ("+%d%s%s%d+")",i,userName,password,j);
注意:使用后确保您免费(SQL)。
相关文章:
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- C++语法头文件错误
- 如何摆脱错误c2061;语法错误 cout?
- 语法错误:D3DX10Core 中的标识符'TEXTMETRICA'
- 错误 C2146:语法错误:标识符"A1"之前缺少","
- main.cpp(11):错误 C2059:语法错误:"字符串"
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 如何修复此 FSM C++语法错误 C3867
- 函数错误 C2059:语法错误:'>'不起作用
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- system() 返回错误语法错误:"("意外
- C++图形初始化错误(语法或丢失文件缺陷?
- 获取0:1(1):错误:语法错误,尝试编译着色器时意外$end
- Visual Studio错误:语法错误:标识符